metal-orm 1.0.11 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +21 -18
  2. package/dist/decorators/index.cjs +317 -34
  3. package/dist/decorators/index.cjs.map +1 -1
  4. package/dist/decorators/index.d.cts +1 -1
  5. package/dist/decorators/index.d.ts +1 -1
  6. package/dist/decorators/index.js +317 -34
  7. package/dist/decorators/index.js.map +1 -1
  8. package/dist/index.cjs +1965 -267
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.cts +273 -23
  11. package/dist/index.d.ts +273 -23
  12. package/dist/index.js +1947 -267
  13. package/dist/index.js.map +1 -1
  14. package/dist/{select-654m4qy8.d.cts → select-CCp1oz9p.d.cts} +254 -4
  15. package/dist/{select-654m4qy8.d.ts → select-CCp1oz9p.d.ts} +254 -4
  16. package/package.json +3 -2
  17. package/src/core/ast/query.ts +40 -22
  18. package/src/core/ddl/dialects/base-schema-dialect.ts +48 -0
  19. package/src/core/ddl/dialects/index.ts +5 -0
  20. package/src/core/ddl/dialects/mssql-schema-dialect.ts +97 -0
  21. package/src/core/ddl/dialects/mysql-schema-dialect.ts +109 -0
  22. package/src/core/ddl/dialects/postgres-schema-dialect.ts +99 -0
  23. package/src/core/ddl/dialects/sqlite-schema-dialect.ts +103 -0
  24. package/src/core/ddl/introspect/mssql.ts +149 -0
  25. package/src/core/ddl/introspect/mysql.ts +99 -0
  26. package/src/core/ddl/introspect/postgres.ts +154 -0
  27. package/src/core/ddl/introspect/sqlite.ts +66 -0
  28. package/src/core/ddl/introspect/types.ts +19 -0
  29. package/src/core/ddl/introspect/utils.ts +27 -0
  30. package/src/core/ddl/schema-diff.ts +179 -0
  31. package/src/core/ddl/schema-generator.ts +229 -0
  32. package/src/core/ddl/schema-introspect.ts +32 -0
  33. package/src/core/ddl/schema-types.ts +39 -0
  34. package/src/core/dialect/abstract.ts +122 -37
  35. package/src/core/dialect/base/sql-dialect.ts +204 -0
  36. package/src/core/dialect/mssql/index.ts +125 -80
  37. package/src/core/dialect/mysql/index.ts +18 -112
  38. package/src/core/dialect/postgres/index.ts +29 -126
  39. package/src/core/dialect/sqlite/index.ts +28 -129
  40. package/src/index.ts +4 -0
  41. package/src/orm/execute.ts +25 -16
  42. package/src/orm/orm-context.ts +60 -55
  43. package/src/orm/query-logger.ts +38 -0
  44. package/src/orm/relations/belongs-to.ts +42 -26
  45. package/src/orm/relations/has-many.ts +41 -25
  46. package/src/orm/relations/many-to-many.ts +43 -27
  47. package/src/orm/unit-of-work.ts +60 -23
  48. package/src/query-builder/hydration-manager.ts +229 -25
  49. package/src/query-builder/query-ast-service.ts +27 -12
  50. package/src/query-builder/select-query-state.ts +24 -12
  51. package/src/query-builder/select.ts +58 -14
  52. package/src/schema/column.ts +206 -27
  53. package/src/schema/table.ts +89 -32
  54. package/src/schema/types.ts +8 -5
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/decorators/index.ts","../../src/schema/table.ts","../../src/orm/entity-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/ast/aggregate-functions.ts","../../src/query-builder/select-query-state.ts","../../src/query-builder/hydration-manager.ts","../../src/query-builder/relation-alias.ts","../../src/query-builder/relation-utils.ts","../../src/query-builder/hydration-planner.ts","../../src/core/ast/builders.ts","../../src/query-builder/raw-column-parser.ts","../../src/query-builder/query-ast-service.ts","../../src/query-builder/relation-projection-helper.ts","../../src/core/ast/join-node.ts","../../src/query-builder/relation-conditions.ts","../../src/core/sql/sql.ts","../../src/query-builder/relation-service.ts","../../src/query-builder/select-query-builder-deps.ts","../../src/query-builder/column-selector.ts","../../src/query-builder/relation-manager.ts","../../src/orm/hydration.ts","../../src/orm/entity-meta.ts","../../src/orm/relations/has-many.ts","../../src/orm/relations/belongs-to.ts","../../src/orm/relations/many-to-many.ts","../../src/orm/lazy-batch.ts","../../src/orm/entity.ts","../../src/orm/execute.ts","../../src/query-builder/select.ts","../../src/decorators/bootstrap.ts"],"sourcesContent":["export * from './entity.js';\nexport * from './column.js';\nexport * from './relations.js';\nexport * from './bootstrap.js';\n","import { ColumnDef } from './column.js';\r\nimport { RelationDef } from './relation.js';\r\n\r\nexport interface TableHooks {\r\n beforeInsert?(ctx: unknown, entity: any): Promise<void> | void;\r\n afterInsert?(ctx: unknown, entity: any): Promise<void> | void;\r\n beforeUpdate?(ctx: unknown, entity: any): Promise<void> | void;\r\n afterUpdate?(ctx: unknown, entity: any): Promise<void> | void;\r\n beforeDelete?(ctx: unknown, entity: any): Promise<void> | void;\r\n afterDelete?(ctx: unknown, entity: any): Promise<void> | void;\r\n}\r\n\r\n/**\r\n * Definition of a database table with its columns and relationships\r\n * @typeParam T - Type of the columns record\r\n */\r\nexport interface TableDef<T extends Record<string, ColumnDef> = Record<string, ColumnDef>> {\r\n /** Name of the table */\r\n name: string;\r\n /** Record of column definitions keyed by column name */\r\n columns: T;\r\n /** Record of relationship definitions keyed by relation name */\r\n relations: Record<string, RelationDef>;\r\n /** Optional lifecycle hooks */\r\n hooks?: TableHooks;\r\n}\r\n\r\n/**\r\n * Creates a table definition with columns and relationships\r\n * @typeParam T - Type of the columns record\r\n * @param name - Name of the table\r\n * @param columns - Record of column definitions\r\n * @param relations - Record of relationship definitions (optional)\r\n * @returns Complete table definition with runtime-filled column metadata\r\n *\r\n * @example\r\n * ```typescript\r\n * const usersTable = defineTable('users', {\r\n * id: col.primaryKey(col.int()),\r\n * name: col.varchar(255),\r\n * email: col.varchar(255)\r\n * });\r\n * ```\r\n */\r\nexport const defineTable = <T extends Record<string, ColumnDef>>(\r\n name: string,\r\n columns: T,\r\n relations: Record<string, RelationDef> = {},\r\n hooks?: TableHooks\r\n): TableDef<T> => {\r\n // Runtime mutability to assign names to column definitions for convenience\r\n const colsWithNames = Object.entries(columns).reduce((acc, [key, def]) => {\r\n (acc as any)[key] = { ...def, name: key, table: name };\r\n return acc;\r\n }, {} as T);\r\n\r\n return { name, columns: colsWithNames, relations, hooks };\r\n};\r\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 interface ColumnDefLike {\n type: ColumnType;\n args?: ColumnDef['args'];\n primary?: boolean;\n notNull?: boolean;\n}\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 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 | 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 { TableHooks } from '../schema/table.js';\nimport { setEntityTableName } from '../orm/entity-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 = <T extends new (...args: any[]) => any>(value: T) => {\n const tableName = options.tableName ?? deriveTableNameFromConstructor(value);\n setEntityTableName(value, tableName, options.hooks);\n return value;\n };\n return decorator as unknown as ClassDecorator;\n}\n","import { ColumnDef, ColumnType } from '../schema/column.js';\nimport {\n addColumnMetadata,\n EntityConstructor,\n ColumnDefLike,\n ensureEntityMetadata\n} from '../orm/entity-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 column: ColumnDefLike = {\n type: (input as ColumnOptions).type ?? (input as ColumnDef).type,\n args: (input as ColumnOptions).args ?? (input as ColumnDef).args,\n notNull: (input as ColumnOptions).notNull ?? (input as ColumnDef).notNull,\n primary: (input as ColumnOptions).primary ?? (input as ColumnDef).primary\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\nexport function Column(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n const decorator = (target: object, propertyKey: string | symbol) => {\n const propertyName = normalizePropertyName(propertyKey);\n const ctor = resolveConstructor(target);\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 as PropertyDecorator;\n}\n\nexport function PrimaryKey(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n normalized.primary = true;\n return Column(normalized);\n}\n","import { TableDef } from './table.js';\r\n\r\n/**\r\n * Types of relationships supported between tables\r\n */\r\nexport const RelationKinds = {\r\n /** One-to-many relationship */\r\n HasMany: 'HAS_MANY',\r\n /** Many-to-one relationship */\r\n BelongsTo: 'BELONGS_TO',\r\n /** Many-to-many relationship with pivot metadata */\r\n BelongsToMany: 'BELONGS_TO_MANY'\r\n} as const;\r\n\r\n/**\r\n * Type representing the supported relationship kinds\r\n */\r\nexport type RelationType = (typeof RelationKinds)[keyof typeof RelationKinds];\r\n\r\nexport type CascadeMode = 'none' | 'all' | 'persist' | 'remove' | 'link';\r\n\r\n/**\r\n * One-to-many relationship definition\r\n */\r\nexport interface HasManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.HasMany;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-one relationship definition\r\n */\r\nexport interface BelongsToRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsTo;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-many relationship definition with rich pivot metadata\r\n */\r\nexport interface BelongsToManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsToMany;\r\n target: TTarget;\r\n pivotTable: TableDef;\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Union type representing any supported relationship definition\r\n */\r\nexport type RelationDef =\r\n | HasManyRelation\r\n | BelongsToRelation\r\n | BelongsToManyRelation;\r\n\r\n/**\r\n * Creates a one-to-many relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns HasManyRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * hasMany(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const hasMany = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): HasManyRelation<TTarget> => ({\r\n type: RelationKinds.HasMany,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-one relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns BelongsToRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * belongsTo(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const belongsTo = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): BelongsToRelation<TTarget> => ({\r\n type: RelationKinds.BelongsTo,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-many relationship definition with pivot metadata\r\n * @param target - Target table\r\n * @param pivotTable - Intermediate pivot table definition\r\n * @param options - Pivot metadata configuration\r\n * @returns BelongsToManyRelation definition\r\n */\r\nexport const belongsToMany = <\r\n TTarget extends TableDef\r\n>(\r\n target: TTarget,\r\n pivotTable: TableDef,\r\n options: {\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n }\r\n): BelongsToManyRelation<TTarget> => ({\r\n type: RelationKinds.BelongsToMany,\r\n target,\r\n pivotTable,\r\n pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,\r\n pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,\r\n localKey: options.localKey,\r\n targetKey: options.targetKey,\r\n pivotPrimaryKey: options.pivotPrimaryKey,\r\n defaultPivotColumns: options.defaultPivotColumns,\r\n cascade: options.cascade\r\n});\r\n","import { CascadeMode, RelationKinds } from '../schema/relation.js';\nimport {\n addRelationMetadata,\n EntityConstructor,\n EntityOrTableTargetResolver,\n RelationMetadata\n} from '../orm/entity-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 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 = (target: object, propertyKey: string | symbol) => {\n const propertyName = normalizePropertyName(propertyKey);\n const ctor = resolveConstructor(target);\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 as PropertyDecorator;\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 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 { ColumnDef } from '../../schema/column.js';\r\nimport type { SelectQueryNode, OrderByNode } from './query.js';\r\nimport { SqlOperator } from '../sql/sql.js';\r\n\r\n/**\r\n * AST node representing a literal value\r\n */\r\nexport interface LiteralNode {\r\n type: 'Literal';\r\n /** The literal value (string, number, boolean, or null) */\r\n value: string | number | boolean | null;\r\n}\r\n\r\n/**\r\n * AST node representing a column reference\r\n */\r\nexport interface ColumnNode {\r\n type: 'Column';\r\n /** Table name the column belongs to */\r\n table: string;\r\n /** Column name */\r\n name: string;\r\n /** Optional alias for the column */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a function call\r\n */\r\nexport interface FunctionNode {\r\n type: 'Function';\r\n /** Function name (e.g., COUNT, SUM) */\r\n name: string;\r\n /** Function arguments */\r\n args: (ColumnNode | LiteralNode | JsonPathNode)[];\r\n /** Optional alias for the function result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a JSON path expression\r\n */\r\nexport interface JsonPathNode {\r\n type: 'JsonPath';\r\n /** Source column */\r\n column: ColumnNode;\r\n /** JSON path expression */\r\n path: string;\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a scalar subquery\r\n */\r\nexport interface ScalarSubqueryNode {\r\n type: 'ScalarSubquery';\r\n /** Subquery to execute */\r\n query: SelectQueryNode;\r\n /** Optional alias for the subquery result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a CASE expression\r\n */\r\nexport interface CaseExpressionNode {\r\n type: 'CaseExpression';\r\n /** WHEN-THEN conditions */\r\n conditions: { when: ExpressionNode; then: OperandNode }[];\r\n /** Optional ELSE clause */\r\n else?: OperandNode;\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a window function\r\n */\r\nexport interface WindowFunctionNode {\r\n type: 'WindowFunction';\r\n /** Window function name (e.g., ROW_NUMBER, RANK) */\r\n name: string;\r\n /** Function arguments */\r\n args: (ColumnNode | LiteralNode | JsonPathNode)[];\r\n /** Optional PARTITION BY clause */\r\n partitionBy?: ColumnNode[];\r\n /** Optional ORDER BY clause */\r\n orderBy?: OrderByNode[];\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * Union type representing any operand that can be used in expressions\r\n */\r\nexport type OperandNode =\r\n | ColumnNode\r\n | LiteralNode\r\n | FunctionNode\r\n | JsonPathNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | WindowFunctionNode;\r\n\r\nconst operandTypes = new Set<OperandNode['type']>([\r\n 'Column',\r\n 'Literal',\r\n 'Function',\r\n 'JsonPath',\r\n 'ScalarSubquery',\r\n 'CaseExpression',\r\n 'WindowFunction'\r\n]);\r\n\r\nexport const isOperandNode = (node: any): node is OperandNode => node && operandTypes.has(node.type);\r\n\r\nexport const isFunctionNode = (node: any): node is FunctionNode => node?.type === 'Function';\r\nexport const isCaseExpressionNode = (node: any): node is CaseExpressionNode => node?.type === 'CaseExpression';\r\nexport const isWindowFunctionNode = (node: any): node is WindowFunctionNode => node?.type === 'WindowFunction';\r\nexport const isExpressionSelectionNode = (\r\n node: ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode\r\n): node is FunctionNode | CaseExpressionNode | WindowFunctionNode =>\r\n isFunctionNode(node) || isCaseExpressionNode(node) || isWindowFunctionNode(node);\r\n\r\n/**\r\n * AST node representing a binary expression (e.g., column = value)\r\n */\r\nexport interface BinaryExpressionNode {\r\n type: 'BinaryExpression';\r\n /** Left operand */\r\n left: OperandNode;\r\n /** Comparison operator */\r\n operator: SqlOperator;\r\n /** Right operand */\r\n right: OperandNode;\r\n /** Optional escape character for LIKE expressions */\r\n escape?: LiteralNode;\r\n}\r\n\r\n/**\r\n * AST node representing a logical expression (AND/OR)\r\n */\r\nexport interface LogicalExpressionNode {\r\n type: 'LogicalExpression';\r\n /** Logical operator (AND or OR) */\r\n operator: 'AND' | 'OR';\r\n /** Operands to combine */\r\n operands: ExpressionNode[];\r\n}\r\n\r\n/**\r\n * AST node representing a null check expression\r\n */\r\nexport interface NullExpressionNode {\r\n type: 'NullExpression';\r\n /** Operand to check for null */\r\n left: OperandNode;\r\n /** Null check operator */\r\n operator: 'IS NULL' | 'IS NOT NULL';\r\n}\r\n\r\n/**\r\n * AST node representing an IN/NOT IN expression\r\n */\r\nexport interface InExpressionNode {\r\n type: 'InExpression';\r\n /** Left operand to check */\r\n left: OperandNode;\r\n /** IN/NOT IN operator */\r\n operator: 'IN' | 'NOT IN';\r\n /** Values to check against */\r\n right: OperandNode[];\r\n}\r\n\r\n/**\r\n * AST node representing an EXISTS/NOT EXISTS expression\r\n */\r\nexport interface ExistsExpressionNode {\r\n type: 'ExistsExpression';\r\n /** EXISTS/NOT EXISTS operator */\r\n operator: SqlOperator;\r\n /** Subquery to check */\r\n subquery: SelectQueryNode;\r\n}\r\n\r\n/**\r\n * AST node representing a BETWEEN/NOT BETWEEN expression\r\n */\r\nexport interface BetweenExpressionNode {\r\n type: 'BetweenExpression';\r\n /** Operand to check */\r\n left: OperandNode;\r\n /** BETWEEN/NOT BETWEEN operator */\r\n operator: 'BETWEEN' | 'NOT BETWEEN';\r\n /** Lower bound */\r\n lower: OperandNode;\r\n /** Upper bound */\r\n upper: OperandNode;\r\n}\r\n\r\n/**\r\n * Union type representing any supported expression node\r\n */\r\nexport type ExpressionNode =\r\n | BinaryExpressionNode\r\n | LogicalExpressionNode\r\n | NullExpressionNode\r\n | InExpressionNode\r\n | ExistsExpressionNode\r\n | BetweenExpressionNode;\r\n","import { ColumnDef } from '../../schema/column.js';\r\nimport { SelectQueryNode } from './query.js';\r\nimport { SqlOperator } from '../sql/sql.js';\r\nimport {\r\n ColumnNode,\r\n FunctionNode,\r\n LiteralNode,\r\n JsonPathNode,\r\n OperandNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n BinaryExpressionNode,\r\n ExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n BetweenExpressionNode,\r\n isOperandNode\r\n} from './expression-nodes.js';\r\n\r\n/**\r\n * Converts a primitive or existing operand into an operand node\r\n * @param value - Value or operand to normalize\r\n * @returns OperandNode representing the value\r\n */\r\nexport const valueToOperand = (value: unknown): OperandNode => {\r\n if (\r\n value === null ||\r\n value === undefined ||\r\n typeof value === 'string' ||\r\n typeof value === 'number' ||\r\n typeof value === 'boolean'\r\n ) {\r\n return { type: 'Literal', value: value === undefined ? null : value } as LiteralNode;\r\n }\r\n return value as OperandNode;\r\n};\r\n\r\nconst toNode = (col: ColumnDef | OperandNode): OperandNode => {\r\n if (isOperandNode(col)) return col as OperandNode;\r\n const def = col as ColumnDef;\r\n return { type: 'Column', table: def.table || 'unknown', name: def.name };\r\n};\r\n\r\nconst toLiteralNode = (value: string | number | boolean | null): LiteralNode => ({\r\n type: 'Literal',\r\n value\r\n});\r\n\r\nconst toOperand = (val: OperandNode | ColumnDef | string | number | boolean | null): OperandNode => {\r\n if (val === null) return { type: 'Literal', value: null };\r\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean') {\r\n return { type: 'Literal', value: val };\r\n }\r\n return toNode(val as OperandNode | ColumnDef);\r\n};\r\n\r\nexport const columnOperand = (col: ColumnDef | ColumnNode): ColumnNode => toNode(col) as ColumnNode;\r\n\r\nconst createBinaryExpression = (\r\n operator: SqlOperator,\r\n left: OperandNode | ColumnDef,\r\n right: OperandNode | ColumnDef | string | number | boolean | null,\r\n escape?: string\r\n): BinaryExpressionNode => {\r\n const node: BinaryExpressionNode = {\r\n type: 'BinaryExpression',\r\n left: toNode(left),\r\n operator,\r\n right: toOperand(right)\r\n };\r\n\r\n if (escape !== undefined) {\r\n node.escape = toLiteralNode(escape);\r\n }\r\n\r\n return node;\r\n};\r\n\r\n/**\r\n * Creates an equality expression (left = right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with equality operator\r\n */\r\nexport const eq = (left: OperandNode | ColumnDef, right: OperandNode | ColumnDef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('=', left, right);\r\n\r\n/**\r\n * Creates a not equal expression (left != right)\r\n */\r\nexport const neq = (\r\n left: OperandNode | ColumnDef,\r\n right: OperandNode | ColumnDef | string | number\r\n): BinaryExpressionNode => createBinaryExpression('!=', left, right);\r\n\r\n/**\r\n * Creates a greater-than expression (left > right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with greater-than operator\r\n */\r\nexport const gt = (left: OperandNode | ColumnDef, right: OperandNode | ColumnDef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>', left, right);\r\n\r\n/**\r\n * Creates a greater than or equal expression (left >= right)\r\n */\r\nexport const gte = (left: OperandNode | ColumnDef, right: OperandNode | ColumnDef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>=', left, right);\r\n\r\n/**\r\n * Creates a less-than expression (left < right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with less-than operator\r\n */\r\nexport const lt = (left: OperandNode | ColumnDef, right: OperandNode | ColumnDef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<', left, right);\r\n\r\n/**\r\n * Creates a less than or equal expression (left <= right)\r\n */\r\nexport const lte = (left: OperandNode | ColumnDef, right: OperandNode | ColumnDef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<=', left, right);\r\n\r\n/**\r\n * Creates a LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with LIKE operator\r\n */\r\nexport const like = (left: OperandNode | ColumnDef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a NOT LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with NOT LIKE operator\r\n */\r\nexport const notLike = (left: OperandNode | ColumnDef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('NOT LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a logical AND expression\r\n * @param operands - Expressions to combine with AND\r\n * @returns Logical expression node with AND operator\r\n */\r\nexport const and = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'AND',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates a logical OR expression\r\n * @param operands - Expressions to combine with OR\r\n * @returns Logical expression node with OR operator\r\n */\r\nexport const or = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'OR',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates an IS NULL expression\r\n * @param left - Operand to check for null\r\n * @returns Null expression node with IS NULL operator\r\n */\r\nexport const isNull = (left: OperandNode | ColumnDef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toNode(left),\r\n operator: 'IS NULL'\r\n});\r\n\r\n/**\r\n * Creates an IS NOT NULL expression\r\n * @param left - Operand to check for non-null\r\n * @returns Null expression node with IS NOT NULL operator\r\n */\r\nexport const isNotNull = (left: OperandNode | ColumnDef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toNode(left),\r\n operator: 'IS NOT NULL'\r\n});\r\n\r\nconst createInExpression = (\r\n operator: 'IN' | 'NOT IN',\r\n left: OperandNode | ColumnDef,\r\n values: (string | number | LiteralNode)[]\r\n): InExpressionNode => ({\r\n type: 'InExpression',\r\n left: toNode(left),\r\n operator,\r\n right: values.map(v => toOperand(v))\r\n});\r\n\r\n/**\r\n * Creates an IN expression (value IN list)\r\n * @param left - Operand to check\r\n * @param values - Values to check against\r\n * @returns IN expression node\r\n */\r\nexport const inList = (left: OperandNode | ColumnDef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('IN', left, values);\r\n\r\n/**\r\n * Creates a NOT IN expression (value NOT IN list)\r\n * @param left - Operand to check\r\n * @param values - Values to check against\r\n * @returns NOT IN expression node\r\n */\r\nexport const notInList = (left: OperandNode | ColumnDef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('NOT IN', left, values);\r\n\r\nconst createBetweenExpression = (\r\n operator: 'BETWEEN' | 'NOT BETWEEN',\r\n left: OperandNode | ColumnDef,\r\n lower: OperandNode | ColumnDef | string | number,\r\n upper: OperandNode | ColumnDef | string | number\r\n): BetweenExpressionNode => ({\r\n type: 'BetweenExpression',\r\n left: toNode(left),\r\n operator,\r\n lower: toOperand(lower),\r\n upper: toOperand(upper)\r\n});\r\n\r\n/**\r\n * Creates a BETWEEN expression (value BETWEEN lower AND upper)\r\n * @param left - Operand to check\r\n * @param lower - Lower bound\r\n * @param upper - Upper bound\r\n * @returns BETWEEN expression node\r\n */\r\nexport const between = (\r\n left: OperandNode | ColumnDef,\r\n lower: OperandNode | ColumnDef | string | number,\r\n upper: OperandNode | ColumnDef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('BETWEEN', left, lower, upper);\r\n\r\n/**\r\n * Creates a NOT BETWEEN expression (value NOT BETWEEN lower AND upper)\r\n * @param left - Operand to check\r\n * @param lower - Lower bound\r\n * @param upper - Upper bound\r\n * @returns NOT BETWEEN expression node\r\n */\r\nexport const notBetween = (\r\n left: OperandNode | ColumnDef,\r\n lower: OperandNode | ColumnDef | string | number,\r\n upper: OperandNode | ColumnDef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('NOT BETWEEN', left, lower, upper);\r\n\r\n/**\r\n * Creates a JSON path expression\r\n * @param col - Source column\r\n * @param path - JSON path expression\r\n * @returns JSON path node\r\n */\r\nexport const jsonPath = (col: ColumnDef | ColumnNode, path: string): JsonPathNode => ({\r\n type: 'JsonPath',\r\n column: columnOperand(col),\r\n path\r\n});\r\n\r\n/**\r\n * Creates a CASE expression\r\n * @param conditions - Array of WHEN-THEN conditions\r\n * @param elseValue - Optional ELSE value\r\n * @returns CASE expression node\r\n */\r\nexport const caseWhen = (\r\n conditions: { when: ExpressionNode; then: OperandNode | ColumnDef | string | number | boolean | null }[],\r\n elseValue?: OperandNode | ColumnDef | string | number | boolean | null\r\n): CaseExpressionNode => ({\r\n type: 'CaseExpression',\r\n conditions: conditions.map(c => ({\r\n when: c.when,\r\n then: toOperand(c.then)\r\n })),\r\n else: elseValue !== undefined ? toOperand(elseValue) : undefined\r\n});\r\n\r\n/**\r\n * Creates an EXISTS expression\r\n * @param subquery - Subquery to check for existence\r\n * @returns EXISTS expression node\r\n */\r\nexport const exists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'EXISTS',\r\n subquery\r\n});\r\n\r\n/**\r\n * Creates a NOT EXISTS expression\r\n * @param subquery - Subquery to check for non-existence\r\n * @returns NOT EXISTS expression node\r\n */\r\nexport const notExists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'NOT EXISTS',\r\n subquery\r\n});\r\n","import { ColumnDef } from '../../schema/column.js';\r\nimport { ColumnNode, FunctionNode } from './expression-nodes.js';\r\nimport { columnOperand } from './expression-builders.js';\r\n\r\nconst buildAggregate = (name: string) => (col: ColumnDef | ColumnNode): FunctionNode => ({\r\n type: 'Function',\r\n name,\r\n args: [columnOperand(col)]\r\n});\r\n\r\n/**\r\n * Creates a COUNT function expression\r\n * @param col - Column to count\r\n * @returns Function node with COUNT\r\n */\r\nexport const count = buildAggregate('COUNT');\r\n\r\n/**\r\n * Creates a SUM function expression\r\n * @param col - Column to sum\r\n * @returns Function node with SUM\r\n */\r\nexport const sum = buildAggregate('SUM');\r\n\r\n/**\r\n * Creates an AVG function expression\r\n * @param col - Column to average\r\n * @returns Function node with AVG\r\n */\r\nexport const avg = buildAggregate('AVG');\r\n","import { TableDef } from '../schema/table.js';\r\nimport { SelectQueryNode, CommonTableExpressionNode, OrderByNode } from '../core/ast/query.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode\r\n} from '../core/ast/expression.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\n\r\n/**\r\n * Node types that can be used in query projections\r\n */\r\nexport type ProjectionNode =\r\n | ColumnNode\r\n | FunctionNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | WindowFunctionNode;\r\n\r\n/**\r\n * Manages the state of a SELECT query being built\r\n */\r\nexport class SelectQueryState {\r\n /**\r\n * Table definition for the query\r\n */\r\n public readonly table: TableDef;\r\n /**\r\n * Abstract Syntax Tree (AST) representation of the query\r\n */\r\n public readonly ast: SelectQueryNode;\r\n\r\n /**\r\n * Creates a new SelectQueryState instance\r\n * @param table - Table definition\r\n * @param ast - Optional existing AST\r\n */\r\n constructor(table: TableDef, ast?: SelectQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'SelectQuery',\r\n from: { type: 'Table', name: table.name },\r\n columns: [],\r\n joins: []\r\n };\r\n }\r\n\r\n /**\r\n * Creates a new SelectQueryState with updated AST\r\n * @param nextAst - Updated AST\r\n * @returns New SelectQueryState instance\r\n */\r\n private clone(nextAst: SelectQueryNode): SelectQueryState {\r\n return new SelectQueryState(this.table, nextAst);\r\n }\r\n\r\n /**\r\n * Adds columns to the query\r\n * @param newCols - Columns to add\r\n * @returns New SelectQueryState with added columns\r\n */\r\n withColumns(newCols: ProjectionNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n columns: [...(this.ast.columns ?? []), ...newCols]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a join to the query\r\n * @param join - Join node to add\r\n * @returns New SelectQueryState with added join\r\n */\r\n withJoin(join: JoinNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n joins: [...(this.ast.joins ?? []), join]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a WHERE clause to the query\r\n * @param predicate - WHERE predicate expression\r\n * @returns New SelectQueryState with WHERE clause\r\n */\r\n withWhere(predicate: ExpressionNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n where: predicate\r\n });\r\n }\r\n\r\n /**\r\n * Adds a HAVING clause to the query\r\n * @param predicate - HAVING predicate expression\r\n * @returns New SelectQueryState with HAVING clause\r\n */\r\n withHaving(predicate: ExpressionNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n having: predicate\r\n });\r\n }\r\n\r\n /**\r\n * Adds GROUP BY columns to the query\r\n * @param columns - Columns to group by\r\n * @returns New SelectQueryState with GROUP BY clause\r\n */\r\n withGroupBy(columns: ColumnNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n groupBy: [...(this.ast.groupBy ?? []), ...columns]\r\n });\r\n }\r\n\r\n /**\r\n * Adds ORDER BY clauses to the query\r\n * @param orderBy - ORDER BY nodes\r\n * @returns New SelectQueryState with ORDER BY clause\r\n */\r\n withOrderBy(orderBy: OrderByNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n orderBy: [...(this.ast.orderBy ?? []), ...orderBy]\r\n });\r\n }\r\n\r\n /**\r\n * Adds DISTINCT columns to the query\r\n * @param columns - Columns to make distinct\r\n * @returns New SelectQueryState with DISTINCT clause\r\n */\r\n withDistinct(columns: ColumnNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n distinct: [...(this.ast.distinct ?? []), ...columns]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param limit - Maximum number of rows to return\r\n * @returns New SelectQueryState with LIMIT clause\r\n */\r\n withLimit(limit: number): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n limit\r\n });\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param offset - Number of rows to skip\r\n * @returns New SelectQueryState with OFFSET clause\r\n */\r\n withOffset(offset: number): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n offset\r\n });\r\n }\r\n\r\n /**\r\n * Adds a Common Table Expression (CTE) to the query\r\n * @param cte - CTE node to add\r\n * @returns New SelectQueryState with CTE\r\n */\r\n withCte(cte: CommonTableExpressionNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n ctes: [...(this.ast.ctes ?? []), cte]\r\n });\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { RelationDef } from '../schema/relation.js';\r\nimport { SelectQueryNode, HydrationPlan } from '../core/ast/query.js';\r\nimport { HydrationPlanner } from './hydration-planner.js';\r\nimport { SelectQueryState, ProjectionNode } from './select-query-state.js';\r\n\r\n/**\r\n * Manages hydration planning for query results\r\n */\r\nexport class HydrationManager {\r\n /**\r\n * Creates a new HydrationManager instance\r\n * @param table - Table definition\r\n * @param planner - Hydration planner\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly planner: HydrationPlanner\r\n ) {}\r\n\r\n /**\r\n * Creates a new HydrationManager with updated planner\r\n * @param nextPlanner - Updated hydration planner\r\n * @returns New HydrationManager instance\r\n */\r\n private clone(nextPlanner: HydrationPlanner): HydrationManager {\r\n return new HydrationManager(this.table, nextPlanner);\r\n }\r\n\r\n /**\r\n * Handles column selection for hydration planning\r\n * @param state - Current query state\r\n * @param newColumns - Newly selected columns\r\n * @returns Updated HydrationManager with captured columns\r\n */\r\n onColumnsSelected(state: SelectQueryState, newColumns: ProjectionNode[]): HydrationManager {\r\n const updated = this.planner.captureRootColumns(newColumns);\r\n return this.clone(updated);\r\n }\r\n\r\n /**\r\n * Handles relation inclusion for hydration planning\r\n * @param state - Current query state\r\n * @param relation - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for the relation\r\n * @param targetColumns - Target columns to include\r\n * @returns Updated HydrationManager with included relation\r\n */\r\n onRelationIncluded(\r\n state: SelectQueryState,\r\n relation: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n targetColumns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationManager {\r\n const withRoots = this.planner.captureRootColumns(state.ast.columns);\r\n const next = withRoots.includeRelation(relation, relationName, aliasPrefix, targetColumns, pivot);\r\n return this.clone(next);\r\n }\r\n\r\n /**\r\n * Applies hydration plan to the AST\r\n * @param ast - Query AST to modify\r\n * @returns AST with hydration metadata\r\n */\r\n applyToAst(ast: SelectQueryNode): SelectQueryNode {\r\n const plan = this.planner.getPlan();\r\n if (!plan) return ast;\r\n return {\r\n ...ast,\r\n meta: {\r\n ...(ast.meta || {}),\r\n hydration: plan\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan\r\n * @returns Hydration plan or undefined if none exists\r\n */\r\n getPlan(): HydrationPlan | undefined {\r\n return this.planner.getPlan();\r\n }\r\n}\r\n","/**\n * Separator used when projecting relational columns\n */\nconst RELATION_SEPARATOR = '__';\n\n/**\n * Parts of a relation alias\n */\nexport interface RelationAliasParts {\n /**\n * Relation name (left side of the separator)\n */\n relationName: string;\n /**\n * Column name (right side of the separator)\n */\n columnName: string;\n}\n\n/**\n * Builds a relation alias from the relation name and column name components.\n */\nexport const makeRelationAlias = (relationName: string, columnName: string): string =>\n `${relationName}${RELATION_SEPARATOR}${columnName}`;\n\n/**\n * Parses a relation alias into its relation/column components.\n * Returns `null` when the alias does not follow the `relation__column` pattern.\n */\nexport const parseRelationAlias = (alias: string): RelationAliasParts | null => {\n const idx = alias.indexOf(RELATION_SEPARATOR);\n if (idx === -1) return null;\n return {\n relationName: alias.slice(0, idx),\n columnName: alias.slice(idx + RELATION_SEPARATOR.length)\n };\n};\n\n/**\n * Determines whether an alias represents a relation column by checking the `__` convention.\n */\nexport const isRelationAlias = (alias?: string): boolean =>\n !!alias && alias.includes(RELATION_SEPARATOR);\n","import { BelongsToManyRelation } from '../schema/relation.js';\r\n\r\n/**\r\n * Builds a default set of pivot columns, excluding keys used for joins.\r\n */\r\nexport const buildDefaultPivotColumns = (\r\n rel: BelongsToManyRelation,\r\n pivotPk: string\r\n): string[] => {\r\n const excluded = new Set([pivotPk, rel.pivotForeignKeyToRoot, rel.pivotForeignKeyToTarget]);\r\n return Object.keys(rel.pivotTable.columns).filter(col => !excluded.has(col));\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { ProjectionNode } from './select-query-state.js';\r\nimport { HydrationPlan, HydrationRelationPlan } from '../core/ast/query.js';\r\nimport { isRelationAlias } from './relation-alias.js';\r\nimport { buildDefaultPivotColumns } from './relation-utils.js';\r\n\r\n/**\r\n * Finds the primary key column name for a table\r\n * @param table - Table definition\r\n * @returns Name of the primary key column, defaults to 'id'\r\n */\r\nexport const findPrimaryKey = (table: TableDef): string => {\r\n const pk = Object.values(table.columns).find(c => c.primary);\r\n return pk?.name || 'id';\r\n};\r\n\r\n/**\r\n * Manages hydration planning for query results\r\n */\r\nexport class HydrationPlanner {\r\n /**\r\n * Creates a new HydrationPlanner instance\r\n * @param table - Table definition\r\n * @param plan - Optional existing hydration plan\r\n */\r\n constructor(private readonly table: TableDef, private readonly plan?: HydrationPlan) { }\r\n\r\n /**\r\n * Captures root table columns for hydration planning\r\n * @param columns - Columns to capture\r\n * @returns Updated HydrationPlanner with captured columns\r\n */\r\n captureRootColumns(columns: ProjectionNode[]): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const rootCols = new Set(currentPlan.rootColumns);\r\n let changed = false;\r\n\r\n columns.forEach(node => {\r\n if (node.type !== 'Column') return;\r\n if (node.table !== this.table.name) return;\r\n\r\n const alias = node.alias || node.name;\r\n if (isRelationAlias(alias)) return;\r\n if (!rootCols.has(alias)) {\r\n rootCols.add(alias);\r\n changed = true;\r\n }\r\n });\r\n\r\n if (!changed) return this;\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n rootColumns: Array.from(rootCols)\r\n });\r\n }\r\n\r\n /**\r\n * Includes a relation in the hydration plan\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Updated HydrationPlanner with included relation\r\n */\r\n includeRelation(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const relations = currentPlan.relations.filter(r => r.name !== relationName);\r\n relations.push(this.buildRelationPlan(rel, relationName, aliasPrefix, columns, pivot));\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n relations\r\n });\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan\r\n * @returns Current hydration plan or undefined\r\n */\r\n getPlan(): HydrationPlan | undefined {\r\n return this.plan;\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan or creates a default one\r\n * @returns Current hydration plan or default plan\r\n */\r\n private getPlanOrDefault(): HydrationPlan {\r\n return this.plan ?? buildDefaultHydrationPlan(this.table);\r\n }\r\n\r\n /**\r\n * Builds a relation plan for hydration\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Hydration relation plan\r\n */\r\n private buildRelationPlan(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationRelationPlan {\r\n switch (rel.type) {\r\n case RelationKinds.HasMany: {\r\n const localKey = rel.localKey || findPrimaryKey(this.table);\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsTo: {\r\n const localKey = rel.localKey || findPrimaryKey(rel.target);\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsToMany: {\r\n const many = rel as BelongsToManyRelation;\r\n const localKey = many.localKey || findPrimaryKey(this.table);\r\n const targetPk = many.targetKey || findPrimaryKey(many.target);\r\n const pivotPk = many.pivotPrimaryKey || findPrimaryKey(many.pivotTable);\r\n const pivotAliasPrefix = pivot?.aliasPrefix ?? `${aliasPrefix}_pivot`;\r\n const pivotColumns =\r\n pivot?.columns ??\r\n many.defaultPivotColumns ??\r\n buildDefaultPivotColumns(many, pivotPk);\r\n\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: many.target.name,\r\n targetPrimaryKey: targetPk,\r\n foreignKey: many.pivotForeignKeyToRoot,\r\n localKey,\r\n columns,\r\n pivot: {\r\n table: many.pivotTable.name,\r\n primaryKey: pivotPk,\r\n aliasPrefix: pivotAliasPrefix,\r\n columns: pivotColumns\r\n }\r\n };\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Builds a default hydration plan for a table\r\n * @param table - Table definition\r\n * @returns Default hydration plan\r\n */\r\nconst buildDefaultHydrationPlan = (table: TableDef): HydrationPlan => ({\r\n rootTable: table.name,\r\n rootPrimaryKey: findPrimaryKey(table),\r\n rootColumns: [],\r\n relations: []\r\n});\r\n","import { ColumnDef } from '../../schema/column.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { ColumnNode } from './expression-nodes.js';\r\nimport { TableNode } from './query.js';\r\n\r\n/**\r\n * Builds or normalizes a column AST node from a column definition or existing node\r\n * @param table - Table definition providing a default table name\r\n * @param column - Column definition or existing column node\r\n */\r\nexport const buildColumnNode = (table: TableDef, column: ColumnDef | ColumnNode): ColumnNode => {\r\n if ((column as ColumnNode).type === 'Column') {\r\n return column as ColumnNode;\r\n }\r\n\r\n const def = column as ColumnDef;\r\n return {\r\n type: 'Column',\r\n table: def.table || table.name,\r\n name: def.name\r\n };\r\n};\r\n\r\n/**\r\n * Builds column AST nodes for a list of column names\r\n * @param table - Table definition providing the table name\r\n * @param names - Column names\r\n */\r\nexport const buildColumnNodes = (table: TableDef, names: string[]): ColumnNode[] =>\r\n names.map(name => ({\r\n type: 'Column',\r\n table: table.name,\r\n name\r\n }));\r\n\r\n/**\r\n * Builds a table AST node for the provided table definition\r\n * @param table - Table definition\r\n */\r\nexport const createTableNode = (table: TableDef): TableNode => ({\r\n type: 'Table',\r\n name: table.name\r\n});\r\n","import { ColumnNode } from '../core/ast/expression.js';\r\nimport { CommonTableExpressionNode } from '../core/ast/query.js';\r\n\r\n/**\r\n * Best-effort helper that tries to convert a raw column expression into a `ColumnNode`.\r\n * This parser is intentionally limited; use it only for simple references or function calls.\r\n */\r\nexport const parseRawColumn = (\r\n col: string,\r\n tableName: string,\r\n ctes?: CommonTableExpressionNode[]\r\n): ColumnNode => {\r\n if (col.includes('(')) {\r\n const [fn, rest] = col.split('(');\r\n const colName = rest.replace(')', '');\r\n const [table, name] = colName.includes('.') ? colName.split('.') : [tableName, colName];\r\n return { type: 'Column', table, name, alias: col };\r\n }\r\n\r\n if (col.includes('.')) {\r\n const [potentialCteName, columnName] = col.split('.');\r\n const hasCte = ctes?.some(cte => cte.name === potentialCteName);\r\n\r\n if (hasCte) {\r\n return { type: 'Column', table: tableName, name: col };\r\n }\r\n\r\n return { type: 'Column', table: potentialCteName, name: columnName };\r\n }\r\n\r\n return { type: 'Column', table: tableName, name: col };\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { SelectQueryNode, CommonTableExpressionNode } from '../core/ast/query.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n ScalarSubqueryNode,\r\n and,\r\n isExpressionSelectionNode\r\n} from '../core/ast/expression.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\nimport { SelectQueryState, ProjectionNode } from './select-query-state.js';\r\nimport { OrderDirection } from '../core/sql/sql.js';\r\nimport { parseRawColumn } from './raw-column-parser.js';\r\n\r\n/**\r\n * Result of column selection operation\r\n */\r\nexport interface ColumnSelectionResult {\r\n /**\r\n * Updated query state\r\n */\r\n state: SelectQueryState;\r\n /**\r\n * Columns that were added\r\n */\r\n addedColumns: ProjectionNode[];\r\n}\r\n\r\n/**\r\n * Service for manipulating query AST (Abstract Syntax Tree)\r\n */\r\nexport class QueryAstService {\r\n /**\r\n * Creates a new QueryAstService instance\r\n * @param table - Table definition\r\n * @param state - Current query state\r\n */\r\n constructor(private readonly table: TableDef, private readonly state: SelectQueryState) {}\r\n\r\n /**\r\n * Selects columns for the query\r\n * @param columns - Columns to select (key: alias, value: column definition or expression)\r\n * @returns Column selection result with updated state and added columns\r\n */\r\n select(\r\n columns: Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>\r\n ): ColumnSelectionResult {\r\n const existingAliases = new Set(\r\n this.state.ast.columns.map(c => (c as ColumnNode).alias || (c as ColumnNode).name)\r\n );\r\n\r\n const newCols = Object.entries(columns).reduce<ProjectionNode[]>((acc, [alias, val]) => {\r\n if (existingAliases.has(alias)) return acc;\r\n\r\n if (isExpressionSelectionNode(val)) {\r\n acc.push({ ...(val as FunctionNode | CaseExpressionNode | WindowFunctionNode), alias } as ProjectionNode);\r\n return acc;\r\n }\r\n\r\n const colDef = val as ColumnDef;\r\n acc.push({\r\n type: 'Column',\r\n table: colDef.table || this.table.name,\r\n name: colDef.name,\r\n alias\r\n } as ColumnNode);\r\n return acc;\r\n }, []);\r\n\r\n const nextState = this.state.withColumns(newCols);\r\n return { state: nextState, addedColumns: newCols };\r\n }\r\n\r\n /**\r\n * Selects raw column expressions (best-effort parser for simple references/functions)\r\n * @param cols - Raw column expressions\r\n * @returns Column selection result with updated state and added columns\r\n */\r\n selectRaw(cols: string[]): ColumnSelectionResult {\r\n const newCols = cols.map(col => parseRawColumn(col, this.table.name, this.state.ast.ctes));\r\n const nextState = this.state.withColumns(newCols);\r\n return { state: nextState, addedColumns: newCols };\r\n }\r\n\r\n /**\r\n * Adds a Common Table Expression (CTE) to the query\r\n * @param name - Name of the CTE\r\n * @param query - Query for the CTE\r\n * @param columns - Optional column names for the CTE\r\n * @param recursive - Whether the CTE is recursive\r\n * @returns Updated query state with CTE\r\n */\r\n withCte(name: string, query: SelectQueryNode, columns?: string[], recursive = false): SelectQueryState {\r\n const cte: CommonTableExpressionNode = {\r\n type: 'CommonTableExpression',\r\n name,\r\n query,\r\n columns,\r\n recursive\r\n };\r\n\r\n return this.state.withCte(cte);\r\n }\r\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param alias - Alias for the subquery\r\n * @param query - Subquery to select\r\n * @returns Updated query state with subquery selection\r\n */\r\n selectSubquery(alias: string, query: SelectQueryNode): SelectQueryState {\r\n const node: ScalarSubqueryNode = { type: 'ScalarSubquery', query, alias };\r\n return this.state.withColumns([node]);\r\n }\r\n\r\n /**\r\n * Adds a JOIN clause to the query\r\n * @param join - Join node to add\r\n * @returns Updated query state with JOIN\r\n */\r\n withJoin(join: JoinNode): SelectQueryState {\r\n return this.state.withJoin(join);\r\n }\r\n\r\n /**\r\n * Adds a WHERE clause to the query\r\n * @param expr - Expression for the WHERE clause\r\n * @returns Updated query state with WHERE clause\r\n */\r\n withWhere(expr: ExpressionNode): SelectQueryState {\r\n const combined = this.combineExpressions(this.state.ast.where, expr);\r\n return this.state.withWhere(combined);\r\n }\r\n\r\n /**\r\n * Adds a GROUP BY clause to the query\r\n * @param col - Column to group by\r\n * @returns Updated query state with GROUP BY clause\r\n */\r\n withGroupBy(col: ColumnDef | ColumnNode): SelectQueryState {\r\n const node = buildColumnNode(this.table, col);\r\n return this.state.withGroupBy([node]);\r\n }\r\n\r\n /**\r\n * Adds a HAVING clause to the query\r\n * @param expr - Expression for the HAVING clause\r\n * @returns Updated query state with HAVING clause\r\n */\r\n withHaving(expr: ExpressionNode): SelectQueryState {\r\n const combined = this.combineExpressions(this.state.ast.having, expr);\r\n return this.state.withHaving(combined);\r\n }\r\n\r\n /**\r\n * Adds an ORDER BY clause to the query\r\n * @param col - Column to order by\r\n * @param direction - Order direction (ASC/DESC)\r\n * @returns Updated query state with ORDER BY clause\r\n */\r\n withOrderBy(col: ColumnDef | ColumnNode, direction: OrderDirection): SelectQueryState {\r\n const node = buildColumnNode(this.table, col);\r\n return this.state.withOrderBy([{ type: 'OrderBy', column: node, direction }]);\r\n }\r\n\r\n /**\r\n * Adds a DISTINCT clause to the query\r\n * @param cols - Columns to make distinct\r\n * @returns Updated query state with DISTINCT clause\r\n */\r\n withDistinct(cols: ColumnNode[]): SelectQueryState {\r\n return this.state.withDistinct(cols);\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param limit - Maximum number of rows to return\r\n * @returns Updated query state with LIMIT clause\r\n */\r\n withLimit(limit: number): SelectQueryState {\r\n return this.state.withLimit(limit);\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param offset - Number of rows to skip\r\n * @returns Updated query state with OFFSET clause\r\n */\r\n withOffset(offset: number): SelectQueryState {\r\n return this.state.withOffset(offset);\r\n }\r\n\r\n /**\r\n * Combines expressions with AND operator\r\n * @param existing - Existing expression\r\n * @param next - New expression to combine\r\n * @returns Combined expression\r\n */\r\n private combineExpressions(existing: ExpressionNode | undefined, next: ExpressionNode): ExpressionNode {\r\n return existing ? and(existing, next) : next;\r\n }\r\n\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { ColumnNode } from '../core/ast/expression.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { isRelationAlias } from './relation-alias.js';\r\n\r\n/**\r\n * Result of a relation operation\r\n */\r\nexport interface RelationResult {\r\n /**\r\n * Updated query state\r\n */\r\n state: SelectQueryState;\r\n /**\r\n * Updated hydration manager\r\n */\r\n hydration: HydrationManager;\r\n}\r\n\r\n/**\r\n * Callback function for selecting columns\r\n */\r\ntype SelectColumnsCallback = (\r\n state: SelectQueryState,\r\n hydration: HydrationManager,\r\n columns: Record<string, ColumnDef>\r\n) => RelationResult;\r\n\r\n/**\r\n * Helper class for managing relation projections in queries\r\n */\r\nexport class RelationProjectionHelper {\r\n /**\r\n * Creates a new RelationProjectionHelper instance\r\n * @param table - Table definition\r\n * @param selectColumns - Callback for selecting columns\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly selectColumns: SelectColumnsCallback\r\n ) {}\r\n\r\n /**\r\n * Ensures base projection is included in the query\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n * @returns Relation result with updated state and hydration\r\n */\r\n ensureBaseProjection(state: SelectQueryState, hydration: HydrationManager): RelationResult {\r\n const primaryKey = findPrimaryKey(this.table);\r\n\r\n if (!this.hasBaseProjection(state)) {\r\n return this.selectColumns(state, hydration, this.getBaseColumns());\r\n }\r\n\r\n if (primaryKey && !this.hasPrimarySelected(state, primaryKey) && this.table.columns[primaryKey]) {\r\n return this.selectColumns(state, hydration, {\r\n [primaryKey]: this.table.columns[primaryKey]\r\n });\r\n }\r\n\r\n return { state, hydration };\r\n }\r\n\r\n /**\r\n * Checks if base projection exists in the query\r\n * @param state - Current query state\r\n * @returns True if base projection exists\r\n */\r\n private hasBaseProjection(state: SelectQueryState): boolean {\r\n return state.ast.columns.some(col => !isRelationAlias((col as ColumnNode).alias));\r\n }\r\n\r\n /**\r\n * Checks if primary key is selected in the query\r\n * @param state - Current query state\r\n * @param primaryKey - Primary key name\r\n * @returns True if primary key is selected\r\n */\r\n private hasPrimarySelected(state: SelectQueryState, primaryKey: string): boolean {\r\n return state.ast.columns.some(col => {\r\n const alias = (col as ColumnNode).alias;\r\n const name = alias || (col as ColumnNode).name;\r\n return !isRelationAlias(alias) && name === primaryKey;\r\n });\r\n }\r\n\r\n /**\r\n * Gets all base columns for the table\r\n * @returns Record of all table columns\r\n */\r\n private getBaseColumns(): Record<string, ColumnDef> {\r\n return Object.keys(this.table.columns).reduce((acc, key) => {\r\n acc[key] = (this.table.columns as Record<string, ColumnDef>)[key];\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n }\r\n}\r\n","import { JoinNode } from './join.js';\r\nimport { ExpressionNode } from './expression.js';\r\nimport { JoinKind } from '../sql/sql.js';\r\n\r\n/**\r\n * Creates a JoinNode ready for AST insertion.\r\n * Centralizing this avoids copy/pasted object literals when multiple services need to synthesize joins.\r\n */\r\nexport const createJoinNode = (\r\n kind: JoinKind,\r\n tableName: string,\r\n condition: ExpressionNode,\r\n relationName?: string\r\n): JoinNode => ({\r\n type: 'Join',\r\n kind,\r\n table: { type: 'Table', name: tableName },\r\n condition,\r\n relationName\r\n});\r\n","import { TableDef } from '../schema/table.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { ExpressionNode, eq, and } from '../core/ast/expression.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\nimport { JoinKind } from '../core/sql/sql.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\n\r\n/**\r\n * Utility function to handle unreachable code paths\r\n * @param value - Value that should never occur\r\n * @throws Error indicating unhandled relation type\r\n */\r\nconst assertNever = (value: never): never => {\r\n throw new Error(`Unhandled relation type: ${JSON.stringify(value)}`);\r\n};\r\n\r\n/**\r\n * Builds the base condition for a relation join\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @returns Expression node representing the join condition\r\n */\r\nconst baseRelationCondition = (root: TableDef, relation: RelationDef): ExpressionNode => {\r\n const defaultLocalKey =\r\n relation.type === RelationKinds.HasMany\r\n ? findPrimaryKey(root)\r\n : findPrimaryKey(relation.target);\r\n const localKey = relation.localKey || defaultLocalKey;\r\n\r\n switch (relation.type) {\r\n case RelationKinds.HasMany:\r\n return eq(\r\n { type: 'Column', table: relation.target.name, name: relation.foreignKey },\r\n { type: 'Column', table: root.name, name: localKey }\r\n );\r\n case RelationKinds.BelongsTo:\r\n return eq(\r\n { type: 'Column', table: relation.target.name, name: localKey },\r\n { type: 'Column', table: root.name, name: relation.foreignKey }\r\n );\r\n case RelationKinds.BelongsToMany:\r\n throw new Error('BelongsToMany relations do not support the standard join condition builder');\r\n default:\r\n return assertNever(relation);\r\n }\r\n};\r\n\r\n/**\r\n * Builds the join nodes required to include a BelongsToMany relation.\r\n */\r\nexport const buildBelongsToManyJoins = (\r\n root: TableDef,\r\n relationName: string,\r\n relation: BelongsToManyRelation,\r\n joinKind: JoinKind,\r\n extra?: ExpressionNode\r\n): JoinNode[] => {\r\n const rootKey = relation.localKey || findPrimaryKey(root);\r\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\r\n\r\n const pivotCondition = eq(\r\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToRoot },\r\n { type: 'Column', table: root.name, name: rootKey }\r\n );\r\n\r\n const pivotJoin = createJoinNode(joinKind, relation.pivotTable.name, pivotCondition);\r\n\r\n let targetCondition: ExpressionNode = eq(\r\n { type: 'Column', table: relation.target.name, name: targetKey },\r\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToTarget }\r\n );\r\n\r\n if (extra) {\r\n targetCondition = and(targetCondition, extra);\r\n }\r\n\r\n const targetJoin = createJoinNode(\r\n joinKind,\r\n relation.target.name,\r\n targetCondition,\r\n relationName\r\n );\r\n\r\n return [pivotJoin, targetJoin];\r\n};\r\n\r\n/**\r\n * Builds a relation join condition with optional extra conditions\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @param extra - Optional additional expression to combine with AND\r\n * @returns Expression node representing the complete join condition\r\n */\r\nexport const buildRelationJoinCondition = (\r\n root: TableDef,\r\n relation: RelationDef,\r\n extra?: ExpressionNode\r\n): ExpressionNode => {\r\n const base = baseRelationCondition(root, relation);\r\n return extra ? and(base, extra) : base;\r\n};\r\n\r\n/**\r\n * Builds a relation correlation condition for subqueries\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @returns Expression node representing the correlation condition\r\n */\r\nexport const buildRelationCorrelation = (root: TableDef, relation: RelationDef): ExpressionNode => {\r\n return baseRelationCondition(root, relation);\r\n};\r\n","/**\r\n * SQL keywords used in query generation\r\n */\r\nexport const SQL_KEYWORDS = {\r\n /** SELECT clause keyword */\r\n SELECT: 'SELECT',\r\n /** FROM clause keyword */\r\n FROM: 'FROM',\r\n /** WHERE clause keyword */\r\n WHERE: 'WHERE',\r\n /** JOIN keyword */\r\n JOIN: 'JOIN',\r\n /** INNER JOIN keyword */\r\n INNER_JOIN: 'INNER JOIN',\r\n /** LEFT JOIN keyword */\r\n LEFT_JOIN: 'LEFT JOIN',\r\n /** RIGHT JOIN keyword */\r\n RIGHT_JOIN: 'RIGHT JOIN',\r\n /** ORDER BY clause keyword */\r\n ORDER_BY: 'ORDER BY',\r\n /** GROUP BY clause keyword */\r\n GROUP_BY: 'GROUP BY',\r\n /** HAVING clause keyword */\r\n HAVING: 'HAVING',\r\n /** DISTINCT keyword */\r\n DISTINCT: 'DISTINCT',\r\n /** EXISTS operator */\r\n EXISTS: 'EXISTS',\r\n /** NOT EXISTS operator */\r\n NOT_EXISTS: 'NOT EXISTS'\r\n} as const;\r\n\r\n/**\r\n * SQL operators used in query conditions\r\n */\r\nexport const SQL_OPERATORS = {\n /** Equality operator */\n EQUALS: '=',\n /** Not equals operator */\n NOT_EQUALS: '!=',\n /** Greater than operator */\n GREATER_THAN: '>',\n /** Greater than or equal operator */\n GREATER_OR_EQUAL: '>=',\n /** Less than operator */\n LESS_THAN: '<',\n /** Less than or equal operator */\n LESS_OR_EQUAL: '<=',\n /** LIKE pattern matching operator */\n LIKE: 'LIKE',\n /** NOT LIKE pattern matching operator */\n NOT_LIKE: 'NOT LIKE',\n /** IN membership operator */\n IN: 'IN',\n /** NOT IN membership operator */\n NOT_IN: 'NOT IN',\n /** BETWEEN range operator */\n BETWEEN: 'BETWEEN',\n /** NOT BETWEEN range operator */\n NOT_BETWEEN: 'NOT BETWEEN',\n /** IS NULL null check operator */\n IS_NULL: 'IS NULL',\n /** IS NOT NULL null check operator */\n IS_NOT_NULL: 'IS NOT NULL',\n /** Logical AND operator */\n AND: 'AND',\n /** Logical OR operator */\n OR: 'OR',\n /** EXISTS operator */\n EXISTS: 'EXISTS',\n /** NOT EXISTS operator */\n NOT_EXISTS: 'NOT EXISTS'\n} as const;\n\r\n/**\r\n * Type representing any supported SQL operator\r\n */\r\nexport type SqlOperator = (typeof SQL_OPERATORS)[keyof typeof SQL_OPERATORS];\r\n\r\n/**\r\n * Types of SQL joins supported\r\n */\r\nexport const JOIN_KINDS = {\r\n /** INNER JOIN type */\r\n INNER: 'INNER',\r\n /** LEFT JOIN type */\r\n LEFT: 'LEFT',\r\n /** RIGHT JOIN type */\r\n RIGHT: 'RIGHT',\r\n /** CROSS JOIN type */\r\n CROSS: 'CROSS'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported join kind\r\n */\r\nexport type JoinKind = (typeof JOIN_KINDS)[keyof typeof JOIN_KINDS];\r\n\r\n/**\r\n * Ordering directions for result sorting\r\n */\r\nexport const ORDER_DIRECTIONS = {\r\n /** Ascending order */\r\n ASC: 'ASC',\r\n /** Descending order */\r\n DESC: 'DESC'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported order direction\r\n */\r\nexport type OrderDirection = (typeof ORDER_DIRECTIONS)[keyof typeof ORDER_DIRECTIONS];\r\n\r\n/**\r\n * Supported database dialects\r\n */\r\nexport const SUPPORTED_DIALECTS = {\r\n /** MySQL database dialect */\r\n MYSQL: 'mysql',\r\n /** SQLite database dialect */\r\n SQLITE: 'sqlite',\r\n /** Microsoft SQL Server dialect */\r\n MSSQL: 'mssql',\r\n /** PostgreSQL database dialect */\r\n POSTGRES: 'postgres'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported database dialect\r\n */\r\nexport type DialectName = (typeof SUPPORTED_DIALECTS)[keyof typeof SUPPORTED_DIALECTS];\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n and\r\n} from '../core/ast/expression.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { RelationProjectionHelper } from './relation-projection-helper.js';\r\nimport type { RelationResult } from './relation-projection-helper.js';\r\nimport {\r\n buildRelationJoinCondition,\r\n buildRelationCorrelation,\r\n buildBelongsToManyJoins\r\n} from './relation-conditions.js';\r\nimport { JoinKind, JOIN_KINDS } from '../core/sql/sql.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\nimport { makeRelationAlias } from './relation-alias.js';\r\nimport { buildDefaultPivotColumns } from './relation-utils.js';\r\n\r\n/**\r\n * Service for handling relation operations (joins, includes, etc.)\r\n */\r\nexport class RelationService {\r\n private readonly projectionHelper: RelationProjectionHelper;\r\n\r\n /**\r\n * Creates a new RelationService instance\r\n * @param table - Table definition\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly state: SelectQueryState,\r\n private readonly hydration: HydrationManager,\r\n private readonly createQueryAstService: (table: TableDef, state: SelectQueryState) => QueryAstService\r\n ) {\r\n this.projectionHelper = new RelationProjectionHelper(table, (state, hydration, columns) =>\r\n this.selectColumns(state, hydration, columns)\r\n );\r\n }\r\n\r\n /**\r\n * Joins a relation to the query\r\n * @param relationName - Name of the relation to join\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Relation result with updated state and hydration\r\n */\r\n joinRelation(\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): RelationResult {\r\n const nextState = this.withJoin(this.state, relationName, joinKind, extraCondition);\r\n return { state: nextState, hydration: this.hydration };\r\n }\r\n\r\n /**\r\n * Matches records based on a relation with an optional predicate\r\n * @param relationName - Name of the relation to match\r\n * @param predicate - Optional predicate expression\r\n * @returns Relation result with updated state and hydration\r\n */\r\n match(\r\n relationName: string,\r\n predicate?: ExpressionNode\r\n ): RelationResult {\r\n const joined = this.joinRelation(relationName, JOIN_KINDS.INNER, predicate);\r\n const pk = findPrimaryKey(this.table);\r\n const distinctCols: ColumnNode[] = [{ type: 'Column', table: this.table.name, name: pk }];\r\n const existingDistinct = joined.state.ast.distinct ? joined.state.ast.distinct : [];\r\n const nextState = this.astService(joined.state).withDistinct([...existingDistinct, ...distinctCols]);\r\n return { state: nextState, hydration: joined.hydration };\r\n }\r\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Relation result with updated state and hydration\r\n */\r\n include(relationName: string, options?: RelationIncludeOptions): RelationResult {\r\n let state = this.state;\r\n let hydration = this.hydration;\r\n\r\n const relation = this.getRelation(relationName);\r\n const aliasPrefix = options?.aliasPrefix ?? relationName;\r\n const alreadyJoined = state.ast.joins.some(j => j.relationName === relationName);\r\n\r\n if (!alreadyJoined) {\r\n const joined = this.joinRelation(relationName, options?.joinKind ?? JOIN_KINDS.LEFT, options?.filter);\r\n state = joined.state;\r\n }\r\n\r\n const projectionResult = this.projectionHelper.ensureBaseProjection(state, hydration);\r\n state = projectionResult.state;\r\n hydration = projectionResult.hydration;\r\n\r\n const targetColumns = options?.columns?.length\r\n ? options.columns\r\n : Object.keys(relation.target.columns);\r\n\r\n const buildTypedSelection = (\r\n columns: Record<string, ColumnDef>,\r\n prefix: string,\r\n keys: string[],\r\n missingMsg: (col: string) => string\r\n ) : Record<string, ColumnDef> => {\r\n return keys.reduce((acc, key) => {\r\n const def = columns[key];\r\n if (!def) {\r\n throw new Error(missingMsg(key));\r\n }\r\n acc[makeRelationAlias(prefix, key)] = def;\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n };\r\n\r\n const targetSelection = buildTypedSelection(\r\n relation.target.columns as Record<string, ColumnDef>,\r\n aliasPrefix,\r\n targetColumns,\r\n key => `Column '${key}' not found on relation '${relationName}'`\r\n );\r\n\r\n if (relation.type !== RelationKinds.BelongsToMany) {\r\n const relationSelectionResult = this.selectColumns(state, hydration, targetSelection);\r\n state = relationSelectionResult.state;\r\n hydration = relationSelectionResult.hydration;\r\n\r\n hydration = hydration.onRelationIncluded(\r\n state,\r\n relation,\r\n relationName,\r\n aliasPrefix,\r\n targetColumns\r\n );\r\n\r\n return { state, hydration };\r\n }\r\n\r\n const many = relation as BelongsToManyRelation;\r\n const pivotAliasPrefix = options?.pivot?.aliasPrefix ?? `${aliasPrefix}_pivot`;\r\n const pivotPk = many.pivotPrimaryKey || findPrimaryKey(many.pivotTable);\r\n const pivotColumns =\r\n options?.pivot?.columns ??\r\n many.defaultPivotColumns ??\r\n buildDefaultPivotColumns(many, pivotPk);\r\n\r\n const pivotSelection = buildTypedSelection(\r\n many.pivotTable.columns as Record<string, ColumnDef>,\r\n pivotAliasPrefix,\r\n pivotColumns,\r\n key => `Column '${key}' not found on pivot table '${many.pivotTable.name}'`\r\n );\r\n\r\n const combinedSelection = {\r\n ...targetSelection,\r\n ...pivotSelection\r\n };\r\n\r\n const relationSelectionResult = this.selectColumns(state, hydration, combinedSelection);\r\n state = relationSelectionResult.state;\r\n hydration = relationSelectionResult.hydration;\r\n\r\n hydration = hydration.onRelationIncluded(\r\n state,\r\n relation,\r\n relationName,\r\n aliasPrefix,\r\n targetColumns,\r\n { aliasPrefix: pivotAliasPrefix, columns: pivotColumns }\r\n );\r\n\r\n return { state, hydration };\r\n }\r\n\r\n /**\r\n * Applies relation correlation to a query AST\r\n * @param relationName - Name of the relation\r\n * @param ast - Query AST to modify\r\n * @returns Modified query AST with relation correlation\r\n */\r\n applyRelationCorrelation(\r\n relationName: string,\r\n ast: SelectQueryNode\r\n ): SelectQueryNode {\r\n const relation = this.getRelation(relationName);\r\n const correlation = buildRelationCorrelation(this.table, relation);\r\n const whereInSubquery = ast.where\r\n ? and(correlation, ast.where)\r\n : correlation;\r\n\r\n return {\r\n ...ast,\r\n where: whereInSubquery\r\n };\r\n }\r\n\r\n /**\r\n * Creates a join node for a relation\r\n * @param state - Current query state\r\n * @param relationName - Name of the relation\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query state with join\r\n */\r\n private withJoin(\r\n state: SelectQueryState,\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryState {\r\n const relation = this.getRelation(relationName);\r\n if (relation.type === RelationKinds.BelongsToMany) {\r\n const joins = buildBelongsToManyJoins(\r\n this.table,\r\n relationName,\r\n relation as BelongsToManyRelation,\r\n joinKind,\r\n extraCondition\r\n );\r\n return joins.reduce((current, join) => this.astService(current).withJoin(join), state);\r\n }\r\n\r\n const condition = buildRelationJoinCondition(this.table, relation, extraCondition);\r\n const joinNode = createJoinNode(joinKind, relation.target.name, condition, relationName);\r\n\r\n return this.astService(state).withJoin(joinNode);\r\n }\r\n\r\n /**\r\n * Selects columns for a relation\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n * @param columns - Columns to select\r\n * @returns Relation result with updated state and hydration\r\n */\r\n private selectColumns(\r\n state: SelectQueryState,\r\n hydration: HydrationManager,\r\n columns: Record<string, ColumnDef>\r\n ): RelationResult {\r\n const { state: nextState, addedColumns } = this.astService(state).select(columns);\r\n return {\r\n state: nextState,\r\n hydration: hydration.onColumnsSelected(nextState, addedColumns)\r\n };\r\n }\r\n\r\n /**\r\n * Gets a relation definition by name\r\n * @param relationName - Name of the relation\r\n * @returns Relation definition\r\n * @throws Error if relation is not found\r\n */\r\n private getRelation(relationName: string): RelationDef {\r\n const relation = this.table.relations[relationName];\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.table.name}'`);\r\n }\r\n\r\n return relation;\r\n }\r\n\r\n /**\r\n * Creates a QueryAstService instance\r\n * @param state - Current query state\r\n * @returns QueryAstService instance\r\n */\r\n private astService(state: SelectQueryState = this.state): QueryAstService {\r\n return this.createQueryAstService(this.table, state);\r\n }\r\n}\r\n\r\nexport type { RelationResult } from './relation-projection-helper.js';\r\n","import { TableDef } from '../schema/table.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { HydrationPlanner } from './hydration-planner.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { RelationService } from './relation-service.js';\r\n\r\n/**\r\n * Context for query building operations\r\n */\r\nexport interface SelectQueryBuilderContext {\r\n /**\r\n * Current query state\r\n */\r\n readonly state: SelectQueryState;\r\n /**\r\n * Hydration manager for the query\r\n */\r\n readonly hydration: HydrationManager;\r\n}\r\n\r\n/**\r\n * Dependencies for query builder operations\r\n */\r\nexport interface SelectQueryBuilderDependencies {\r\n /**\r\n * Creates a new query state\r\n * @param table - Table definition\r\n * @returns New query state\r\n */\r\n createState: (table: TableDef) => SelectQueryState;\r\n /**\r\n * Creates a new hydration manager\r\n * @param table - Table definition\r\n * @returns New hydration manager\r\n */\r\n createHydration: (table: TableDef) => HydrationManager;\r\n /**\r\n * Creates a new hydration planner\r\n * @param table - Table definition\r\n * @returns Hydration planner\r\n */\r\n createHydrationPlanner: (table: TableDef) => HydrationPlanner;\r\n /**\r\n * Creates a new query AST service\r\n * @param table - Table definition\r\n * @param state - Query state\r\n * @returns New query AST service\r\n */\r\n createQueryAstService: (table: TableDef, state: SelectQueryState) => QueryAstService;\r\n /**\r\n * Creates a new relation service\r\n * @param table - Table definition\r\n * @param state - Query state\r\n * @param hydration - Hydration manager\r\n * @returns New relation service\r\n */\r\n createRelationService: (\r\n table: TableDef,\r\n state: SelectQueryState,\r\n hydration: HydrationManager\r\n ) => RelationService;\r\n}\r\n\r\n/**\r\n * Environment for query builder operations\r\n */\r\nexport interface SelectQueryBuilderEnvironment {\r\n /**\r\n * Table definition\r\n */\r\n readonly table: TableDef;\r\n /**\r\n * Query builder dependencies\r\n */\r\n readonly deps: SelectQueryBuilderDependencies;\r\n}\r\n\r\n/**\r\n * Default implementations for query builder dependencies\r\n */\r\nconst defaultCreateQueryAstService = (table: TableDef, state: SelectQueryState) => new QueryAstService(table, state);\r\nconst defaultCreateHydrationPlanner = (table: TableDef) => new HydrationPlanner(table);\r\n\r\nconst defaultCreateHydration = (table: TableDef, plannerFactory: (table: TableDef) => HydrationPlanner) =>\r\n new HydrationManager(table, plannerFactory(table));\r\n\r\n/**\r\n * Resolves query builder dependencies by merging overrides with internal defaults\r\n * @param overrides - Partial overrides for dependency factories\r\n */\r\nexport const resolveSelectQueryBuilderDependencies = (\r\n overrides: Partial<SelectQueryBuilderDependencies> = {}\r\n): SelectQueryBuilderDependencies => {\r\n const createQueryAstService = overrides.createQueryAstService ?? defaultCreateQueryAstService;\r\n const createHydrationPlanner = overrides.createHydrationPlanner ?? defaultCreateHydrationPlanner;\r\n const createHydration =\r\n overrides.createHydration ?? (table => defaultCreateHydration(table, createHydrationPlanner));\r\n const createRelationService =\r\n overrides.createRelationService ??\r\n ((table, state, hydration) => new RelationService(table, state, hydration, createQueryAstService));\r\n\r\n return {\r\n createState: overrides.createState ?? (table => new SelectQueryState(table)),\r\n createHydration,\r\n createHydrationPlanner,\r\n createQueryAstService,\r\n createRelationService\r\n };\r\n};\r\n\r\nexport const defaultSelectQueryBuilderDependencies = resolveSelectQueryBuilderDependencies();\r\n","import { ColumnDef } from '../schema/column.js';\r\nimport { CaseExpressionNode, ColumnNode, FunctionNode, WindowFunctionNode } from '../core/ast/expression.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';\r\n\r\n/**\r\n * Type for column selection input\r\n */\r\ntype ColumnSelectionInput = Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>;\r\n\r\n/**\r\n * Handles column selection operations for the query builder\r\n */\r\nexport class ColumnSelector {\r\n /**\r\n * Creates a new ColumnSelector instance\r\n * @param env - Query builder environment\r\n */\r\n constructor(private readonly env: SelectQueryBuilderEnvironment) {}\r\n\r\n /**\r\n * Selects columns for the query\r\n * @param context - Current query context\r\n * @param columns - Columns to select\r\n * @returns Updated query context with selected columns\r\n */\r\n select(context: SelectQueryBuilderContext, columns: ColumnSelectionInput): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const { state: nextState, addedColumns } = astService.select(columns);\r\n return {\r\n state: nextState,\r\n hydration: context.hydration.onColumnsSelected(nextState, addedColumns)\r\n };\r\n }\r\n\r\n /**\r\n * Selects raw column expressions\r\n * @param context - Current query context\r\n * @param columns - Raw column expressions\r\n * @returns Updated query context with raw column selections\r\n */\r\n selectRaw(context: SelectQueryBuilderContext, columns: string[]): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.selectRaw(columns).state;\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param context - Current query context\r\n * @param alias - Alias for the subquery\r\n * @param query - Subquery to select\r\n * @returns Updated query context with subquery selection\r\n */\r\n selectSubquery(\r\n context: SelectQueryBuilderContext,\r\n alias: string,\r\n query: SelectQueryNode\r\n ): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.selectSubquery(alias, query);\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n /**\r\n * Adds DISTINCT clause to the query\r\n * @param context - Current query context\r\n * @param columns - Columns to make distinct\r\n * @returns Updated query context with DISTINCT clause\r\n */\r\n distinct(context: SelectQueryBuilderContext, columns: (ColumnDef | ColumnNode)[]): SelectQueryBuilderContext {\r\n const nodes = columns.map(col => buildColumnNode(this.env.table, col));\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.withDistinct(nodes);\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n}\r\n","import { ExpressionNode } from '../core/ast/expression.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';\r\nimport { JoinKind } from '../core/sql/sql.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\n\r\n/**\r\n * Manages relation operations (joins, includes, etc.) for query building\r\n */\r\nexport class RelationManager {\r\n /**\r\n * Creates a new RelationManager instance\r\n * @param env - Query builder environment\r\n */\r\n constructor(private readonly env: SelectQueryBuilderEnvironment) {}\r\n\r\n /**\r\n * Matches records based on a relation with an optional predicate\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to match\r\n * @param predicate - Optional predicate expression\r\n * @returns Updated query context with relation match\r\n */\r\n match(context: SelectQueryBuilderContext, relationName: string, predicate?: ExpressionNode): SelectQueryBuilderContext {\r\n const result = this.createService(context).match(relationName, predicate);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Joins a relation to the query\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to join\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query context with relation join\r\n */\r\n joinRelation(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).joinRelation(relationName, joinKind, extraCondition);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Updated query context with included relation\r\n */\r\n include(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n options?: RelationIncludeOptions\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).include(relationName, options);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Applies relation correlation to a query AST\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation\r\n * @param ast - Query AST to modify\r\n * @returns Modified query AST with relation correlation\r\n */\r\n applyRelationCorrelation(context: SelectQueryBuilderContext, relationName: string, ast: SelectQueryNode): SelectQueryNode {\r\n return this.createService(context).applyRelationCorrelation(relationName, ast);\r\n }\r\n\r\n /**\r\n * Creates a relation service instance\r\n * @param context - Current query context\r\n * @returns Relation service instance\r\n */\r\n private createService(context: SelectQueryBuilderContext) {\r\n return this.env.deps.createRelationService(this.env.table, context.state, context.hydration);\r\n }\r\n}\r\n","import { HydrationPlan, HydrationRelationPlan } from '../core/ast/query.js';\r\nimport { isRelationAlias, makeRelationAlias } from '../query-builder/relation-alias.js';\r\n\r\n/**\r\n * Hydrates query results according to a hydration plan\r\n * @param rows - Raw database rows\r\n * @param plan - Hydration plan\r\n * @returns Hydrated result objects with nested relations\r\n */\r\nexport const hydrateRows = (rows: Record<string, any>[], plan?: HydrationPlan): Record<string, any>[] => {\r\n if (!plan || !rows.length) return rows;\r\n\r\n const rootMap = new Map<any, Record<string, any>>();\r\n const relationIndex = new Map<any, Record<string, Set<any>>>();\r\n\r\n const getOrCreateParent = (row: Record<string, any>) => {\r\n const rootId = row[plan.rootPrimaryKey];\r\n if (rootId === undefined) return undefined;\r\n\r\n if (!rootMap.has(rootId)) {\r\n rootMap.set(rootId, createBaseRow(row, plan));\r\n }\r\n\r\n return rootMap.get(rootId);\r\n };\r\n\r\n const getRelationSeenSet = (rootId: any, relationName: string): Set<any> => {\r\n let byRelation = relationIndex.get(rootId);\r\n if (!byRelation) {\r\n byRelation = {};\r\n relationIndex.set(rootId, byRelation);\r\n }\r\n\r\n let seen = byRelation[relationName];\r\n if (!seen) {\r\n seen = new Set<any>();\r\n byRelation[relationName] = seen;\r\n }\r\n\r\n return seen;\r\n };\r\n\r\n for (const row of rows) {\r\n const rootId = row[plan.rootPrimaryKey];\r\n if (rootId === undefined) continue;\r\n\r\n const parent = getOrCreateParent(row);\r\n if (!parent) continue;\r\n\r\n for (const rel of plan.relations) {\r\n const childPkKey = makeRelationAlias(rel.aliasPrefix, rel.targetPrimaryKey);\r\n const childPk = row[childPkKey];\r\n if (childPk === null || childPk === undefined) continue;\r\n\r\n const seen = getRelationSeenSet(rootId, rel.name);\r\n if (seen.has(childPk)) continue;\r\n seen.add(childPk);\r\n\r\n const bucket = parent[rel.name] as any[];\r\n bucket.push(buildChild(row, rel));\r\n }\r\n }\r\n\r\n return Array.from(rootMap.values());\r\n};\r\n\r\nconst createBaseRow = (row: Record<string, any>, plan: HydrationPlan): Record<string, any> => {\r\n const base: Record<string, any> = {};\r\n const baseKeys = plan.rootColumns.length\r\n ? plan.rootColumns\r\n : Object.keys(row).filter(k => !isRelationAlias(k));\r\n\r\n for (const key of baseKeys) {\r\n base[key] = row[key];\r\n }\r\n\r\n for (const rel of plan.relations) {\r\n base[rel.name] = [];\r\n }\r\n\r\n return base;\r\n};\r\n\r\nconst buildChild = (row: Record<string, any>, rel: HydrationRelationPlan): Record<string, any> => {\r\n const child: Record<string, any> = {};\r\n for (const col of rel.columns) {\r\n const key = makeRelationAlias(rel.aliasPrefix, col);\r\n child[col] = row[key];\r\n }\r\n\r\n const pivot = buildPivot(row, rel);\r\n if (pivot) {\r\n (child as any)._pivot = pivot;\r\n }\r\n\r\n return child;\r\n};\r\n\r\nconst buildPivot = (row: Record<string, any>, rel: HydrationRelationPlan): Record<string, any> | undefined => {\r\n if (!rel.pivot) return undefined;\r\n\r\n const pivot: Record<string, any> = {};\r\n for (const col of rel.pivot.columns) {\r\n const key = makeRelationAlias(rel.pivot.aliasPrefix, col);\r\n pivot[col] = row[key];\r\n }\r\n\r\n const hasValue = Object.values(pivot).some(v => v !== null && v !== undefined);\r\n return hasValue ? pivot : undefined;\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { OrmContext } from './orm-context.js';\r\nimport { RelationMap } from '../schema/types.js';\r\n\r\nexport const ENTITY_META = Symbol('EntityMeta');\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nexport interface EntityMeta<TTable extends TableDef> {\r\n ctx: OrmContext;\r\n table: TTable;\r\n lazyRelations: (keyof RelationMap<TTable>)[];\r\n relationCache: Map<string, Promise<any>>;\r\n relationHydration: Map<string, Map<string, any>>;\r\n relationWrappers: Map<string, unknown>;\r\n}\r\n\r\nexport const getHydrationRows = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, any>[] | undefined => {\r\n const map = meta.relationHydration.get(relationName);\r\n if (!map) return undefined;\r\n const rows = map.get(toKey(key));\r\n if (!rows) return undefined;\r\n return Array.isArray(rows) ? rows : undefined;\r\n};\r\n\r\nexport const getHydrationRecord = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, any> | undefined => {\r\n const map = meta.relationHydration.get(relationName);\r\n if (!map) return undefined;\r\n const value = map.get(toKey(key));\r\n if (!value) return undefined;\r\n if (Array.isArray(value)) {\r\n return value[0];\r\n }\r\n return value;\r\n};\r\n\r\nexport const getEntityMeta = <TTable extends TableDef>(entity: any): EntityMeta<TTable> | undefined => {\r\n if (!entity || typeof entity !== 'object') return undefined;\r\n return (entity as any)[ENTITY_META];\r\n};\r\n\r\nexport const hasEntityMeta = (entity: any): entity is { [ENTITY_META]: EntityMeta<TableDef> } => {\r\n return Boolean(getEntityMeta(entity));\r\n};\r\n","import { HasManyCollection } from '../../schema/types.js';\r\nimport { OrmContext, RelationKey } from '../orm-context.js';\r\nimport { HasManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nexport class DefaultHasManyCollection<TChild> implements HasManyCollection<TChild> {\r\n private loaded = false;\r\n private items: TChild[] = [];\r\n private readonly added = new Set<TChild>();\r\n private readonly removed = new Set<TChild>();\r\n\r\n constructor(\r\n private readonly ctx: OrmContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: HasManyRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, any>) => TChild,\r\n private readonly localKey: string\r\n ) {\r\n this.hydrateFromCache();\r\n }\r\n\r\n async load(): Promise<TChild[]> {\r\n if (this.loaded) return this.items;\r\n const map = await this.loader();\r\n const key = toKey(this.root[this.localKey]);\r\n const rows = map.get(key) ?? [];\r\n this.items = rows.map(row => this.createEntity(row));\r\n this.loaded = true;\r\n return this.items;\r\n }\r\n\r\n getItems(): TChild[] {\r\n return this.items;\r\n }\r\n\r\n add(data: Partial<TChild>): TChild {\r\n const keyValue = this.root[this.localKey];\r\n const childRow: Record<string, any> = {\r\n ...data,\r\n [this.relation.foreignKey]: keyValue\r\n };\r\n const entity = this.createEntity(childRow);\r\n this.added.add(entity);\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'add', entity }\r\n );\r\n return entity;\r\n }\r\n\r\n attach(entity: TChild): void {\r\n const keyValue = this.root[this.localKey];\r\n (entity as Record<string, any>)[this.relation.foreignKey] = keyValue;\r\n this.ctx.markDirty(entity);\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n }\r\n\r\n remove(entity: TChild): void {\r\n this.items = this.items.filter(item => item !== entity);\r\n this.removed.add(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity }\r\n );\r\n }\r\n\r\n clear(): void {\r\n for (const entity of [...this.items]) {\r\n this.remove(entity);\r\n }\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private hydrateFromCache(): void {\r\n const keyValue = this.root[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const rows = getHydrationRows(this.meta, this.relationName, keyValue);\r\n if (!rows?.length) return;\r\n this.items = rows.map(row => this.createEntity(row));\r\n this.loaded = true;\r\n }\r\n}\r\n","import { BelongsToReference } from '../../schema/types.js';\r\nimport { OrmContext, RelationKey } from '../orm-context.js';\r\nimport { BelongsToRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRecord, hasEntityMeta } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>;\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nexport class DefaultBelongsToReference<TParent> implements BelongsToReference<TParent> {\r\n private loaded = false;\r\n private current: TParent | null = null;\r\n\r\n constructor(\r\n private readonly ctx: OrmContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: BelongsToRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, any>) => TParent,\r\n private readonly targetKey: string\r\n ) {\r\n this.populateFromHydrationCache();\r\n }\r\n\r\n async load(): Promise<TParent | null> {\r\n if (this.loaded) return this.current;\r\n const map = await this.loader();\r\n const fkValue = this.root[this.relation.foreignKey];\r\n if (fkValue === null || fkValue === undefined) {\r\n this.current = null;\r\n } else {\r\n const row = map.get(toKey(fkValue));\r\n this.current = row ? this.createEntity(row) : null;\r\n }\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n\r\n get(): TParent | null {\r\n return this.current;\r\n }\r\n\r\n set(data: Partial<TParent> | TParent | null): TParent | null {\r\n if (data === null) {\r\n const previous = this.current;\r\n this.root[this.relation.foreignKey] = null;\r\n this.current = null;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: previous }\r\n );\r\n return null;\r\n }\r\n\r\n const entity = hasEntityMeta(data) ? (data as TParent) : this.createEntity(data as Record<string, any>);\r\n const pkValue = (entity as any)[this.targetKey];\r\n if (pkValue !== undefined) {\r\n this.root[this.relation.foreignKey] = pkValue;\r\n }\r\n this.current = entity;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n return entity;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private populateFromHydrationCache(): void {\r\n const fkValue = this.root[this.relation.foreignKey];\r\n if (fkValue === undefined || fkValue === null) return;\r\n const row = getHydrationRecord(this.meta, this.relationName, fkValue);\r\n if (!row) return;\r\n this.current = this.createEntity(row);\r\n this.loaded = true;\r\n }\r\n}\r\n","import { ManyToManyCollection } from '../../schema/types.js';\r\nimport { OrmContext, RelationKey } from '../orm-context.js';\r\nimport { BelongsToManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { findPrimaryKey } from '../../query-builder/hydration-planner.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nexport class DefaultManyToManyCollection<TTarget> implements ManyToManyCollection<TTarget> {\r\n private loaded = false;\r\n private items: TTarget[] = [];\r\n\r\n constructor(\r\n private readonly ctx: OrmContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: BelongsToManyRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, any>) => TTarget,\r\n private readonly localKey: string\r\n ) {\r\n this.hydrateFromCache();\r\n }\r\n\r\n async load(): Promise<TTarget[]> {\r\n if (this.loaded) return this.items;\r\n const map = await this.loader();\r\n const key = toKey(this.root[this.localKey]);\r\n const rows = map.get(key) ?? [];\r\n this.items = rows.map(row => {\r\n const entity = this.createEntity(row);\r\n if ((row as any)._pivot) {\r\n (entity as any)._pivot = row._pivot;\r\n }\r\n return entity;\r\n });\r\n this.loaded = true;\r\n return this.items;\r\n }\r\n\r\n getItems(): TTarget[] {\r\n return this.items;\r\n }\r\n\r\n attach(target: TTarget | number | string): void {\r\n const entity = this.ensureEntity(target);\r\n const id = this.extractId(entity);\r\n if (id == null) return;\r\n if (this.items.some(item => this.extractId(item) === id)) {\r\n return;\r\n }\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n }\r\n\r\n detach(target: TTarget | number | string): void {\r\n const id = typeof target === 'number' || typeof target === 'string'\r\n ? target\r\n : this.extractId(target);\r\n\r\n if (id == null) return;\r\n\r\n const existing = this.items.find(item => this.extractId(item) === id);\r\n if (!existing) return;\r\n\r\n this.items = this.items.filter(item => this.extractId(item) !== id);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'detach', entity: existing }\r\n );\r\n }\r\n\r\n async syncByIds(ids: (number | string)[]): Promise<void> {\r\n await this.load();\r\n const targetKey = this.relation.targetKey || findPrimaryKey(this.relation.target);\r\n const normalized = new Set(ids.map(id => toKey(id)));\r\n const currentIds = new Set(this.items.map(item => toKey(this.extractId(item))));\r\n\r\n for (const id of normalized) {\r\n if (!currentIds.has(id)) {\r\n this.attach(id);\r\n }\r\n }\r\n\r\n for (const item of [...this.items]) {\r\n const itemId = toKey(this.extractId(item));\r\n if (!normalized.has(itemId)) {\r\n this.detach(item);\r\n }\r\n }\r\n }\r\n\r\n private ensureEntity(target: TTarget | number | string): TTarget {\r\n if (typeof target === 'number' || typeof target === 'string') {\r\n const stub: Record<string, any> = {\r\n [this.targetKey]: target\r\n };\r\n return this.createEntity(stub);\r\n }\r\n return target;\r\n }\r\n\r\n private extractId(entity: TTarget | number | string | null | undefined): number | string | null {\r\n if (entity === null || entity === undefined) return null;\r\n if (typeof entity === 'number' || typeof entity === 'string') {\r\n return entity;\r\n }\r\n return (entity as any)[this.targetKey] ?? null;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private get targetKey(): string {\r\n return this.relation.targetKey || findPrimaryKey(this.relation.target);\r\n }\r\n\r\n private hydrateFromCache(): void {\r\n const keyValue = this.root[this.localKey];\r\n if (keyValue === undefined || keyValue === null) return;\r\n const rows = getHydrationRows(this.meta, this.relationName, keyValue);\r\n if (!rows?.length) return;\r\n this.items = rows.map(row => {\r\n const entity = this.createEntity(row);\r\n if ((row as any)._pivot) {\r\n (entity as any)._pivot = (row as any)._pivot;\r\n }\r\n return entity;\r\n });\r\n this.loaded = true;\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { BelongsToManyRelation, HasManyRelation, BelongsToRelation } from '../schema/relation.js';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { inList, LiteralNode } from '../core/ast/expression.js';\r\nimport { OrmContext, QueryResult } from './orm-context.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst selectAllColumns = (table: TableDef): Record<string, ColumnDef> =>\r\n Object.entries(table.columns).reduce((acc, [name, def]) => {\r\n acc[name] = def;\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n\r\nconst rowsFromResults = (results: QueryResult[]): Rows => {\r\n const rows: Rows = [];\r\n for (const result of results) {\r\n const { columns, values } = result;\r\n for (const valueRow of values) {\r\n const row: Record<string, any> = {};\r\n columns.forEach((column, idx) => {\r\n row[column] = valueRow[idx];\r\n });\r\n rows.push(row);\r\n }\r\n }\r\n return rows;\r\n};\r\n\r\nconst executeQuery = async (ctx: OrmContext, qb: SelectQueryBuilder<any, TableDef<any>>): Promise<Rows> => {\r\n const compiled = ctx.dialect.compileSelect(qb.getAST());\r\n const results = await ctx.executor.executeSql(compiled.sql, compiled.params);\r\n return rowsFromResults(results);\r\n};\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nexport const loadHasManyRelation = async (\r\n ctx: OrmContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: HasManyRelation\r\n): Promise<Map<string, Rows>> => {\r\n const localKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const keys = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[localKey];\r\n if (value !== null && value !== undefined) {\r\n keys.add(value);\r\n }\r\n }\r\n\r\n if (!keys.size) {\r\n return new Map();\r\n }\r\n\r\n const selectMap = selectAllColumns(relation.target);\r\n const fb = new SelectQueryBuilder(relation.target).select(selectMap);\r\n const fkColumn = relation.target.columns[relation.foreignKey];\r\n if (!fkColumn) return new Map();\r\n\r\n fb.where(inList(fkColumn, Array.from(keys) as (string | number | LiteralNode)[]));\r\n\r\n const rows = await executeQuery(ctx, fb);\r\n const grouped = new Map<string, Rows>();\r\n\r\n for (const row of rows) {\r\n const fkValue = row[relation.foreignKey];\r\n if (fkValue === null || fkValue === undefined) continue;\r\n const key = toKey(fkValue);\r\n const bucket = grouped.get(key) ?? [];\r\n bucket.push(row);\r\n grouped.set(key, bucket);\r\n }\r\n\r\n return grouped;\r\n};\r\n\r\nexport const loadBelongsToRelation = async (\r\n ctx: OrmContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToRelation\r\n): Promise<Map<string, Record<string, any>>> => {\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const foreignKeys = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[relation.foreignKey];\r\n if (value !== null && value !== undefined) {\r\n foreignKeys.add(value);\r\n }\r\n }\r\n\r\n if (!foreignKeys.size) {\r\n return new Map();\r\n }\r\n\r\n const selectMap = selectAllColumns(relation.target);\r\n const qb = new SelectQueryBuilder(relation.target).select(selectMap);\r\n const targetKey = relation.localKey || findPrimaryKey(relation.target);\r\n const pkColumn = relation.target.columns[targetKey];\r\n if (!pkColumn) return new Map();\r\n\r\n qb.where(inList(pkColumn, Array.from(foreignKeys) as (string | number | LiteralNode)[]));\r\n const rows = await executeQuery(ctx, qb);\r\n const map = new Map<string, Record<string, any>>();\r\n\r\n for (const row of rows) {\r\n const keyValue = row[targetKey];\r\n if (keyValue === null || keyValue === undefined) continue;\r\n map.set(toKey(keyValue), row);\r\n }\r\n\r\n return map;\r\n};\r\n\r\nexport const loadBelongsToManyRelation = async (\r\n ctx: OrmContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToManyRelation\r\n): Promise<Map<string, Rows>> => {\r\n const rootKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const rootIds = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[rootKey];\r\n if (value !== null && value !== undefined) {\r\n rootIds.add(value);\r\n }\r\n }\r\n\r\n if (!rootIds.size) {\r\n return new Map();\r\n }\r\n\r\n const pivotSelect = selectAllColumns(relation.pivotTable);\r\n const pivotQb = new SelectQueryBuilder(relation.pivotTable).select(pivotSelect);\r\n const pivotFkCol = relation.pivotTable.columns[relation.pivotForeignKeyToRoot];\r\n if (!pivotFkCol) return new Map();\r\n\r\n pivotQb.where(inList(pivotFkCol, Array.from(rootIds) as (string | number | LiteralNode)[]));\r\n const pivotRows = await executeQuery(ctx, pivotQb);\r\n\r\n const rootLookup = new Map<string, { targetId: unknown; pivot: Record<string, any> }[]>();\r\n const targetIds = new Set<unknown>();\r\n\r\n for (const pivot of pivotRows) {\r\n const rootValue = pivot[relation.pivotForeignKeyToRoot];\r\n const targetValue = pivot[relation.pivotForeignKeyToTarget];\r\n if (rootValue === null || rootValue === undefined || targetValue === null || targetValue === undefined) {\r\n continue;\r\n }\r\n const bucket = rootLookup.get(toKey(rootValue)) ?? [];\r\n bucket.push({\r\n targetId: targetValue,\r\n pivot: { ...pivot }\r\n });\r\n rootLookup.set(toKey(rootValue), bucket);\r\n targetIds.add(targetValue);\r\n }\r\n\r\n if (!targetIds.size) {\r\n return new Map();\r\n }\r\n\r\n const targetSelect = selectAllColumns(relation.target);\r\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\r\n const targetPkColumn = relation.target.columns[targetKey];\r\n if (!targetPkColumn) return new Map();\r\n\r\n const targetQb = new SelectQueryBuilder(relation.target).select(targetSelect);\r\n targetQb.where(inList(targetPkColumn, Array.from(targetIds) as (string | number | LiteralNode)[]));\r\n const targetRows = await executeQuery(ctx, targetQb);\r\n const targetMap = new Map<string, Record<string, any>>();\r\n\r\n for (const row of targetRows) {\r\n const pkValue = row[targetKey];\r\n if (pkValue === null || pkValue === undefined) continue;\r\n targetMap.set(toKey(pkValue), row);\r\n }\r\n\r\n const result = new Map<string, Rows>();\r\n\r\n for (const [rootId, entries] of rootLookup.entries()) {\r\n const bucket: Rows = [];\r\n for (const entry of entries) {\r\n const targetRow = targetMap.get(toKey(entry.targetId));\r\n if (!targetRow) continue;\r\n bucket.push({\r\n ...targetRow,\r\n _pivot: entry.pivot\r\n });\r\n }\r\n result.set(rootId, bucket);\r\n }\r\n\r\n return result;\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { Entity, RelationMap, HasManyCollection, BelongsToReference, ManyToManyCollection } from '../schema/types.js';\r\nimport { OrmContext } from './orm-context.js';\r\nimport { ENTITY_META, EntityMeta, getEntityMeta } from './entity-meta.js';\r\nimport { DefaultHasManyCollection } from './relations/has-many.js';\r\nimport { DefaultBelongsToReference } from './relations/belongs-to.js';\r\nimport { DefaultManyToManyCollection } from './relations/many-to-many.js';\r\nimport { HasManyRelation, BelongsToRelation, BelongsToManyRelation, RelationKinds } from '../schema/relation.js';\r\nimport { loadHasManyRelation, loadBelongsToRelation, loadBelongsToManyRelation } from './lazy-batch.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst relationLoaderCache = <T extends Map<string, any>>(\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n factory: () => Promise<T>\r\n): Promise<T> => {\r\n if (meta.relationCache.has(relationName)) {\r\n return meta.relationCache.get(relationName)! as Promise<T>;\r\n }\r\n\r\n const promise = factory().then(value => {\r\n for (const tracked of meta.ctx.getEntitiesForTable(meta.table)) {\r\n const otherMeta = getEntityMeta(tracked.entity);\r\n if (!otherMeta) continue;\r\n otherMeta.relationHydration.set(relationName, value);\r\n }\r\n return value;\r\n });\r\n\r\n meta.relationCache.set(relationName, promise);\r\n\r\n for (const tracked of meta.ctx.getEntitiesForTable(meta.table)) {\r\n const otherMeta = getEntityMeta(tracked.entity);\r\n if (!otherMeta) continue;\r\n otherMeta.relationCache.set(relationName, promise);\r\n }\r\n\r\n return promise;\r\n};\r\n\r\nexport const createEntityProxy = <\r\n TTable extends TableDef,\r\n TLazy extends keyof RelationMap<TTable> = keyof RelationMap<TTable>\r\n>(\r\n ctx: OrmContext,\r\n table: TTable,\r\n row: Record<string, any>,\r\n lazyRelations: TLazy[] = [] as TLazy[]\r\n): Entity<TTable> => {\r\n const target: Record<string, any> = { ...row };\r\n const meta: EntityMeta<TTable> = {\r\n ctx,\r\n table,\r\n lazyRelations: [...lazyRelations],\r\n relationCache: new Map(),\r\n relationHydration: new Map(),\r\n relationWrappers: new Map()\r\n };\r\n\r\n Object.defineProperty(target, ENTITY_META, {\r\n value: meta,\r\n enumerable: false,\r\n writable: false\r\n });\r\n\r\n let proxy: Entity<TTable>;\r\n const handler: ProxyHandler<any> = {\r\n get(targetObj, prop, receiver) {\r\n if (prop === ENTITY_META) {\r\n return meta;\r\n }\r\n\r\n if (prop === '$load') {\r\n return async (relationName: keyof RelationMap<TTable>) => {\r\n const wrapper = getRelationWrapper(meta, relationName as string, proxy);\r\n if (wrapper && typeof wrapper.load === 'function') {\r\n return wrapper.load();\r\n }\r\n return undefined;\r\n };\r\n }\r\n\r\n if (typeof prop === 'string' && table.relations[prop]) {\r\n return getRelationWrapper(meta, prop, proxy);\r\n }\r\n\r\n return Reflect.get(targetObj, prop, receiver);\r\n },\r\n\r\n set(targetObj, prop, value, receiver) {\r\n const result = Reflect.set(targetObj, prop, value, receiver);\r\n if (typeof prop === 'string' && table.columns[prop]) {\r\n ctx.markDirty(proxy);\r\n }\r\n return result;\r\n }\r\n };\r\n\r\n proxy = new Proxy(target, handler) as Entity<TTable>;\r\n populateHydrationCache(proxy, row, meta);\r\n return proxy;\r\n};\r\n\r\nexport const createEntityFromRow = <TTable extends TableDef>(\r\n ctx: OrmContext,\r\n table: TTable,\r\n row: Record<string, any>,\r\n lazyRelations: (keyof RelationMap<TTable>)[] = []\r\n): Entity<TTable> => {\r\n const pkName = findPrimaryKey(table);\r\n const pkValue = row[pkName];\r\n if (pkValue !== undefined && pkValue !== null) {\r\n const tracked = ctx.getEntity(table, pkValue);\r\n if (tracked) return tracked;\r\n }\r\n\r\n const entity = createEntityProxy(ctx, table, row, lazyRelations);\r\n if (pkValue !== undefined && pkValue !== null) {\r\n ctx.trackManaged(table, pkValue, entity);\r\n } else {\r\n ctx.trackNew(table, entity);\r\n }\r\n\r\n return entity;\r\n};\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\n const populateHydrationCache = <TTable extends TableDef>(\r\n entity: any,\r\n row: Record<string, any>,\r\n meta: EntityMeta<TTable>\r\n ): void => {\r\n for (const relationName of Object.keys(meta.table.relations)) {\r\n const relation = meta.table.relations[relationName];\r\n const data = row[relationName];\r\n if (!Array.isArray(data)) continue;\r\n\r\n if (relation.type === RelationKinds.HasMany || relation.type === RelationKinds.BelongsToMany) {\r\n const localKey = relation.localKey || findPrimaryKey(meta.table);\r\n const rootValue = entity[localKey];\r\n if (rootValue === undefined || rootValue === null) continue;\r\n const cache = new Map<string, Rows>();\r\n cache.set(toKey(rootValue), data as Rows);\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n continue;\r\n }\r\n\r\n if (relation.type === RelationKinds.BelongsTo) {\r\n const targetKey = relation.localKey || findPrimaryKey(relation.target);\r\n const cache = new Map<string, Record<string, any>>();\r\n for (const item of data) {\r\n const pkValue = item[targetKey];\r\n if (pkValue === undefined || pkValue === null) continue;\r\n cache.set(toKey(pkValue), item);\r\n }\r\n if (cache.size) {\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n }\r\n }\r\n }\r\n };\r\n\r\nconst getRelationWrapper = (\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n owner: any\r\n): HasManyCollection<any> | BelongsToReference<any> | ManyToManyCollection<any> | undefined => {\r\n if (meta.relationWrappers.has(relationName)) {\r\n return meta.relationWrappers.get(relationName) as HasManyCollection<any>;\r\n }\r\n\r\n const relation = meta.table.relations[relationName];\r\n if (!relation) return undefined;\r\n\r\n const wrapper = instantiateWrapper(meta, relationName, relation as any, owner);\r\n if (wrapper) {\r\n meta.relationWrappers.set(relationName, wrapper);\r\n }\r\n\r\n return wrapper;\r\n};\r\n\r\nconst instantiateWrapper = (\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n relation: HasManyRelation | BelongsToRelation | BelongsToManyRelation,\r\n owner: any\r\n): HasManyCollection<any> | BelongsToReference<any> | ManyToManyCollection<any> | undefined => {\r\n switch (relation.type) {\r\n case RelationKinds.HasMany: {\r\n const hasMany = relation as HasManyRelation;\r\n const localKey = hasMany.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadHasManyRelation(meta.ctx, meta.table, relationName, hasMany)\r\n );\r\n return new DefaultHasManyCollection(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n hasMany,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n localKey\r\n );\r\n }\r\n case RelationKinds.BelongsTo: {\r\n const belongsTo = relation as BelongsToRelation;\r\n const targetKey = belongsTo.localKey || findPrimaryKey(belongsTo.target);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadBelongsToRelation(meta.ctx, meta.table, relationName, belongsTo)\r\n );\r\n return new DefaultBelongsToReference(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n belongsTo,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n targetKey\r\n );\r\n }\r\n case RelationKinds.BelongsToMany: {\r\n const many = relation as BelongsToManyRelation;\r\n const localKey = many.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadBelongsToManyRelation(meta.ctx, meta.table, relationName, many)\r\n );\r\n return new DefaultManyToManyCollection(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n many,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n localKey\r\n );\r\n }\r\n default:\r\n return undefined;\r\n }\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { Entity } from '../schema/types.js';\r\nimport { hydrateRows } from './hydration.js';\r\nimport { OrmContext } from './orm-context.js';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { createEntityFromRow } from './entity.js';\r\n\r\ntype Row = Record<string, any>;\r\n\r\nconst flattenResults = (results: { columns: string[]; values: unknown[][] }[]): Row[] => {\r\n const rows: Row[] = [];\r\n for (const result of results) {\r\n const { columns, values } = result;\r\n for (const valueRow of values) {\r\n const row: Row = {};\r\n columns.forEach((column, idx) => {\r\n row[column] = valueRow[idx];\r\n });\r\n rows.push(row);\r\n }\r\n }\r\n return rows;\r\n};\r\n\r\nexport async function executeHydrated<TTable extends TableDef>(\r\n ctx: OrmContext,\r\n qb: SelectQueryBuilder<any, TTable>\r\n): Promise<Entity<TTable>[]> {\r\n const compiled = ctx.dialect.compileSelect(qb.getAST());\r\n const executed = await ctx.executor.executeSql(compiled.sql, compiled.params);\r\n const rows = flattenResults(executed);\r\n const hydrated = hydrateRows(rows, qb.getHydrationPlan());\r\n return hydrated.map(row =>\r\n createEntityFromRow(ctx, qb.getTable(), row, qb.getLazyRelations())\r\n );\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { SelectQueryNode, HydrationPlan } from '../core/ast/query.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n LiteralNode,\r\n BinaryExpressionNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n exists,\r\n notExists\r\n} from '../core/ast/expression.js';\r\nimport { CompiledQuery, Dialect } from '../core/dialect/abstract.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport {\r\n resolveSelectQueryBuilderDependencies,\r\n SelectQueryBuilderContext,\r\n SelectQueryBuilderDependencies,\r\n SelectQueryBuilderEnvironment\r\n} from './select-query-builder-deps.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { ColumnSelector } from './column-selector.js';\r\nimport { RelationManager } from './relation-manager.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\nimport { JOIN_KINDS, JoinKind, ORDER_DIRECTIONS, OrderDirection } from '../core/sql/sql.js';\r\nimport { Entity, RelationMap } from '../schema/types.js';\r\nimport { OrmContext } from '../orm/orm-context.js';\r\nimport { executeHydrated } from '../orm/execute.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\n\r\n/**\r\n * Main query builder class for constructing SQL SELECT queries\r\n * @typeParam T - Result type for projections (unused)\r\n * @typeParam TTable - Table definition being queried\r\n */\r\nexport class SelectQueryBuilder<T = any, TTable extends TableDef = TableDef> {\r\n private readonly env: SelectQueryBuilderEnvironment;\r\n private readonly context: SelectQueryBuilderContext;\r\n private readonly columnSelector: ColumnSelector;\r\n private readonly relationManager: RelationManager;\r\n private readonly lazyRelations: Set<string>;\r\n\r\n /**\r\n * Creates a new SelectQueryBuilder instance\r\n * @param table - Table definition to query\r\n * @param state - Optional initial query state\r\n * @param hydration - Optional hydration manager\r\n * @param dependencies - Optional query builder dependencies\r\n */\r\n constructor(\r\n table: TTable,\r\n state?: SelectQueryState,\r\n hydration?: HydrationManager,\r\n dependencies?: Partial<SelectQueryBuilderDependencies>,\r\n lazyRelations?: Set<string>\r\n ) {\r\n const deps = resolveSelectQueryBuilderDependencies(dependencies);\r\n this.env = { table, deps };\r\n const initialState = state ?? deps.createState(table);\r\n const initialHydration = hydration ?? deps.createHydration(table);\r\n this.context = {\r\n state: initialState,\r\n hydration: initialHydration\r\n };\r\n this.lazyRelations = new Set(lazyRelations ?? []);\r\n this.columnSelector = new ColumnSelector(this.env);\r\n this.relationManager = new RelationManager(this.env);\r\n }\r\n\r\n private clone(\r\n context: SelectQueryBuilderContext = this.context,\r\n lazyRelations = new Set(this.lazyRelations)\r\n ): SelectQueryBuilder<T, TTable> {\r\n return new SelectQueryBuilder(this.env.table as TTable, context.state, context.hydration, this.env.deps, lazyRelations);\r\n }\r\n\r\n private resolveQueryNode(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryNode {\r\n return typeof (query as any).getAST === 'function'\r\n ? (query as SelectQueryBuilder<any, TableDef<any>>).getAST()\r\n : (query as SelectQueryNode);\r\n }\r\n\r\n private createChildBuilder<R, TChild extends TableDef>(table: TChild): SelectQueryBuilder<R, TChild> {\r\n return new SelectQueryBuilder(table, undefined, undefined, this.env.deps);\r\n }\r\n\r\n private applyAst(\r\n context: SelectQueryBuilderContext,\r\n mutator: (service: QueryAstService) => SelectQueryState\r\n ): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = mutator(astService);\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n private applyJoin(\r\n context: SelectQueryBuilderContext,\r\n table: TableDef,\r\n condition: BinaryExpressionNode,\r\n kind: JoinKind\r\n ): SelectQueryBuilderContext {\r\n const joinNode = createJoinNode(kind, table.name, condition);\r\n return this.applyAst(context, service => service.withJoin(joinNode));\r\n }\r\n\r\n /**\r\n * Selects specific columns for the query\r\n * @param columns - Record of column definitions, function nodes, case expressions, or window functions\r\n * @returns New query builder instance with selected columns\r\n */\r\n select(columns: Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.columnSelector.select(this.context, columns));\r\n }\r\n\r\n /**\r\n * Selects raw column expressions\r\n * @param cols - Column expressions as strings\r\n * @returns New query builder instance with raw column selections\r\n */\r\n selectRaw(...cols: string[]): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.columnSelector.selectRaw(this.context, cols));\r\n }\r\n\r\n /**\r\n * Adds a Common Table Expression (CTE) to the query\r\n * @param name - Name of the CTE\r\n * @param query - Query builder or query node for the CTE\r\n * @param columns - Optional column names for the CTE\r\n * @returns New query builder instance with the CTE\r\n */\r\n with(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(query);\r\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, false));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a recursive Common Table Expression (CTE) to the query\r\n * @param name - Name of the CTE\r\n * @param query - Query builder or query node for the CTE\r\n * @param columns - Optional column names for the CTE\r\n * @returns New query builder instance with the recursive CTE\r\n */\r\n withRecursive(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(query);\r\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, true));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param alias - Alias for the subquery column\r\n * @param sub - Query builder or query node for the subquery\r\n * @returns New query builder instance with the subquery selection\r\n */\r\n selectSubquery(alias: string, sub: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const query = this.resolveQueryNode(sub);\r\n return this.clone(this.columnSelector.selectSubquery(this.context, alias, query));\r\n }\r\n\r\n /**\r\n * Adds an INNER JOIN to the query\r\n * @param table - Table to join\r\n * @param condition - Join condition expression\r\n * @returns New query builder instance with the INNER JOIN\r\n */\r\n innerJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.INNER);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a LEFT JOIN to the query\r\n * @param table - Table to join\r\n * @param condition - Join condition expression\r\n * @returns New query builder instance with the LEFT JOIN\r\n */\r\n leftJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.LEFT);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a RIGHT JOIN to the query\r\n * @param table - Table to join\r\n * @param condition - Join condition expression\r\n * @returns New query builder instance with the RIGHT JOIN\r\n */\r\n rightJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.RIGHT);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Matches records based on a relationship\r\n * @param relationName - Name of the relationship to match\r\n * @param predicate - Optional predicate expression\r\n * @returns New query builder instance with the relationship match\r\n */\r\n match(relationName: string, predicate?: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.relationManager.match(this.context, relationName, predicate);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Joins a related table\r\n * @param relationName - Name of the relationship to join\r\n * @param joinKind - Type of join (defaults to INNER)\r\n * @param extraCondition - Optional additional join condition\r\n * @returns New query builder instance with the relationship join\r\n */\r\n joinRelation(\r\n relationName: string,\r\n joinKind: JoinKind = JOIN_KINDS.INNER,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.relationManager.joinRelation(this.context, relationName, joinKind, extraCondition);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Includes related data in the query results\r\n * @param relationName - Name of the relationship to include\r\n * @param options - Optional include options\r\n * @returns New query builder instance with the relationship inclusion\r\n */\r\n include(relationName: string, options?: RelationIncludeOptions): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.relationManager.include(this.context, relationName, options);\r\n return this.clone(nextContext);\r\n }\r\n\r\n includeLazy<K extends keyof RelationMap<TTable>>(relationName: K): SelectQueryBuilder<T, TTable> {\r\n const nextLazy = new Set(this.lazyRelations);\r\n nextLazy.add(relationName as string);\r\n return this.clone(this.context, nextLazy);\r\n }\r\n\r\n getLazyRelations(): (keyof RelationMap<TTable>)[] {\r\n return Array.from(this.lazyRelations) as (keyof RelationMap<TTable>)[];\r\n }\r\n\r\n getTable(): TTable {\r\n return this.env.table as TTable;\r\n }\r\n\r\n async execute(ctx: OrmContext): Promise<Entity<TTable>[]> {\r\n return executeHydrated(ctx, this);\r\n }\r\n\r\n /**\r\n * Adds a WHERE condition to the query\r\n * @param expr - Expression for the WHERE clause\r\n * @returns New query builder instance with the WHERE condition\r\n */\r\n where(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withWhere(expr));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a GROUP BY clause to the query\r\n * @param col - Column definition or column node to group by\r\n * @returns New query builder instance with the GROUP BY clause\r\n */\r\n groupBy(col: ColumnDef | ColumnNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withGroupBy(col));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a HAVING condition to the query\r\n * @param expr - Expression for the HAVING clause\r\n * @returns New query builder instance with the HAVING condition\r\n */\r\n having(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withHaving(expr));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds an ORDER BY clause to the query\r\n * @param col - Column definition or column node to order by\r\n * @param direction - Order direction (defaults to ASC)\r\n * @returns New query builder instance with the ORDER BY clause\r\n */\r\n orderBy(col: ColumnDef | ColumnNode, direction: OrderDirection = ORDER_DIRECTIONS.ASC): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withOrderBy(col, direction));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a DISTINCT clause to the query\r\n * @param cols - Columns to make distinct\r\n * @returns New query builder instance with the DISTINCT clause\r\n */\r\n distinct(...cols: (ColumnDef | ColumnNode)[]): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.columnSelector.distinct(this.context, cols));\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param n - Maximum number of rows to return\r\n * @returns New query builder instance with the LIMIT clause\r\n */\r\n limit(n: number): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withLimit(n));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param n - Number of rows to skip\r\n * @returns New query builder instance with the OFFSET clause\r\n */\r\n offset(n: number): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withOffset(n));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a WHERE EXISTS condition to the query\r\n * @param subquery - Subquery to check for existence\r\n * @returns New query builder instance with the WHERE EXISTS condition\r\n */\r\n whereExists(subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(subquery);\r\n return this.where(exists(subAst));\r\n }\r\n\r\n /**\r\n * Adds a WHERE NOT EXISTS condition to the query\r\n * @param subquery - Subquery to check for non-existence\r\n * @returns New query builder instance with the WHERE NOT EXISTS condition\r\n */\r\n whereNotExists(subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(subquery);\r\n return this.where(notExists(subAst));\r\n }\r\n\r\n /**\r\n * Adds a WHERE EXISTS condition based on a relationship\r\n * @param relationName - Name of the relationship to check\r\n * @param callback - Optional callback to modify the relationship query\r\n * @returns New query builder instance with the relationship existence check\r\n */\r\n whereHas(\r\n relationName: string,\r\n callback?: <TChildTable extends TableDef>(\r\n qb: SelectQueryBuilder<any, TChildTable>\r\n ) => SelectQueryBuilder<any, TChildTable>\r\n ): SelectQueryBuilder<T, TTable> {\r\n const relation = this.env.table.relations[relationName];\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\r\n }\r\n\r\n let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\r\n if (callback) {\r\n subQb = callback(subQb);\r\n }\r\n\r\n const subAst = subQb.getAST();\r\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst);\r\n return this.where(exists(finalSubAst));\r\n }\r\n\r\n /**\r\n * Adds a WHERE NOT EXISTS condition based on a relationship\r\n * @param relationName - Name of the relationship to check\r\n * @param callback - Optional callback to modify the relationship query\r\n * @returns New query builder instance with the relationship non-existence check\r\n */\r\n whereHasNot(\r\n relationName: string,\r\n callback?: <TChildTable extends TableDef>(\r\n qb: SelectQueryBuilder<any, TChildTable>\r\n ) => SelectQueryBuilder<any, TChildTable>\r\n ): SelectQueryBuilder<T, TTable> {\r\n const relation = this.env.table.relations[relationName];\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\r\n }\r\n\r\n let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\r\n if (callback) {\r\n subQb = callback(subQb);\r\n }\r\n\r\n const subAst = subQb.getAST();\r\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst);\r\n return this.where(notExists(finalSubAst));\r\n }\r\n\r\n /**\r\n * Compiles the query to SQL for a specific dialect\r\n * @param dialect - Database dialect to compile for\r\n * @returns Compiled query with SQL and parameters\r\n */\r\n compile(dialect: Dialect): CompiledQuery {\r\n return dialect.compileSelect(this.context.state.ast);\r\n }\r\n\r\n /**\r\n * Converts the query to SQL string for a specific dialect\r\n * @param dialect - Database dialect to generate SQL for\r\n * @returns SQL string representation of the query\r\n */\r\n toSql(dialect: Dialect): string {\r\n return this.compile(dialect).sql;\r\n }\r\n\r\n /**\r\n * Gets the hydration plan for the query\r\n * @returns Hydration plan or undefined if none exists\r\n */\r\n getHydrationPlan(): HydrationPlan | undefined {\r\n return this.context.hydration.getPlan();\r\n }\r\n\r\n /**\r\n * Gets the Abstract Syntax Tree (AST) representation of the query\r\n * @returns Query AST with hydration applied\r\n */\r\n getAST(): SelectQueryNode {\r\n return this.context.hydration.applyToAst(this.context.state.ast);\r\n }\r\n}\r\n\r\n/**\r\n * Creates a column node for use in expressions\r\n * @param table - Table name\r\n * @param name - Column name\r\n * @returns ColumnNode with the specified table and name\r\n */\r\nexport const createColumn = (table: string, name: string): ColumnNode => ({ type: 'Column', table, name });\r\n\r\n/**\r\n * Creates a literal value node for use in expressions\r\n * @param val - Literal value (string or number)\r\n * @returns LiteralNode with the specified value\r\n */\r\nexport const createLiteral = (val: string | number): LiteralNode => ({ type: 'Literal', value: val });\r\n","import { SelectQueryBuilder } from '../query-builder/select.js';\nimport {\n hasMany,\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.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","state","hydration","relationSelectionResult","toKey","toKey","toKey","toKey","toKey","hasMany","belongsTo"]}
1
+ {"version":3,"sources":["../../src/decorators/index.ts","../../src/schema/table.ts","../../src/orm/entity-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/ast/aggregate-functions.ts","../../src/query-builder/select-query-state.ts","../../src/core/ast/join-node.ts","../../src/core/sql/sql.ts","../../src/query-builder/hydration-manager.ts","../../src/query-builder/relation-alias.ts","../../src/query-builder/relation-utils.ts","../../src/query-builder/hydration-planner.ts","../../src/core/ast/builders.ts","../../src/query-builder/raw-column-parser.ts","../../src/query-builder/query-ast-service.ts","../../src/query-builder/relation-projection-helper.ts","../../src/query-builder/relation-conditions.ts","../../src/query-builder/relation-service.ts","../../src/query-builder/select-query-builder-deps.ts","../../src/query-builder/column-selector.ts","../../src/query-builder/relation-manager.ts","../../src/orm/hydration.ts","../../src/orm/entity-meta.ts","../../src/orm/relations/has-many.ts","../../src/orm/relations/belongs-to.ts","../../src/orm/relations/many-to-many.ts","../../src/orm/lazy-batch.ts","../../src/orm/entity.ts","../../src/orm/execute.ts","../../src/query-builder/select.ts","../../src/decorators/bootstrap.ts"],"sourcesContent":["export * from './entity.js';\nexport * from './column.js';\nexport * from './relations.js';\nexport * from './bootstrap.js';\n","import { ColumnDef } from './column.js';\nimport { RelationDef } from './relation.js';\n\nexport interface IndexColumn {\n column: string;\n order?: 'ASC' | 'DESC';\n nulls?: 'FIRST' | 'LAST';\n}\n\nexport interface IndexDef {\n name?: string;\n columns: (string | IndexColumn)[];\n unique?: boolean;\n where?: string;\n}\n\nexport interface CheckConstraint {\n name?: string;\n expression: string;\n}\n\nexport interface TableOptions {\n schema?: string;\n primaryKey?: string[];\n indexes?: IndexDef[];\n checks?: CheckConstraint[];\n comment?: string;\n engine?: string;\n charset?: string;\n collation?: string;\n}\n\nexport interface TableHooks {\n beforeInsert?(ctx: unknown, entity: any): Promise<void> | void;\n afterInsert?(ctx: unknown, entity: any): Promise<void> | void;\n beforeUpdate?(ctx: unknown, entity: any): Promise<void> | void;\n afterUpdate?(ctx: unknown, entity: any): Promise<void> | void;\n beforeDelete?(ctx: unknown, entity: any): Promise<void> | void;\r\n afterDelete?(ctx: unknown, entity: any): Promise<void> | void;\r\n}\r\n\r\n/**\r\n * Definition of a database table with its columns and relationships\r\n * @typeParam T - Type of the columns record\r\n */\r\nexport interface TableDef<T extends Record<string, ColumnDef> = Record<string, ColumnDef>> {\n /** Name of the table */\n name: string;\n /** Optional schema/catalog name */\n schema?: string;\n /** Record of column definitions keyed by column name */\n columns: T;\n /** Record of relationship definitions keyed by relation name */\n relations: Record<string, RelationDef>;\n /** Optional lifecycle hooks */\n hooks?: TableHooks;\n /** Composite primary key definition (falls back to column.primary flags) */\n primaryKey?: string[];\n /** Secondary indexes */\n indexes?: IndexDef[];\n /** Table-level check constraints */\n checks?: CheckConstraint[];\n /** Table comment/description */\n comment?: string;\n /** Dialect-specific options */\n engine?: string;\n charset?: string;\n collation?: string;\n}\n\r\n/**\r\n * Creates a table definition with columns and relationships\r\n * @typeParam T - Type of the columns record\r\n * @param name - Name of the table\r\n * @param columns - Record of column definitions\r\n * @param relations - Record of relationship definitions (optional)\r\n * @returns Complete table definition with runtime-filled column metadata\r\n *\r\n * @example\r\n * ```typescript\r\n * const usersTable = defineTable('users', {\r\n * id: col.primaryKey(col.int()),\r\n * name: col.varchar(255),\r\n * email: col.varchar(255)\r\n * });\r\n * ```\r\n */\r\nexport const defineTable = <T extends Record<string, ColumnDef>>(\n name: string,\n columns: T,\n relations: Record<string, RelationDef> = {},\n hooks?: TableHooks,\n options: TableOptions = {}\n): TableDef<T> => {\n // Runtime mutability to assign names to column definitions for convenience\n const colsWithNames = Object.entries(columns).reduce((acc, [key, def]) => {\n (acc as any)[key] = { ...def, name: key, table: name };\n return acc;\n }, {} as T);\n\n return {\n name,\n schema: options.schema,\n columns: colsWithNames,\n relations,\n hooks,\n primaryKey: options.primaryKey,\n indexes: options.indexes,\n checks: options.checks,\n comment: options.comment,\n engine: options.engine,\n charset: options.charset,\n collation: options.collation\n };\n};\n","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 interface ColumnDefLike {\n type: ColumnType;\n args?: ColumnDef['args'];\n primary?: boolean;\n notNull?: boolean;\n}\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 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 | 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 { TableHooks } from '../schema/table.js';\nimport { setEntityTableName } from '../orm/entity-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 = <T extends new (...args: any[]) => any>(value: T) => {\n const tableName = options.tableName ?? deriveTableNameFromConstructor(value);\n setEntityTableName(value, tableName, options.hooks);\n return value;\n };\n return decorator as unknown as ClassDecorator;\n}\n","import { ColumnDef, ColumnType } from '../schema/column.js';\nimport {\n addColumnMetadata,\n EntityConstructor,\n ColumnDefLike,\n ensureEntityMetadata\n} from '../orm/entity-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 column: ColumnDefLike = {\n type: (input as ColumnOptions).type ?? (input as ColumnDef).type,\n args: (input as ColumnOptions).args ?? (input as ColumnDef).args,\n notNull: (input as ColumnOptions).notNull ?? (input as ColumnDef).notNull,\n primary: (input as ColumnOptions).primary ?? (input as ColumnDef).primary\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\nexport function Column(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n const decorator = (target: object, propertyKey: string | symbol) => {\n const propertyName = normalizePropertyName(propertyKey);\n const ctor = resolveConstructor(target);\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 as PropertyDecorator;\n}\n\nexport function PrimaryKey(definition: ColumnInput) {\n const normalized = normalizeColumnInput(definition);\n normalized.primary = true;\n return Column(normalized);\n}\n","import { TableDef } from './table.js';\r\n\r\n/**\r\n * Types of relationships supported between tables\r\n */\r\nexport const RelationKinds = {\r\n /** One-to-many relationship */\r\n HasMany: 'HAS_MANY',\r\n /** Many-to-one relationship */\r\n BelongsTo: 'BELONGS_TO',\r\n /** Many-to-many relationship with pivot metadata */\r\n BelongsToMany: 'BELONGS_TO_MANY'\r\n} as const;\r\n\r\n/**\r\n * Type representing the supported relationship kinds\r\n */\r\nexport type RelationType = (typeof RelationKinds)[keyof typeof RelationKinds];\r\n\r\nexport type CascadeMode = 'none' | 'all' | 'persist' | 'remove' | 'link';\r\n\r\n/**\r\n * One-to-many relationship definition\r\n */\r\nexport interface HasManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.HasMany;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-one relationship definition\r\n */\r\nexport interface BelongsToRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsTo;\r\n target: TTarget;\r\n foreignKey: string;\r\n localKey?: string;\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Many-to-many relationship definition with rich pivot metadata\r\n */\r\nexport interface BelongsToManyRelation<TTarget extends TableDef = TableDef> {\r\n type: typeof RelationKinds.BelongsToMany;\r\n target: TTarget;\r\n pivotTable: TableDef;\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n}\r\n\r\n/**\r\n * Union type representing any supported relationship definition\r\n */\r\nexport type RelationDef =\r\n | HasManyRelation\r\n | BelongsToRelation\r\n | BelongsToManyRelation;\r\n\r\n/**\r\n * Creates a one-to-many relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns HasManyRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * hasMany(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const hasMany = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): HasManyRelation<TTarget> => ({\r\n type: RelationKinds.HasMany,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-one relationship definition\r\n * @param target - Target table of the relationship\r\n * @param foreignKey - Foreign key column name on the child table\r\n * @param localKey - Local key column name (optional)\r\n * @returns BelongsToRelation definition\r\n *\r\n * @example\r\n * ```typescript\r\n * belongsTo(usersTable, 'user_id')\r\n * ```\r\n */\r\nexport const belongsTo = <TTarget extends TableDef>(\r\n target: TTarget,\r\n foreignKey: string,\r\n localKey?: string,\r\n cascade?: CascadeMode\r\n): BelongsToRelation<TTarget> => ({\r\n type: RelationKinds.BelongsTo,\r\n target,\r\n foreignKey,\r\n localKey,\r\n cascade\r\n});\r\n\r\n/**\r\n * Creates a many-to-many relationship definition with pivot metadata\r\n * @param target - Target table\r\n * @param pivotTable - Intermediate pivot table definition\r\n * @param options - Pivot metadata configuration\r\n * @returns BelongsToManyRelation definition\r\n */\r\nexport const belongsToMany = <\r\n TTarget extends TableDef\r\n>(\r\n target: TTarget,\r\n pivotTable: TableDef,\r\n options: {\r\n pivotForeignKeyToRoot: string;\r\n pivotForeignKeyToTarget: string;\r\n localKey?: string;\r\n targetKey?: string;\r\n pivotPrimaryKey?: string;\r\n defaultPivotColumns?: string[];\r\n cascade?: CascadeMode;\r\n }\r\n): BelongsToManyRelation<TTarget> => ({\r\n type: RelationKinds.BelongsToMany,\r\n target,\r\n pivotTable,\r\n pivotForeignKeyToRoot: options.pivotForeignKeyToRoot,\r\n pivotForeignKeyToTarget: options.pivotForeignKeyToTarget,\r\n localKey: options.localKey,\r\n targetKey: options.targetKey,\r\n pivotPrimaryKey: options.pivotPrimaryKey,\r\n defaultPivotColumns: options.defaultPivotColumns,\r\n cascade: options.cascade\r\n});\r\n","import { CascadeMode, RelationKinds } from '../schema/relation.js';\nimport {\n addRelationMetadata,\n EntityConstructor,\n EntityOrTableTargetResolver,\n RelationMetadata\n} from '../orm/entity-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 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 = (target: object, propertyKey: string | symbol) => {\n const propertyName = normalizePropertyName(propertyKey);\n const ctor = resolveConstructor(target);\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 as PropertyDecorator;\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 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 { ColumnDef } from '../../schema/column.js';\r\nimport type { SelectQueryNode, OrderByNode } from './query.js';\r\nimport { SqlOperator } from '../sql/sql.js';\r\n\r\n/**\r\n * AST node representing a literal value\r\n */\r\nexport interface LiteralNode {\r\n type: 'Literal';\r\n /** The literal value (string, number, boolean, or null) */\r\n value: string | number | boolean | null;\r\n}\r\n\r\n/**\r\n * AST node representing a column reference\r\n */\r\nexport interface ColumnNode {\r\n type: 'Column';\r\n /** Table name the column belongs to */\r\n table: string;\r\n /** Column name */\r\n name: string;\r\n /** Optional alias for the column */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a function call\r\n */\r\nexport interface FunctionNode {\r\n type: 'Function';\r\n /** Function name (e.g., COUNT, SUM) */\r\n name: string;\r\n /** Function arguments */\r\n args: (ColumnNode | LiteralNode | JsonPathNode)[];\r\n /** Optional alias for the function result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a JSON path expression\r\n */\r\nexport interface JsonPathNode {\r\n type: 'JsonPath';\r\n /** Source column */\r\n column: ColumnNode;\r\n /** JSON path expression */\r\n path: string;\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a scalar subquery\r\n */\r\nexport interface ScalarSubqueryNode {\r\n type: 'ScalarSubquery';\r\n /** Subquery to execute */\r\n query: SelectQueryNode;\r\n /** Optional alias for the subquery result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a CASE expression\r\n */\r\nexport interface CaseExpressionNode {\r\n type: 'CaseExpression';\r\n /** WHEN-THEN conditions */\r\n conditions: { when: ExpressionNode; then: OperandNode }[];\r\n /** Optional ELSE clause */\r\n else?: OperandNode;\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * AST node representing a window function\r\n */\r\nexport interface WindowFunctionNode {\r\n type: 'WindowFunction';\r\n /** Window function name (e.g., ROW_NUMBER, RANK) */\r\n name: string;\r\n /** Function arguments */\r\n args: (ColumnNode | LiteralNode | JsonPathNode)[];\r\n /** Optional PARTITION BY clause */\r\n partitionBy?: ColumnNode[];\r\n /** Optional ORDER BY clause */\r\n orderBy?: OrderByNode[];\r\n /** Optional alias for the result */\r\n alias?: string;\r\n}\r\n\r\n/**\r\n * Union type representing any operand that can be used in expressions\r\n */\r\nexport type OperandNode =\r\n | ColumnNode\r\n | LiteralNode\r\n | FunctionNode\r\n | JsonPathNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | WindowFunctionNode;\r\n\r\nconst operandTypes = new Set<OperandNode['type']>([\r\n 'Column',\r\n 'Literal',\r\n 'Function',\r\n 'JsonPath',\r\n 'ScalarSubquery',\r\n 'CaseExpression',\r\n 'WindowFunction'\r\n]);\r\n\r\nexport const isOperandNode = (node: any): node is OperandNode => node && operandTypes.has(node.type);\r\n\r\nexport const isFunctionNode = (node: any): node is FunctionNode => node?.type === 'Function';\r\nexport const isCaseExpressionNode = (node: any): node is CaseExpressionNode => node?.type === 'CaseExpression';\r\nexport const isWindowFunctionNode = (node: any): node is WindowFunctionNode => node?.type === 'WindowFunction';\r\nexport const isExpressionSelectionNode = (\r\n node: ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode\r\n): node is FunctionNode | CaseExpressionNode | WindowFunctionNode =>\r\n isFunctionNode(node) || isCaseExpressionNode(node) || isWindowFunctionNode(node);\r\n\r\n/**\r\n * AST node representing a binary expression (e.g., column = value)\r\n */\r\nexport interface BinaryExpressionNode {\r\n type: 'BinaryExpression';\r\n /** Left operand */\r\n left: OperandNode;\r\n /** Comparison operator */\r\n operator: SqlOperator;\r\n /** Right operand */\r\n right: OperandNode;\r\n /** Optional escape character for LIKE expressions */\r\n escape?: LiteralNode;\r\n}\r\n\r\n/**\r\n * AST node representing a logical expression (AND/OR)\r\n */\r\nexport interface LogicalExpressionNode {\r\n type: 'LogicalExpression';\r\n /** Logical operator (AND or OR) */\r\n operator: 'AND' | 'OR';\r\n /** Operands to combine */\r\n operands: ExpressionNode[];\r\n}\r\n\r\n/**\r\n * AST node representing a null check expression\r\n */\r\nexport interface NullExpressionNode {\r\n type: 'NullExpression';\r\n /** Operand to check for null */\r\n left: OperandNode;\r\n /** Null check operator */\r\n operator: 'IS NULL' | 'IS NOT NULL';\r\n}\r\n\r\n/**\r\n * AST node representing an IN/NOT IN expression\r\n */\r\nexport interface InExpressionNode {\r\n type: 'InExpression';\r\n /** Left operand to check */\r\n left: OperandNode;\r\n /** IN/NOT IN operator */\r\n operator: 'IN' | 'NOT IN';\r\n /** Values to check against */\r\n right: OperandNode[];\r\n}\r\n\r\n/**\r\n * AST node representing an EXISTS/NOT EXISTS expression\r\n */\r\nexport interface ExistsExpressionNode {\r\n type: 'ExistsExpression';\r\n /** EXISTS/NOT EXISTS operator */\r\n operator: SqlOperator;\r\n /** Subquery to check */\r\n subquery: SelectQueryNode;\r\n}\r\n\r\n/**\r\n * AST node representing a BETWEEN/NOT BETWEEN expression\r\n */\r\nexport interface BetweenExpressionNode {\r\n type: 'BetweenExpression';\r\n /** Operand to check */\r\n left: OperandNode;\r\n /** BETWEEN/NOT BETWEEN operator */\r\n operator: 'BETWEEN' | 'NOT BETWEEN';\r\n /** Lower bound */\r\n lower: OperandNode;\r\n /** Upper bound */\r\n upper: OperandNode;\r\n}\r\n\r\n/**\r\n * Union type representing any supported expression node\r\n */\r\nexport type ExpressionNode =\r\n | BinaryExpressionNode\r\n | LogicalExpressionNode\r\n | NullExpressionNode\r\n | InExpressionNode\r\n | ExistsExpressionNode\r\n | BetweenExpressionNode;\r\n","import { ColumnDef } from '../../schema/column.js';\r\nimport { SelectQueryNode } from './query.js';\r\nimport { SqlOperator } from '../sql/sql.js';\r\nimport {\r\n ColumnNode,\r\n FunctionNode,\r\n LiteralNode,\r\n JsonPathNode,\r\n OperandNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n BinaryExpressionNode,\r\n ExpressionNode,\r\n LogicalExpressionNode,\r\n NullExpressionNode,\r\n InExpressionNode,\r\n ExistsExpressionNode,\r\n BetweenExpressionNode,\r\n isOperandNode\r\n} from './expression-nodes.js';\r\n\r\n/**\r\n * Converts a primitive or existing operand into an operand node\r\n * @param value - Value or operand to normalize\r\n * @returns OperandNode representing the value\r\n */\r\nexport const valueToOperand = (value: unknown): OperandNode => {\r\n if (\r\n value === null ||\r\n value === undefined ||\r\n typeof value === 'string' ||\r\n typeof value === 'number' ||\r\n typeof value === 'boolean'\r\n ) {\r\n return { type: 'Literal', value: value === undefined ? null : value } as LiteralNode;\r\n }\r\n return value as OperandNode;\r\n};\r\n\r\nconst toNode = (col: ColumnDef | OperandNode): OperandNode => {\r\n if (isOperandNode(col)) return col as OperandNode;\r\n const def = col as ColumnDef;\r\n return { type: 'Column', table: def.table || 'unknown', name: def.name };\r\n};\r\n\r\nconst toLiteralNode = (value: string | number | boolean | null): LiteralNode => ({\r\n type: 'Literal',\r\n value\r\n});\r\n\r\nconst toOperand = (val: OperandNode | ColumnDef | string | number | boolean | null): OperandNode => {\r\n if (val === null) return { type: 'Literal', value: null };\r\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean') {\r\n return { type: 'Literal', value: val };\r\n }\r\n return toNode(val as OperandNode | ColumnDef);\r\n};\r\n\r\nexport const columnOperand = (col: ColumnDef | ColumnNode): ColumnNode => toNode(col) as ColumnNode;\r\n\r\nconst createBinaryExpression = (\r\n operator: SqlOperator,\r\n left: OperandNode | ColumnDef,\r\n right: OperandNode | ColumnDef | string | number | boolean | null,\r\n escape?: string\r\n): BinaryExpressionNode => {\r\n const node: BinaryExpressionNode = {\r\n type: 'BinaryExpression',\r\n left: toNode(left),\r\n operator,\r\n right: toOperand(right)\r\n };\r\n\r\n if (escape !== undefined) {\r\n node.escape = toLiteralNode(escape);\r\n }\r\n\r\n return node;\r\n};\r\n\r\n/**\r\n * Creates an equality expression (left = right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with equality operator\r\n */\r\nexport const eq = (left: OperandNode | ColumnDef, right: OperandNode | ColumnDef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('=', left, right);\r\n\r\n/**\r\n * Creates a not equal expression (left != right)\r\n */\r\nexport const neq = (\r\n left: OperandNode | ColumnDef,\r\n right: OperandNode | ColumnDef | string | number\r\n): BinaryExpressionNode => createBinaryExpression('!=', left, right);\r\n\r\n/**\r\n * Creates a greater-than expression (left > right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with greater-than operator\r\n */\r\nexport const gt = (left: OperandNode | ColumnDef, right: OperandNode | ColumnDef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>', left, right);\r\n\r\n/**\r\n * Creates a greater than or equal expression (left >= right)\r\n */\r\nexport const gte = (left: OperandNode | ColumnDef, right: OperandNode | ColumnDef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('>=', left, right);\r\n\r\n/**\r\n * Creates a less-than expression (left < right)\r\n * @param left - Left operand\r\n * @param right - Right operand\r\n * @returns Binary expression node with less-than operator\r\n */\r\nexport const lt = (left: OperandNode | ColumnDef, right: OperandNode | ColumnDef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<', left, right);\r\n\r\n/**\r\n * Creates a less than or equal expression (left <= right)\r\n */\r\nexport const lte = (left: OperandNode | ColumnDef, right: OperandNode | ColumnDef | string | number): BinaryExpressionNode =>\r\n createBinaryExpression('<=', left, right);\r\n\r\n/**\r\n * Creates a LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with LIKE operator\r\n */\r\nexport const like = (left: OperandNode | ColumnDef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a NOT LIKE pattern matching expression\r\n * @param left - Left operand\r\n * @param pattern - Pattern to match\r\n * @param escape - Optional escape character\r\n * @returns Binary expression node with NOT LIKE operator\r\n */\r\nexport const notLike = (left: OperandNode | ColumnDef, pattern: string, escape?: string): BinaryExpressionNode =>\r\n createBinaryExpression('NOT LIKE', left, pattern, escape);\r\n\r\n/**\r\n * Creates a logical AND expression\r\n * @param operands - Expressions to combine with AND\r\n * @returns Logical expression node with AND operator\r\n */\r\nexport const and = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'AND',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates a logical OR expression\r\n * @param operands - Expressions to combine with OR\r\n * @returns Logical expression node with OR operator\r\n */\r\nexport const or = (...operands: ExpressionNode[]): LogicalExpressionNode => ({\r\n type: 'LogicalExpression',\r\n operator: 'OR',\r\n operands\r\n});\r\n\r\n/**\r\n * Creates an IS NULL expression\r\n * @param left - Operand to check for null\r\n * @returns Null expression node with IS NULL operator\r\n */\r\nexport const isNull = (left: OperandNode | ColumnDef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toNode(left),\r\n operator: 'IS NULL'\r\n});\r\n\r\n/**\r\n * Creates an IS NOT NULL expression\r\n * @param left - Operand to check for non-null\r\n * @returns Null expression node with IS NOT NULL operator\r\n */\r\nexport const isNotNull = (left: OperandNode | ColumnDef): NullExpressionNode => ({\r\n type: 'NullExpression',\r\n left: toNode(left),\r\n operator: 'IS NOT NULL'\r\n});\r\n\r\nconst createInExpression = (\r\n operator: 'IN' | 'NOT IN',\r\n left: OperandNode | ColumnDef,\r\n values: (string | number | LiteralNode)[]\r\n): InExpressionNode => ({\r\n type: 'InExpression',\r\n left: toNode(left),\r\n operator,\r\n right: values.map(v => toOperand(v))\r\n});\r\n\r\n/**\r\n * Creates an IN expression (value IN list)\r\n * @param left - Operand to check\r\n * @param values - Values to check against\r\n * @returns IN expression node\r\n */\r\nexport const inList = (left: OperandNode | ColumnDef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('IN', left, values);\r\n\r\n/**\r\n * Creates a NOT IN expression (value NOT IN list)\r\n * @param left - Operand to check\r\n * @param values - Values to check against\r\n * @returns NOT IN expression node\r\n */\r\nexport const notInList = (left: OperandNode | ColumnDef, values: (string | number | LiteralNode)[]): InExpressionNode =>\r\n createInExpression('NOT IN', left, values);\r\n\r\nconst createBetweenExpression = (\r\n operator: 'BETWEEN' | 'NOT BETWEEN',\r\n left: OperandNode | ColumnDef,\r\n lower: OperandNode | ColumnDef | string | number,\r\n upper: OperandNode | ColumnDef | string | number\r\n): BetweenExpressionNode => ({\r\n type: 'BetweenExpression',\r\n left: toNode(left),\r\n operator,\r\n lower: toOperand(lower),\r\n upper: toOperand(upper)\r\n});\r\n\r\n/**\r\n * Creates a BETWEEN expression (value BETWEEN lower AND upper)\r\n * @param left - Operand to check\r\n * @param lower - Lower bound\r\n * @param upper - Upper bound\r\n * @returns BETWEEN expression node\r\n */\r\nexport const between = (\r\n left: OperandNode | ColumnDef,\r\n lower: OperandNode | ColumnDef | string | number,\r\n upper: OperandNode | ColumnDef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('BETWEEN', left, lower, upper);\r\n\r\n/**\r\n * Creates a NOT BETWEEN expression (value NOT BETWEEN lower AND upper)\r\n * @param left - Operand to check\r\n * @param lower - Lower bound\r\n * @param upper - Upper bound\r\n * @returns NOT BETWEEN expression node\r\n */\r\nexport const notBetween = (\r\n left: OperandNode | ColumnDef,\r\n lower: OperandNode | ColumnDef | string | number,\r\n upper: OperandNode | ColumnDef | string | number\r\n): BetweenExpressionNode => createBetweenExpression('NOT BETWEEN', left, lower, upper);\r\n\r\n/**\r\n * Creates a JSON path expression\r\n * @param col - Source column\r\n * @param path - JSON path expression\r\n * @returns JSON path node\r\n */\r\nexport const jsonPath = (col: ColumnDef | ColumnNode, path: string): JsonPathNode => ({\r\n type: 'JsonPath',\r\n column: columnOperand(col),\r\n path\r\n});\r\n\r\n/**\r\n * Creates a CASE expression\r\n * @param conditions - Array of WHEN-THEN conditions\r\n * @param elseValue - Optional ELSE value\r\n * @returns CASE expression node\r\n */\r\nexport const caseWhen = (\r\n conditions: { when: ExpressionNode; then: OperandNode | ColumnDef | string | number | boolean | null }[],\r\n elseValue?: OperandNode | ColumnDef | string | number | boolean | null\r\n): CaseExpressionNode => ({\r\n type: 'CaseExpression',\r\n conditions: conditions.map(c => ({\r\n when: c.when,\r\n then: toOperand(c.then)\r\n })),\r\n else: elseValue !== undefined ? toOperand(elseValue) : undefined\r\n});\r\n\r\n/**\r\n * Creates an EXISTS expression\r\n * @param subquery - Subquery to check for existence\r\n * @returns EXISTS expression node\r\n */\r\nexport const exists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'EXISTS',\r\n subquery\r\n});\r\n\r\n/**\r\n * Creates a NOT EXISTS expression\r\n * @param subquery - Subquery to check for non-existence\r\n * @returns NOT EXISTS expression node\r\n */\r\nexport const notExists = (subquery: SelectQueryNode): ExistsExpressionNode => ({\r\n type: 'ExistsExpression',\r\n operator: 'NOT EXISTS',\r\n subquery\r\n});\r\n","import { ColumnDef } from '../../schema/column.js';\r\nimport { ColumnNode, FunctionNode } from './expression-nodes.js';\r\nimport { columnOperand } from './expression-builders.js';\r\n\r\nconst buildAggregate = (name: string) => (col: ColumnDef | ColumnNode): FunctionNode => ({\r\n type: 'Function',\r\n name,\r\n args: [columnOperand(col)]\r\n});\r\n\r\n/**\r\n * Creates a COUNT function expression\r\n * @param col - Column to count\r\n * @returns Function node with COUNT\r\n */\r\nexport const count = buildAggregate('COUNT');\r\n\r\n/**\r\n * Creates a SUM function expression\r\n * @param col - Column to sum\r\n * @returns Function node with SUM\r\n */\r\nexport const sum = buildAggregate('SUM');\r\n\r\n/**\r\n * Creates an AVG function expression\r\n * @param col - Column to average\r\n * @returns Function node with AVG\r\n */\r\nexport const avg = buildAggregate('AVG');\r\n","import { TableDef } from '../schema/table.js';\r\nimport { SelectQueryNode, CommonTableExpressionNode, OrderByNode, SetOperationNode } from '../core/ast/query.js';\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n ScalarSubqueryNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode\r\n} from '../core/ast/expression.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\n\r\n/**\r\n * Node types that can be used in query projections\r\n */\r\nexport type ProjectionNode =\r\n | ColumnNode\r\n | FunctionNode\r\n | ScalarSubqueryNode\r\n | CaseExpressionNode\r\n | WindowFunctionNode;\r\n\r\n/**\r\n * Manages the state of a SELECT query being built\r\n */\r\nexport class SelectQueryState {\r\n /**\r\n * Table definition for the query\r\n */\r\n public readonly table: TableDef;\r\n /**\r\n * Abstract Syntax Tree (AST) representation of the query\r\n */\r\n public readonly ast: SelectQueryNode;\r\n\r\n /**\r\n * Creates a new SelectQueryState instance\r\n * @param table - Table definition\r\n * @param ast - Optional existing AST\r\n */\r\n constructor(table: TableDef, ast?: SelectQueryNode) {\r\n this.table = table;\r\n this.ast = ast ?? {\r\n type: 'SelectQuery',\r\n from: { type: 'Table', name: table.name },\r\n columns: [],\r\n joins: []\r\n };\r\n }\r\n\r\n /**\r\n * Creates a new SelectQueryState with updated AST\r\n * @param nextAst - Updated AST\r\n * @returns New SelectQueryState instance\r\n */\r\n private clone(nextAst: SelectQueryNode): SelectQueryState {\r\n return new SelectQueryState(this.table, nextAst);\r\n }\r\n\r\n /**\r\n * Adds columns to the query\r\n * @param newCols - Columns to add\r\n * @returns New SelectQueryState with added columns\r\n */\r\n withColumns(newCols: ProjectionNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n columns: [...(this.ast.columns ?? []), ...newCols]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a join to the query\r\n * @param join - Join node to add\r\n * @returns New SelectQueryState with added join\r\n */\r\n withJoin(join: JoinNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n joins: [...(this.ast.joins ?? []), join]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a WHERE clause to the query\r\n * @param predicate - WHERE predicate expression\r\n * @returns New SelectQueryState with WHERE clause\r\n */\r\n withWhere(predicate: ExpressionNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n where: predicate\r\n });\r\n }\r\n\r\n /**\r\n * Adds a HAVING clause to the query\r\n * @param predicate - HAVING predicate expression\r\n * @returns New SelectQueryState with HAVING clause\r\n */\r\n withHaving(predicate: ExpressionNode): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n having: predicate\r\n });\r\n }\r\n\r\n /**\r\n * Adds GROUP BY columns to the query\r\n * @param columns - Columns to group by\r\n * @returns New SelectQueryState with GROUP BY clause\r\n */\r\n withGroupBy(columns: ColumnNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n groupBy: [...(this.ast.groupBy ?? []), ...columns]\r\n });\r\n }\r\n\r\n /**\r\n * Adds ORDER BY clauses to the query\r\n * @param orderBy - ORDER BY nodes\r\n * @returns New SelectQueryState with ORDER BY clause\r\n */\r\n withOrderBy(orderBy: OrderByNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n orderBy: [...(this.ast.orderBy ?? []), ...orderBy]\r\n });\r\n }\r\n\r\n /**\r\n * Adds DISTINCT columns to the query\r\n * @param columns - Columns to make distinct\r\n * @returns New SelectQueryState with DISTINCT clause\r\n */\r\n withDistinct(columns: ColumnNode[]): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n distinct: [...(this.ast.distinct ?? []), ...columns]\r\n });\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param limit - Maximum number of rows to return\r\n * @returns New SelectQueryState with LIMIT clause\r\n */\r\n withLimit(limit: number): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n limit\r\n });\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param offset - Number of rows to skip\r\n * @returns New SelectQueryState with OFFSET clause\r\n */\r\n withOffset(offset: number): SelectQueryState {\r\n return this.clone({\r\n ...this.ast,\r\n offset\r\n });\r\n }\r\n\r\n /**\r\n * Adds a Common Table Expression (CTE) to the query\n * @param cte - CTE node to add\n * @returns New SelectQueryState with CTE\n */\n withCte(cte: CommonTableExpressionNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n ctes: [...(this.ast.ctes ?? []), cte]\n });\n }\n\n /**\n * Adds a set operation (UNION/INTERSECT/EXCEPT) to the query\n * @param op - Set operation node to add\n * @returns New SelectQueryState with set operation\n */\n withSetOperation(op: SetOperationNode): SelectQueryState {\n return this.clone({\n ...this.ast,\n setOps: [...(this.ast.setOps ?? []), op]\n });\n }\n}\n","import { JoinNode } from './join.js';\r\nimport { ExpressionNode } from './expression.js';\r\nimport { JoinKind } from '../sql/sql.js';\r\n\r\n/**\r\n * Creates a JoinNode ready for AST insertion.\r\n * Centralizing this avoids copy/pasted object literals when multiple services need to synthesize joins.\r\n */\r\nexport const createJoinNode = (\r\n kind: JoinKind,\r\n tableName: string,\r\n condition: ExpressionNode,\r\n relationName?: string\r\n): JoinNode => ({\r\n type: 'Join',\r\n kind,\r\n table: { type: 'Table', name: tableName },\r\n condition,\r\n relationName\r\n});\r\n","/**\r\n * SQL keywords used in query generation\r\n */\r\nexport const SQL_KEYWORDS = {\r\n /** SELECT clause keyword */\r\n SELECT: 'SELECT',\r\n /** FROM clause keyword */\r\n FROM: 'FROM',\r\n /** WHERE clause keyword */\r\n WHERE: 'WHERE',\r\n /** JOIN keyword */\r\n JOIN: 'JOIN',\r\n /** INNER JOIN keyword */\r\n INNER_JOIN: 'INNER JOIN',\r\n /** LEFT JOIN keyword */\r\n LEFT_JOIN: 'LEFT JOIN',\r\n /** RIGHT JOIN keyword */\r\n RIGHT_JOIN: 'RIGHT JOIN',\r\n /** ORDER BY clause keyword */\r\n ORDER_BY: 'ORDER BY',\r\n /** GROUP BY clause keyword */\r\n GROUP_BY: 'GROUP BY',\r\n /** HAVING clause keyword */\r\n HAVING: 'HAVING',\r\n /** DISTINCT keyword */\r\n DISTINCT: 'DISTINCT',\r\n /** EXISTS operator */\r\n EXISTS: 'EXISTS',\r\n /** NOT EXISTS operator */\r\n NOT_EXISTS: 'NOT EXISTS'\r\n} as const;\r\n\r\n/**\r\n * SQL operators used in query conditions\r\n */\r\nexport const SQL_OPERATORS = {\n /** Equality operator */\n EQUALS: '=',\n /** Not equals operator */\n NOT_EQUALS: '!=',\n /** Greater than operator */\n GREATER_THAN: '>',\n /** Greater than or equal operator */\n GREATER_OR_EQUAL: '>=',\n /** Less than operator */\n LESS_THAN: '<',\n /** Less than or equal operator */\n LESS_OR_EQUAL: '<=',\n /** LIKE pattern matching operator */\n LIKE: 'LIKE',\n /** NOT LIKE pattern matching operator */\n NOT_LIKE: 'NOT LIKE',\n /** IN membership operator */\n IN: 'IN',\n /** NOT IN membership operator */\n NOT_IN: 'NOT IN',\n /** BETWEEN range operator */\n BETWEEN: 'BETWEEN',\n /** NOT BETWEEN range operator */\n NOT_BETWEEN: 'NOT BETWEEN',\n /** IS NULL null check operator */\n IS_NULL: 'IS NULL',\n /** IS NOT NULL null check operator */\n IS_NOT_NULL: 'IS NOT NULL',\n /** Logical AND operator */\n AND: 'AND',\n /** Logical OR operator */\n OR: 'OR',\n /** EXISTS operator */\n EXISTS: 'EXISTS',\n /** NOT EXISTS operator */\n NOT_EXISTS: 'NOT EXISTS'\n} as const;\n\r\n/**\r\n * Type representing any supported SQL operator\r\n */\r\nexport type SqlOperator = (typeof SQL_OPERATORS)[keyof typeof SQL_OPERATORS];\r\n\r\n/**\r\n * Types of SQL joins supported\r\n */\r\nexport const JOIN_KINDS = {\r\n /** INNER JOIN type */\r\n INNER: 'INNER',\r\n /** LEFT JOIN type */\r\n LEFT: 'LEFT',\r\n /** RIGHT JOIN type */\r\n RIGHT: 'RIGHT',\r\n /** CROSS JOIN type */\r\n CROSS: 'CROSS'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported join kind\r\n */\r\nexport type JoinKind = (typeof JOIN_KINDS)[keyof typeof JOIN_KINDS];\r\n\r\n/**\r\n * Ordering directions for result sorting\r\n */\r\nexport const ORDER_DIRECTIONS = {\r\n /** Ascending order */\r\n ASC: 'ASC',\r\n /** Descending order */\r\n DESC: 'DESC'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported order direction\r\n */\r\nexport type OrderDirection = (typeof ORDER_DIRECTIONS)[keyof typeof ORDER_DIRECTIONS];\r\n\r\n/**\r\n * Supported database dialects\r\n */\r\nexport const SUPPORTED_DIALECTS = {\r\n /** MySQL database dialect */\r\n MYSQL: 'mysql',\r\n /** SQLite database dialect */\r\n SQLITE: 'sqlite',\r\n /** Microsoft SQL Server dialect */\r\n MSSQL: 'mssql',\r\n /** PostgreSQL database dialect */\r\n POSTGRES: 'postgres'\r\n} as const;\r\n\r\n/**\r\n * Type representing any supported database dialect\r\n */\r\nexport type DialectName = (typeof SUPPORTED_DIALECTS)[keyof typeof SUPPORTED_DIALECTS];\r\n","import { TableDef } from '../schema/table.js';\nimport { RelationDef, RelationKinds } from '../schema/relation.js';\nimport { CommonTableExpressionNode, HydrationPlan, OrderByNode, SelectQueryNode } from '../core/ast/query.js';\nimport { HydrationPlanner } from './hydration-planner.js';\nimport { ProjectionNode, SelectQueryState } from './select-query-state.js';\nimport { ColumnNode, eq } from '../core/ast/expression.js';\nimport { createJoinNode } from '../core/ast/join-node.js';\nimport { JOIN_KINDS } from '../core/sql/sql.js';\n\r\n/**\r\n * Manages hydration planning for query results\r\n */\r\nexport class HydrationManager {\r\n /**\r\n * Creates a new HydrationManager instance\r\n * @param table - Table definition\r\n * @param planner - Hydration planner\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly planner: HydrationPlanner\r\n ) {}\r\n\r\n /**\r\n * Creates a new HydrationManager with updated planner\r\n * @param nextPlanner - Updated hydration planner\r\n * @returns New HydrationManager instance\r\n */\r\n private clone(nextPlanner: HydrationPlanner): HydrationManager {\r\n return new HydrationManager(this.table, nextPlanner);\r\n }\r\n\r\n /**\r\n * Handles column selection for hydration planning\r\n * @param state - Current query state\r\n * @param newColumns - Newly selected columns\r\n * @returns Updated HydrationManager with captured columns\r\n */\r\n onColumnsSelected(state: SelectQueryState, newColumns: ProjectionNode[]): HydrationManager {\r\n const updated = this.planner.captureRootColumns(newColumns);\r\n return this.clone(updated);\r\n }\r\n\r\n /**\r\n * Handles relation inclusion for hydration planning\r\n * @param state - Current query state\r\n * @param relation - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for the relation\r\n * @param targetColumns - Target columns to include\r\n * @returns Updated HydrationManager with included relation\r\n */\r\n onRelationIncluded(\r\n state: SelectQueryState,\r\n relation: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n targetColumns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationManager {\r\n const withRoots = this.planner.captureRootColumns(state.ast.columns);\r\n const next = withRoots.includeRelation(relation, relationName, aliasPrefix, targetColumns, pivot);\r\n return this.clone(next);\r\n }\r\n\r\n /**\n * Applies hydration plan to the AST\n * @param ast - Query AST to modify\n * @returns AST with hydration metadata\n */\n applyToAst(ast: SelectQueryNode): SelectQueryNode {\n // Hydration is not applied to compound set queries since row identity is ambiguous.\n if (ast.setOps && ast.setOps.length > 0) {\n return ast;\n }\n\n const plan = this.planner.getPlan();\n if (!plan) return ast;\n\n const needsPaginationGuard = this.requiresParentPagination(ast, plan);\n const rewritten = needsPaginationGuard ? this.wrapForParentPagination(ast, plan) : ast;\n return this.attachHydrationMeta(rewritten, plan);\n }\n\r\n /**\r\n * Gets the current hydration plan\r\n * @returns Hydration plan or undefined if none exists\r\n */\r\n getPlan(): HydrationPlan | undefined {\n return this.planner.getPlan();\n }\n\n /**\n * Attaches hydration metadata to a query AST node.\n */\n private attachHydrationMeta(ast: SelectQueryNode, plan: HydrationPlan): SelectQueryNode {\n return {\n ...ast,\n meta: {\n ...(ast.meta || {}),\n hydration: plan\n }\n };\n }\n\n /**\n * Determines whether the query needs pagination rewriting to keep LIMIT/OFFSET\n * applied to parent rows when eager-loading multiplicative relations.\n */\n private requiresParentPagination(ast: SelectQueryNode, plan: HydrationPlan): boolean {\n const hasPagination = ast.limit !== undefined || ast.offset !== undefined;\n return hasPagination && this.hasMultiplyingRelations(plan);\n }\n\n private hasMultiplyingRelations(plan: HydrationPlan): boolean {\n return plan.relations.some(\n rel => rel.type === RelationKinds.HasMany || rel.type === RelationKinds.BelongsToMany\n );\n }\n\n /**\n * Rewrites the query using CTEs so LIMIT/OFFSET target distinct parent rows\n * instead of the joined result set.\n *\n * The strategy:\n * - Hoist the original query (minus limit/offset) into a base CTE.\n * - Select distinct parent ids from that base CTE with the original ordering and pagination.\n * - Join the base CTE against the paged ids to retrieve the joined rows for just that page.\n */\n private wrapForParentPagination(ast: SelectQueryNode, plan: HydrationPlan): SelectQueryNode {\n const projectionNames = this.getProjectionNames(ast.columns);\n if (!projectionNames) {\n return ast;\n }\n\n const projectionAliases = this.buildProjectionAliasMap(ast.columns);\n const projectionSet = new Set(projectionNames);\n const rootPkAlias = projectionAliases.get(`${plan.rootTable}.${plan.rootPrimaryKey}`) ?? plan.rootPrimaryKey;\n\n const baseCteName = this.nextCteName(ast.ctes, '__metal_pagination_base');\n const baseQuery: SelectQueryNode = {\n ...ast,\n ctes: undefined,\n limit: undefined,\n offset: undefined,\n orderBy: undefined,\n meta: undefined\n };\n\n const baseCte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name: baseCteName,\n query: baseQuery,\n recursive: false\n };\n\n const orderBy = this.mapOrderBy(ast.orderBy, plan, projectionAliases, baseCteName, projectionSet);\n // When an order-by uses child-table columns we cannot safely rewrite pagination,\n // so preserve the original query to avoid changing semantics.\n if (orderBy === null) {\n return ast;\n }\n\n const pageCteName = this.nextCteName([...(ast.ctes ?? []), baseCte], '__metal_pagination_page');\n const pagingColumns = this.buildPagingColumns(rootPkAlias, orderBy, baseCteName);\n\n const pageCte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name: pageCteName,\n query: {\n type: 'SelectQuery',\n from: { type: 'Table', name: baseCteName },\n columns: pagingColumns,\n joins: [],\n distinct: [{ type: 'Column', table: baseCteName, name: rootPkAlias }],\n orderBy,\n limit: ast.limit,\n offset: ast.offset\n },\n recursive: false\n };\n\n const joinCondition = eq(\n { type: 'Column', table: baseCteName, name: rootPkAlias },\n { type: 'Column', table: pageCteName, name: rootPkAlias }\n );\n\n const outerColumns: ColumnNode[] = projectionNames.map(name => ({\n type: 'Column',\n table: baseCteName,\n name,\n alias: name\n }));\n\n return {\n type: 'SelectQuery',\n from: { type: 'Table', name: baseCteName },\n columns: outerColumns,\n joins: [createJoinNode(JOIN_KINDS.INNER, pageCteName, joinCondition)],\n orderBy,\n ctes: [...(ast.ctes ?? []), baseCte, pageCte]\n };\n }\n\n private nextCteName(existing: CommonTableExpressionNode[] | undefined, baseName: string): string {\n const names = new Set((existing ?? []).map(cte => cte.name));\n let candidate = baseName;\n let suffix = 1;\n\n while (names.has(candidate)) {\n suffix += 1;\n candidate = `${baseName}_${suffix}`;\n }\n\n return candidate;\n }\n\n private getProjectionNames(columns: ProjectionNode[]): string[] | undefined {\n const names: string[] = [];\n for (const col of columns) {\n const alias = (col as any).alias ?? (col as any).name;\n if (!alias) return undefined;\n names.push(alias);\n }\n return names;\n }\n\n private buildProjectionAliasMap(columns: ProjectionNode[]): Map<string, string> {\n const map = new Map<string, string>();\n for (const col of columns) {\n if ((col as ColumnNode).type !== 'Column') continue;\n const node = col as ColumnNode;\n const key = `${node.table}.${node.name}`;\n map.set(key, node.alias ?? node.name);\n }\n return map;\n }\n\n private mapOrderBy(\n orderBy: OrderByNode[] | undefined,\n plan: HydrationPlan,\n projectionAliases: Map<string, string>,\n baseAlias: string,\n availableColumns: Set<string>\n ): OrderByNode[] | undefined | null {\n if (!orderBy || orderBy.length === 0) {\n return undefined;\n }\n\n const mapped: OrderByNode[] = [];\n\n for (const ob of orderBy) {\n // Only rewrite when ordering by root columns; child columns would reintroduce the pagination bug.\n if (ob.column.table !== plan.rootTable) {\n return null;\n }\n\n const alias = projectionAliases.get(`${ob.column.table}.${ob.column.name}`) ?? ob.column.name;\n if (!availableColumns.has(alias)) {\n return null;\n }\n\n mapped.push({\n type: 'OrderBy',\n column: { type: 'Column', table: baseAlias, name: alias },\n direction: ob.direction\n });\n }\n\n return mapped;\n }\n\n private buildPagingColumns(primaryKey: string, orderBy: OrderByNode[] | undefined, tableAlias: string): ColumnNode[] {\n const columns: ColumnNode[] = [{ type: 'Column', table: tableAlias, name: primaryKey, alias: primaryKey }];\n\n if (!orderBy) return columns;\n\n for (const ob of orderBy) {\n if (!columns.some(col => col.name === ob.column.name)) {\n columns.push({\n type: 'Column',\n table: tableAlias,\n name: ob.column.name,\n alias: ob.column.name\n });\n }\n }\n\n return columns;\n }\n}\n","/**\n * Separator used when projecting relational columns\n */\nconst RELATION_SEPARATOR = '__';\n\n/**\n * Parts of a relation alias\n */\nexport interface RelationAliasParts {\n /**\n * Relation name (left side of the separator)\n */\n relationName: string;\n /**\n * Column name (right side of the separator)\n */\n columnName: string;\n}\n\n/**\n * Builds a relation alias from the relation name and column name components.\n */\nexport const makeRelationAlias = (relationName: string, columnName: string): string =>\n `${relationName}${RELATION_SEPARATOR}${columnName}`;\n\n/**\n * Parses a relation alias into its relation/column components.\n * Returns `null` when the alias does not follow the `relation__column` pattern.\n */\nexport const parseRelationAlias = (alias: string): RelationAliasParts | null => {\n const idx = alias.indexOf(RELATION_SEPARATOR);\n if (idx === -1) return null;\n return {\n relationName: alias.slice(0, idx),\n columnName: alias.slice(idx + RELATION_SEPARATOR.length)\n };\n};\n\n/**\n * Determines whether an alias represents a relation column by checking the `__` convention.\n */\nexport const isRelationAlias = (alias?: string): boolean =>\n !!alias && alias.includes(RELATION_SEPARATOR);\n","import { BelongsToManyRelation } from '../schema/relation.js';\r\n\r\n/**\r\n * Builds a default set of pivot columns, excluding keys used for joins.\r\n */\r\nexport const buildDefaultPivotColumns = (\r\n rel: BelongsToManyRelation,\r\n pivotPk: string\r\n): string[] => {\r\n const excluded = new Set([pivotPk, rel.pivotForeignKeyToRoot, rel.pivotForeignKeyToTarget]);\r\n return Object.keys(rel.pivotTable.columns).filter(col => !excluded.has(col));\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { ProjectionNode } from './select-query-state.js';\r\nimport { HydrationPlan, HydrationRelationPlan } from '../core/ast/query.js';\r\nimport { isRelationAlias } from './relation-alias.js';\r\nimport { buildDefaultPivotColumns } from './relation-utils.js';\r\n\r\n/**\r\n * Finds the primary key column name for a table\r\n * @param table - Table definition\r\n * @returns Name of the primary key column, defaults to 'id'\r\n */\r\nexport const findPrimaryKey = (table: TableDef): string => {\r\n const pk = Object.values(table.columns).find(c => c.primary);\r\n return pk?.name || 'id';\r\n};\r\n\r\n/**\r\n * Manages hydration planning for query results\r\n */\r\nexport class HydrationPlanner {\r\n /**\r\n * Creates a new HydrationPlanner instance\r\n * @param table - Table definition\r\n * @param plan - Optional existing hydration plan\r\n */\r\n constructor(private readonly table: TableDef, private readonly plan?: HydrationPlan) { }\r\n\r\n /**\r\n * Captures root table columns for hydration planning\r\n * @param columns - Columns to capture\r\n * @returns Updated HydrationPlanner with captured columns\r\n */\r\n captureRootColumns(columns: ProjectionNode[]): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const rootCols = new Set(currentPlan.rootColumns);\r\n let changed = false;\r\n\r\n columns.forEach(node => {\r\n if (node.type !== 'Column') return;\r\n if (node.table !== this.table.name) return;\r\n\r\n const alias = node.alias || node.name;\r\n if (isRelationAlias(alias)) return;\r\n if (!rootCols.has(alias)) {\r\n rootCols.add(alias);\r\n changed = true;\r\n }\r\n });\r\n\r\n if (!changed) return this;\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n rootColumns: Array.from(rootCols)\r\n });\r\n }\r\n\r\n /**\r\n * Includes a relation in the hydration plan\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Updated HydrationPlanner with included relation\r\n */\r\n includeRelation(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationPlanner {\r\n const currentPlan = this.getPlanOrDefault();\r\n const relations = currentPlan.relations.filter(r => r.name !== relationName);\r\n relations.push(this.buildRelationPlan(rel, relationName, aliasPrefix, columns, pivot));\r\n return new HydrationPlanner(this.table, {\r\n ...currentPlan,\r\n relations\r\n });\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan\r\n * @returns Current hydration plan or undefined\r\n */\r\n getPlan(): HydrationPlan | undefined {\r\n return this.plan;\r\n }\r\n\r\n /**\r\n * Gets the current hydration plan or creates a default one\r\n * @returns Current hydration plan or default plan\r\n */\r\n private getPlanOrDefault(): HydrationPlan {\r\n return this.plan ?? buildDefaultHydrationPlan(this.table);\r\n }\r\n\r\n /**\r\n * Builds a relation plan for hydration\r\n * @param rel - Relation definition\r\n * @param relationName - Name of the relation\r\n * @param aliasPrefix - Alias prefix for relation columns\r\n * @param columns - Columns to include from the relation\r\n * @returns Hydration relation plan\r\n */\r\n private buildRelationPlan(\r\n rel: RelationDef,\r\n relationName: string,\r\n aliasPrefix: string,\r\n columns: string[],\r\n pivot?: { aliasPrefix: string; columns: string[] }\r\n ): HydrationRelationPlan {\r\n switch (rel.type) {\r\n case RelationKinds.HasMany: {\r\n const localKey = rel.localKey || findPrimaryKey(this.table);\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsTo: {\r\n const localKey = rel.localKey || findPrimaryKey(rel.target);\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: rel.target.name,\r\n targetPrimaryKey: findPrimaryKey(rel.target),\r\n foreignKey: rel.foreignKey,\r\n localKey,\r\n columns\r\n };\r\n }\r\n case RelationKinds.BelongsToMany: {\r\n const many = rel as BelongsToManyRelation;\r\n const localKey = many.localKey || findPrimaryKey(this.table);\r\n const targetPk = many.targetKey || findPrimaryKey(many.target);\r\n const pivotPk = many.pivotPrimaryKey || findPrimaryKey(many.pivotTable);\r\n const pivotAliasPrefix = pivot?.aliasPrefix ?? `${aliasPrefix}_pivot`;\r\n const pivotColumns =\r\n pivot?.columns ??\r\n many.defaultPivotColumns ??\r\n buildDefaultPivotColumns(many, pivotPk);\r\n\r\n return {\r\n name: relationName,\r\n aliasPrefix,\r\n type: rel.type,\r\n targetTable: many.target.name,\r\n targetPrimaryKey: targetPk,\r\n foreignKey: many.pivotForeignKeyToRoot,\r\n localKey,\r\n columns,\r\n pivot: {\r\n table: many.pivotTable.name,\r\n primaryKey: pivotPk,\r\n aliasPrefix: pivotAliasPrefix,\r\n columns: pivotColumns\r\n }\r\n };\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Builds a default hydration plan for a table\r\n * @param table - Table definition\r\n * @returns Default hydration plan\r\n */\r\nconst buildDefaultHydrationPlan = (table: TableDef): HydrationPlan => ({\r\n rootTable: table.name,\r\n rootPrimaryKey: findPrimaryKey(table),\r\n rootColumns: [],\r\n relations: []\r\n});\r\n","import { ColumnDef } from '../../schema/column.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { ColumnNode } from './expression-nodes.js';\r\nimport { TableNode } from './query.js';\r\n\r\n/**\r\n * Builds or normalizes a column AST node from a column definition or existing node\r\n * @param table - Table definition providing a default table name\r\n * @param column - Column definition or existing column node\r\n */\r\nexport const buildColumnNode = (table: TableDef, column: ColumnDef | ColumnNode): ColumnNode => {\r\n if ((column as ColumnNode).type === 'Column') {\r\n return column as ColumnNode;\r\n }\r\n\r\n const def = column as ColumnDef;\r\n return {\r\n type: 'Column',\r\n table: def.table || table.name,\r\n name: def.name\r\n };\r\n};\r\n\r\n/**\r\n * Builds column AST nodes for a list of column names\r\n * @param table - Table definition providing the table name\r\n * @param names - Column names\r\n */\r\nexport const buildColumnNodes = (table: TableDef, names: string[]): ColumnNode[] =>\r\n names.map(name => ({\r\n type: 'Column',\r\n table: table.name,\r\n name\r\n }));\r\n\r\n/**\r\n * Builds a table AST node for the provided table definition\r\n * @param table - Table definition\r\n */\r\nexport const createTableNode = (table: TableDef): TableNode => ({\r\n type: 'Table',\r\n name: table.name\r\n});\r\n","import { ColumnNode } from '../core/ast/expression.js';\r\nimport { CommonTableExpressionNode } from '../core/ast/query.js';\r\n\r\n/**\r\n * Best-effort helper that tries to convert a raw column expression into a `ColumnNode`.\r\n * This parser is intentionally limited; use it only for simple references or function calls.\r\n */\r\nexport const parseRawColumn = (\r\n col: string,\r\n tableName: string,\r\n ctes?: CommonTableExpressionNode[]\r\n): ColumnNode => {\r\n if (col.includes('(')) {\r\n const [fn, rest] = col.split('(');\r\n const colName = rest.replace(')', '');\r\n const [table, name] = colName.includes('.') ? colName.split('.') : [tableName, colName];\r\n return { type: 'Column', table, name, alias: col };\r\n }\r\n\r\n if (col.includes('.')) {\r\n const [potentialCteName, columnName] = col.split('.');\r\n const hasCte = ctes?.some(cte => cte.name === potentialCteName);\r\n\r\n if (hasCte) {\r\n return { type: 'Column', table: tableName, name: col };\r\n }\r\n\r\n return { type: 'Column', table: potentialCteName, name: columnName };\r\n }\r\n\r\n return { type: 'Column', table: tableName, name: col };\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { SelectQueryNode, CommonTableExpressionNode, SetOperationKind, SetOperationNode } from '../core/ast/query.js';\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n ScalarSubqueryNode,\r\n and,\r\n isExpressionSelectionNode\r\n} from '../core/ast/expression.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\nimport { SelectQueryState, ProjectionNode } from './select-query-state.js';\r\nimport { OrderDirection } from '../core/sql/sql.js';\r\nimport { parseRawColumn } from './raw-column-parser.js';\r\n\r\n/**\r\n * Result of column selection operation\r\n */\r\nexport interface ColumnSelectionResult {\r\n /**\r\n * Updated query state\r\n */\r\n state: SelectQueryState;\r\n /**\r\n * Columns that were added\r\n */\r\n addedColumns: ProjectionNode[];\r\n}\r\n\r\n/**\r\n * Service for manipulating query AST (Abstract Syntax Tree)\r\n */\r\nexport class QueryAstService {\r\n /**\r\n * Creates a new QueryAstService instance\r\n * @param table - Table definition\r\n * @param state - Current query state\r\n */\r\n constructor(private readonly table: TableDef, private readonly state: SelectQueryState) {}\r\n\r\n /**\r\n * Selects columns for the query\r\n * @param columns - Columns to select (key: alias, value: column definition or expression)\r\n * @returns Column selection result with updated state and added columns\r\n */\r\n select(\r\n columns: Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>\r\n ): ColumnSelectionResult {\r\n const existingAliases = new Set(\r\n this.state.ast.columns.map(c => (c as ColumnNode).alias || (c as ColumnNode).name)\r\n );\r\n\r\n const newCols = Object.entries(columns).reduce<ProjectionNode[]>((acc, [alias, val]) => {\r\n if (existingAliases.has(alias)) return acc;\r\n\r\n if (isExpressionSelectionNode(val)) {\r\n acc.push({ ...(val as FunctionNode | CaseExpressionNode | WindowFunctionNode), alias } as ProjectionNode);\r\n return acc;\r\n }\r\n\r\n const colDef = val as ColumnDef;\r\n acc.push({\r\n type: 'Column',\r\n table: colDef.table || this.table.name,\r\n name: colDef.name,\r\n alias\r\n } as ColumnNode);\r\n return acc;\r\n }, []);\r\n\r\n const nextState = this.state.withColumns(newCols);\r\n return { state: nextState, addedColumns: newCols };\r\n }\r\n\r\n /**\r\n * Selects raw column expressions (best-effort parser for simple references/functions)\r\n * @param cols - Raw column expressions\r\n * @returns Column selection result with updated state and added columns\r\n */\r\n selectRaw(cols: string[]): ColumnSelectionResult {\r\n const newCols = cols.map(col => parseRawColumn(col, this.table.name, this.state.ast.ctes));\r\n const nextState = this.state.withColumns(newCols);\r\n return { state: nextState, addedColumns: newCols };\r\n }\r\n\r\n /**\r\n * Adds a Common Table Expression (CTE) to the query\r\n * @param name - Name of the CTE\r\n * @param query - Query for the CTE\r\n * @param columns - Optional column names for the CTE\r\n * @param recursive - Whether the CTE is recursive\r\n * @returns Updated query state with CTE\r\n */\r\n withCte(name: string, query: SelectQueryNode, columns?: string[], recursive = false): SelectQueryState {\n const cte: CommonTableExpressionNode = {\n type: 'CommonTableExpression',\n name,\n query,\n columns,\n recursive\n };\n\n return this.state.withCte(cte);\n }\n\n /**\n * Adds a set operation (UNION/UNION ALL/INTERSECT/EXCEPT) to the query\n * @param operator - Set operator\n * @param query - Right-hand side query\n * @returns Updated query state with set operation\n */\n withSetOperation(operator: SetOperationKind, query: SelectQueryNode): SelectQueryState {\n const op: SetOperationNode = {\n type: 'SetOperation',\n operator,\n query\n };\n return this.state.withSetOperation(op);\n }\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param alias - Alias for the subquery\r\n * @param query - Subquery to select\r\n * @returns Updated query state with subquery selection\r\n */\r\n selectSubquery(alias: string, query: SelectQueryNode): SelectQueryState {\r\n const node: ScalarSubqueryNode = { type: 'ScalarSubquery', query, alias };\r\n return this.state.withColumns([node]);\r\n }\r\n\r\n /**\r\n * Adds a JOIN clause to the query\r\n * @param join - Join node to add\r\n * @returns Updated query state with JOIN\r\n */\r\n withJoin(join: JoinNode): SelectQueryState {\r\n return this.state.withJoin(join);\r\n }\r\n\r\n /**\r\n * Adds a WHERE clause to the query\r\n * @param expr - Expression for the WHERE clause\r\n * @returns Updated query state with WHERE clause\r\n */\r\n withWhere(expr: ExpressionNode): SelectQueryState {\r\n const combined = this.combineExpressions(this.state.ast.where, expr);\r\n return this.state.withWhere(combined);\r\n }\r\n\r\n /**\r\n * Adds a GROUP BY clause to the query\r\n * @param col - Column to group by\r\n * @returns Updated query state with GROUP BY clause\r\n */\r\n withGroupBy(col: ColumnDef | ColumnNode): SelectQueryState {\r\n const node = buildColumnNode(this.table, col);\r\n return this.state.withGroupBy([node]);\r\n }\r\n\r\n /**\r\n * Adds a HAVING clause to the query\r\n * @param expr - Expression for the HAVING clause\r\n * @returns Updated query state with HAVING clause\r\n */\r\n withHaving(expr: ExpressionNode): SelectQueryState {\r\n const combined = this.combineExpressions(this.state.ast.having, expr);\r\n return this.state.withHaving(combined);\r\n }\r\n\r\n /**\r\n * Adds an ORDER BY clause to the query\r\n * @param col - Column to order by\r\n * @param direction - Order direction (ASC/DESC)\r\n * @returns Updated query state with ORDER BY clause\r\n */\r\n withOrderBy(col: ColumnDef | ColumnNode, direction: OrderDirection): SelectQueryState {\r\n const node = buildColumnNode(this.table, col);\r\n return this.state.withOrderBy([{ type: 'OrderBy', column: node, direction }]);\r\n }\r\n\r\n /**\r\n * Adds a DISTINCT clause to the query\r\n * @param cols - Columns to make distinct\r\n * @returns Updated query state with DISTINCT clause\r\n */\r\n withDistinct(cols: ColumnNode[]): SelectQueryState {\r\n return this.state.withDistinct(cols);\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param limit - Maximum number of rows to return\r\n * @returns Updated query state with LIMIT clause\r\n */\r\n withLimit(limit: number): SelectQueryState {\r\n return this.state.withLimit(limit);\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param offset - Number of rows to skip\r\n * @returns Updated query state with OFFSET clause\r\n */\r\n withOffset(offset: number): SelectQueryState {\r\n return this.state.withOffset(offset);\r\n }\r\n\r\n /**\r\n * Combines expressions with AND operator\r\n * @param existing - Existing expression\r\n * @param next - New expression to combine\r\n * @returns Combined expression\r\n */\r\n private combineExpressions(existing: ExpressionNode | undefined, next: ExpressionNode): ExpressionNode {\r\n return existing ? and(existing, next) : next;\r\n }\r\n\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { ColumnNode } from '../core/ast/expression.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { isRelationAlias } from './relation-alias.js';\r\n\r\n/**\r\n * Result of a relation operation\r\n */\r\nexport interface RelationResult {\r\n /**\r\n * Updated query state\r\n */\r\n state: SelectQueryState;\r\n /**\r\n * Updated hydration manager\r\n */\r\n hydration: HydrationManager;\r\n}\r\n\r\n/**\r\n * Callback function for selecting columns\r\n */\r\ntype SelectColumnsCallback = (\r\n state: SelectQueryState,\r\n hydration: HydrationManager,\r\n columns: Record<string, ColumnDef>\r\n) => RelationResult;\r\n\r\n/**\r\n * Helper class for managing relation projections in queries\r\n */\r\nexport class RelationProjectionHelper {\r\n /**\r\n * Creates a new RelationProjectionHelper instance\r\n * @param table - Table definition\r\n * @param selectColumns - Callback for selecting columns\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly selectColumns: SelectColumnsCallback\r\n ) {}\r\n\r\n /**\r\n * Ensures base projection is included in the query\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n * @returns Relation result with updated state and hydration\r\n */\r\n ensureBaseProjection(state: SelectQueryState, hydration: HydrationManager): RelationResult {\r\n const primaryKey = findPrimaryKey(this.table);\r\n\r\n if (!this.hasBaseProjection(state)) {\r\n return this.selectColumns(state, hydration, this.getBaseColumns());\r\n }\r\n\r\n if (primaryKey && !this.hasPrimarySelected(state, primaryKey) && this.table.columns[primaryKey]) {\r\n return this.selectColumns(state, hydration, {\r\n [primaryKey]: this.table.columns[primaryKey]\r\n });\r\n }\r\n\r\n return { state, hydration };\r\n }\r\n\r\n /**\r\n * Checks if base projection exists in the query\r\n * @param state - Current query state\r\n * @returns True if base projection exists\r\n */\r\n private hasBaseProjection(state: SelectQueryState): boolean {\r\n return state.ast.columns.some(col => !isRelationAlias((col as ColumnNode).alias));\r\n }\r\n\r\n /**\r\n * Checks if primary key is selected in the query\r\n * @param state - Current query state\r\n * @param primaryKey - Primary key name\r\n * @returns True if primary key is selected\r\n */\r\n private hasPrimarySelected(state: SelectQueryState, primaryKey: string): boolean {\r\n return state.ast.columns.some(col => {\r\n const alias = (col as ColumnNode).alias;\r\n const name = alias || (col as ColumnNode).name;\r\n return !isRelationAlias(alias) && name === primaryKey;\r\n });\r\n }\r\n\r\n /**\r\n * Gets all base columns for the table\r\n * @returns Record of all table columns\r\n */\r\n private getBaseColumns(): Record<string, ColumnDef> {\r\n return Object.keys(this.table.columns).reduce((acc, key) => {\r\n acc[key] = (this.table.columns as Record<string, ColumnDef>)[key];\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n }\r\n}\r\n","import { TableDef } from '../schema/table.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { ExpressionNode, eq, and } from '../core/ast/expression.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { JoinNode } from '../core/ast/join.js';\r\nimport { JoinKind } from '../core/sql/sql.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\n\r\n/**\r\n * Utility function to handle unreachable code paths\r\n * @param value - Value that should never occur\r\n * @throws Error indicating unhandled relation type\r\n */\r\nconst assertNever = (value: never): never => {\r\n throw new Error(`Unhandled relation type: ${JSON.stringify(value)}`);\r\n};\r\n\r\n/**\r\n * Builds the base condition for a relation join\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @returns Expression node representing the join condition\r\n */\r\nconst baseRelationCondition = (root: TableDef, relation: RelationDef): ExpressionNode => {\r\n const defaultLocalKey =\r\n relation.type === RelationKinds.HasMany\r\n ? findPrimaryKey(root)\r\n : findPrimaryKey(relation.target);\r\n const localKey = relation.localKey || defaultLocalKey;\r\n\r\n switch (relation.type) {\r\n case RelationKinds.HasMany:\r\n return eq(\r\n { type: 'Column', table: relation.target.name, name: relation.foreignKey },\r\n { type: 'Column', table: root.name, name: localKey }\r\n );\r\n case RelationKinds.BelongsTo:\r\n return eq(\r\n { type: 'Column', table: relation.target.name, name: localKey },\r\n { type: 'Column', table: root.name, name: relation.foreignKey }\r\n );\r\n case RelationKinds.BelongsToMany:\r\n throw new Error('BelongsToMany relations do not support the standard join condition builder');\r\n default:\r\n return assertNever(relation);\r\n }\r\n};\r\n\r\n/**\r\n * Builds the join nodes required to include a BelongsToMany relation.\r\n */\r\nexport const buildBelongsToManyJoins = (\r\n root: TableDef,\r\n relationName: string,\r\n relation: BelongsToManyRelation,\r\n joinKind: JoinKind,\r\n extra?: ExpressionNode\r\n): JoinNode[] => {\r\n const rootKey = relation.localKey || findPrimaryKey(root);\r\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\r\n\r\n const pivotCondition = eq(\r\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToRoot },\r\n { type: 'Column', table: root.name, name: rootKey }\r\n );\r\n\r\n const pivotJoin = createJoinNode(joinKind, relation.pivotTable.name, pivotCondition);\r\n\r\n let targetCondition: ExpressionNode = eq(\r\n { type: 'Column', table: relation.target.name, name: targetKey },\r\n { type: 'Column', table: relation.pivotTable.name, name: relation.pivotForeignKeyToTarget }\r\n );\r\n\r\n if (extra) {\r\n targetCondition = and(targetCondition, extra);\r\n }\r\n\r\n const targetJoin = createJoinNode(\r\n joinKind,\r\n relation.target.name,\r\n targetCondition,\r\n relationName\r\n );\r\n\r\n return [pivotJoin, targetJoin];\r\n};\r\n\r\n/**\r\n * Builds a relation join condition with optional extra conditions\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @param extra - Optional additional expression to combine with AND\r\n * @returns Expression node representing the complete join condition\r\n */\r\nexport const buildRelationJoinCondition = (\r\n root: TableDef,\r\n relation: RelationDef,\r\n extra?: ExpressionNode\r\n): ExpressionNode => {\r\n const base = baseRelationCondition(root, relation);\r\n return extra ? and(base, extra) : base;\r\n};\r\n\r\n/**\r\n * Builds a relation correlation condition for subqueries\r\n * @param root - Root table definition\r\n * @param relation - Relation definition\r\n * @returns Expression node representing the correlation condition\r\n */\r\nexport const buildRelationCorrelation = (root: TableDef, relation: RelationDef): ExpressionNode => {\r\n return baseRelationCondition(root, relation);\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { RelationDef, RelationKinds, BelongsToManyRelation } from '../schema/relation.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n and\r\n} from '../core/ast/expression.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { findPrimaryKey } from './hydration-planner.js';\r\nimport { RelationProjectionHelper } from './relation-projection-helper.js';\r\nimport type { RelationResult } from './relation-projection-helper.js';\r\nimport {\r\n buildRelationJoinCondition,\r\n buildRelationCorrelation,\r\n buildBelongsToManyJoins\r\n} from './relation-conditions.js';\r\nimport { JoinKind, JOIN_KINDS } from '../core/sql/sql.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\nimport { makeRelationAlias } from './relation-alias.js';\r\nimport { buildDefaultPivotColumns } from './relation-utils.js';\r\n\r\n/**\r\n * Service for handling relation operations (joins, includes, etc.)\r\n */\r\nexport class RelationService {\r\n private readonly projectionHelper: RelationProjectionHelper;\r\n\r\n /**\r\n * Creates a new RelationService instance\r\n * @param table - Table definition\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n */\r\n constructor(\r\n private readonly table: TableDef,\r\n private readonly state: SelectQueryState,\r\n private readonly hydration: HydrationManager,\r\n private readonly createQueryAstService: (table: TableDef, state: SelectQueryState) => QueryAstService\r\n ) {\r\n this.projectionHelper = new RelationProjectionHelper(table, (state, hydration, columns) =>\r\n this.selectColumns(state, hydration, columns)\r\n );\r\n }\r\n\r\n /**\r\n * Joins a relation to the query\r\n * @param relationName - Name of the relation to join\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Relation result with updated state and hydration\r\n */\r\n joinRelation(\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): RelationResult {\r\n const nextState = this.withJoin(this.state, relationName, joinKind, extraCondition);\r\n return { state: nextState, hydration: this.hydration };\r\n }\r\n\r\n /**\r\n * Matches records based on a relation with an optional predicate\r\n * @param relationName - Name of the relation to match\r\n * @param predicate - Optional predicate expression\r\n * @returns Relation result with updated state and hydration\r\n */\r\n match(\r\n relationName: string,\r\n predicate?: ExpressionNode\r\n ): RelationResult {\r\n const joined = this.joinRelation(relationName, JOIN_KINDS.INNER, predicate);\r\n const pk = findPrimaryKey(this.table);\r\n const distinctCols: ColumnNode[] = [{ type: 'Column', table: this.table.name, name: pk }];\r\n const existingDistinct = joined.state.ast.distinct ? joined.state.ast.distinct : [];\r\n const nextState = this.astService(joined.state).withDistinct([...existingDistinct, ...distinctCols]);\r\n return { state: nextState, hydration: joined.hydration };\r\n }\r\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Relation result with updated state and hydration\r\n */\r\n include(relationName: string, options?: RelationIncludeOptions): RelationResult {\r\n let state = this.state;\r\n let hydration = this.hydration;\r\n\r\n const relation = this.getRelation(relationName);\r\n const aliasPrefix = options?.aliasPrefix ?? relationName;\r\n const alreadyJoined = state.ast.joins.some(j => j.relationName === relationName);\r\n\r\n if (!alreadyJoined) {\r\n const joined = this.joinRelation(relationName, options?.joinKind ?? JOIN_KINDS.LEFT, options?.filter);\r\n state = joined.state;\r\n }\r\n\r\n const projectionResult = this.projectionHelper.ensureBaseProjection(state, hydration);\r\n state = projectionResult.state;\r\n hydration = projectionResult.hydration;\r\n\r\n const targetColumns = options?.columns?.length\r\n ? options.columns\r\n : Object.keys(relation.target.columns);\r\n\r\n const buildTypedSelection = (\r\n columns: Record<string, ColumnDef>,\r\n prefix: string,\r\n keys: string[],\r\n missingMsg: (col: string) => string\r\n ) : Record<string, ColumnDef> => {\r\n return keys.reduce((acc, key) => {\r\n const def = columns[key];\r\n if (!def) {\r\n throw new Error(missingMsg(key));\r\n }\r\n acc[makeRelationAlias(prefix, key)] = def;\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n };\r\n\r\n const targetSelection = buildTypedSelection(\r\n relation.target.columns as Record<string, ColumnDef>,\r\n aliasPrefix,\r\n targetColumns,\r\n key => `Column '${key}' not found on relation '${relationName}'`\r\n );\r\n\r\n if (relation.type !== RelationKinds.BelongsToMany) {\r\n const relationSelectionResult = this.selectColumns(state, hydration, targetSelection);\r\n state = relationSelectionResult.state;\r\n hydration = relationSelectionResult.hydration;\r\n\r\n hydration = hydration.onRelationIncluded(\r\n state,\r\n relation,\r\n relationName,\r\n aliasPrefix,\r\n targetColumns\r\n );\r\n\r\n return { state, hydration };\r\n }\r\n\r\n const many = relation as BelongsToManyRelation;\r\n const pivotAliasPrefix = options?.pivot?.aliasPrefix ?? `${aliasPrefix}_pivot`;\r\n const pivotPk = many.pivotPrimaryKey || findPrimaryKey(many.pivotTable);\r\n const pivotColumns =\r\n options?.pivot?.columns ??\r\n many.defaultPivotColumns ??\r\n buildDefaultPivotColumns(many, pivotPk);\r\n\r\n const pivotSelection = buildTypedSelection(\r\n many.pivotTable.columns as Record<string, ColumnDef>,\r\n pivotAliasPrefix,\r\n pivotColumns,\r\n key => `Column '${key}' not found on pivot table '${many.pivotTable.name}'`\r\n );\r\n\r\n const combinedSelection = {\r\n ...targetSelection,\r\n ...pivotSelection\r\n };\r\n\r\n const relationSelectionResult = this.selectColumns(state, hydration, combinedSelection);\r\n state = relationSelectionResult.state;\r\n hydration = relationSelectionResult.hydration;\r\n\r\n hydration = hydration.onRelationIncluded(\r\n state,\r\n relation,\r\n relationName,\r\n aliasPrefix,\r\n targetColumns,\r\n { aliasPrefix: pivotAliasPrefix, columns: pivotColumns }\r\n );\r\n\r\n return { state, hydration };\r\n }\r\n\r\n /**\r\n * Applies relation correlation to a query AST\r\n * @param relationName - Name of the relation\r\n * @param ast - Query AST to modify\r\n * @returns Modified query AST with relation correlation\r\n */\r\n applyRelationCorrelation(\r\n relationName: string,\r\n ast: SelectQueryNode\r\n ): SelectQueryNode {\r\n const relation = this.getRelation(relationName);\r\n const correlation = buildRelationCorrelation(this.table, relation);\r\n const whereInSubquery = ast.where\r\n ? and(correlation, ast.where)\r\n : correlation;\r\n\r\n return {\r\n ...ast,\r\n where: whereInSubquery\r\n };\r\n }\r\n\r\n /**\r\n * Creates a join node for a relation\r\n * @param state - Current query state\r\n * @param relationName - Name of the relation\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query state with join\r\n */\r\n private withJoin(\r\n state: SelectQueryState,\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryState {\r\n const relation = this.getRelation(relationName);\r\n if (relation.type === RelationKinds.BelongsToMany) {\r\n const joins = buildBelongsToManyJoins(\r\n this.table,\r\n relationName,\r\n relation as BelongsToManyRelation,\r\n joinKind,\r\n extraCondition\r\n );\r\n return joins.reduce((current, join) => this.astService(current).withJoin(join), state);\r\n }\r\n\r\n const condition = buildRelationJoinCondition(this.table, relation, extraCondition);\r\n const joinNode = createJoinNode(joinKind, relation.target.name, condition, relationName);\r\n\r\n return this.astService(state).withJoin(joinNode);\r\n }\r\n\r\n /**\r\n * Selects columns for a relation\r\n * @param state - Current query state\r\n * @param hydration - Hydration manager\r\n * @param columns - Columns to select\r\n * @returns Relation result with updated state and hydration\r\n */\r\n private selectColumns(\r\n state: SelectQueryState,\r\n hydration: HydrationManager,\r\n columns: Record<string, ColumnDef>\r\n ): RelationResult {\r\n const { state: nextState, addedColumns } = this.astService(state).select(columns);\r\n return {\r\n state: nextState,\r\n hydration: hydration.onColumnsSelected(nextState, addedColumns)\r\n };\r\n }\r\n\r\n /**\r\n * Gets a relation definition by name\r\n * @param relationName - Name of the relation\r\n * @returns Relation definition\r\n * @throws Error if relation is not found\r\n */\r\n private getRelation(relationName: string): RelationDef {\r\n const relation = this.table.relations[relationName];\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.table.name}'`);\r\n }\r\n\r\n return relation;\r\n }\r\n\r\n /**\r\n * Creates a QueryAstService instance\r\n * @param state - Current query state\r\n * @returns QueryAstService instance\r\n */\r\n private astService(state: SelectQueryState = this.state): QueryAstService {\r\n return this.createQueryAstService(this.table, state);\r\n }\r\n}\r\n\r\nexport type { RelationResult } from './relation-projection-helper.js';\r\n","import { TableDef } from '../schema/table.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport { HydrationPlanner } from './hydration-planner.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { RelationService } from './relation-service.js';\r\n\r\n/**\r\n * Context for query building operations\r\n */\r\nexport interface SelectQueryBuilderContext {\r\n /**\r\n * Current query state\r\n */\r\n readonly state: SelectQueryState;\r\n /**\r\n * Hydration manager for the query\r\n */\r\n readonly hydration: HydrationManager;\r\n}\r\n\r\n/**\r\n * Dependencies for query builder operations\r\n */\r\nexport interface SelectQueryBuilderDependencies {\r\n /**\r\n * Creates a new query state\r\n * @param table - Table definition\r\n * @returns New query state\r\n */\r\n createState: (table: TableDef) => SelectQueryState;\r\n /**\r\n * Creates a new hydration manager\r\n * @param table - Table definition\r\n * @returns New hydration manager\r\n */\r\n createHydration: (table: TableDef) => HydrationManager;\r\n /**\r\n * Creates a new hydration planner\r\n * @param table - Table definition\r\n * @returns Hydration planner\r\n */\r\n createHydrationPlanner: (table: TableDef) => HydrationPlanner;\r\n /**\r\n * Creates a new query AST service\r\n * @param table - Table definition\r\n * @param state - Query state\r\n * @returns New query AST service\r\n */\r\n createQueryAstService: (table: TableDef, state: SelectQueryState) => QueryAstService;\r\n /**\r\n * Creates a new relation service\r\n * @param table - Table definition\r\n * @param state - Query state\r\n * @param hydration - Hydration manager\r\n * @returns New relation service\r\n */\r\n createRelationService: (\r\n table: TableDef,\r\n state: SelectQueryState,\r\n hydration: HydrationManager\r\n ) => RelationService;\r\n}\r\n\r\n/**\r\n * Environment for query builder operations\r\n */\r\nexport interface SelectQueryBuilderEnvironment {\r\n /**\r\n * Table definition\r\n */\r\n readonly table: TableDef;\r\n /**\r\n * Query builder dependencies\r\n */\r\n readonly deps: SelectQueryBuilderDependencies;\r\n}\r\n\r\n/**\r\n * Default implementations for query builder dependencies\r\n */\r\nconst defaultCreateQueryAstService = (table: TableDef, state: SelectQueryState) => new QueryAstService(table, state);\r\nconst defaultCreateHydrationPlanner = (table: TableDef) => new HydrationPlanner(table);\r\n\r\nconst defaultCreateHydration = (table: TableDef, plannerFactory: (table: TableDef) => HydrationPlanner) =>\r\n new HydrationManager(table, plannerFactory(table));\r\n\r\n/**\r\n * Resolves query builder dependencies by merging overrides with internal defaults\r\n * @param overrides - Partial overrides for dependency factories\r\n */\r\nexport const resolveSelectQueryBuilderDependencies = (\r\n overrides: Partial<SelectQueryBuilderDependencies> = {}\r\n): SelectQueryBuilderDependencies => {\r\n const createQueryAstService = overrides.createQueryAstService ?? defaultCreateQueryAstService;\r\n const createHydrationPlanner = overrides.createHydrationPlanner ?? defaultCreateHydrationPlanner;\r\n const createHydration =\r\n overrides.createHydration ?? (table => defaultCreateHydration(table, createHydrationPlanner));\r\n const createRelationService =\r\n overrides.createRelationService ??\r\n ((table, state, hydration) => new RelationService(table, state, hydration, createQueryAstService));\r\n\r\n return {\r\n createState: overrides.createState ?? (table => new SelectQueryState(table)),\r\n createHydration,\r\n createHydrationPlanner,\r\n createQueryAstService,\r\n createRelationService\r\n };\r\n};\r\n\r\nexport const defaultSelectQueryBuilderDependencies = resolveSelectQueryBuilderDependencies();\r\n","import { ColumnDef } from '../schema/column.js';\r\nimport { CaseExpressionNode, ColumnNode, FunctionNode, WindowFunctionNode } from '../core/ast/expression.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport { buildColumnNode } from '../core/ast/builders.js';\r\nimport { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';\r\n\r\n/**\r\n * Type for column selection input\r\n */\r\ntype ColumnSelectionInput = Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>;\r\n\r\n/**\r\n * Handles column selection operations for the query builder\r\n */\r\nexport class ColumnSelector {\r\n /**\r\n * Creates a new ColumnSelector instance\r\n * @param env - Query builder environment\r\n */\r\n constructor(private readonly env: SelectQueryBuilderEnvironment) {}\r\n\r\n /**\r\n * Selects columns for the query\r\n * @param context - Current query context\r\n * @param columns - Columns to select\r\n * @returns Updated query context with selected columns\r\n */\r\n select(context: SelectQueryBuilderContext, columns: ColumnSelectionInput): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const { state: nextState, addedColumns } = astService.select(columns);\r\n return {\r\n state: nextState,\r\n hydration: context.hydration.onColumnsSelected(nextState, addedColumns)\r\n };\r\n }\r\n\r\n /**\r\n * Selects raw column expressions\r\n * @param context - Current query context\r\n * @param columns - Raw column expressions\r\n * @returns Updated query context with raw column selections\r\n */\r\n selectRaw(context: SelectQueryBuilderContext, columns: string[]): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.selectRaw(columns).state;\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param context - Current query context\r\n * @param alias - Alias for the subquery\r\n * @param query - Subquery to select\r\n * @returns Updated query context with subquery selection\r\n */\r\n selectSubquery(\r\n context: SelectQueryBuilderContext,\r\n alias: string,\r\n query: SelectQueryNode\r\n ): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.selectSubquery(alias, query);\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n /**\r\n * Adds DISTINCT clause to the query\r\n * @param context - Current query context\r\n * @param columns - Columns to make distinct\r\n * @returns Updated query context with DISTINCT clause\r\n */\r\n distinct(context: SelectQueryBuilderContext, columns: (ColumnDef | ColumnNode)[]): SelectQueryBuilderContext {\r\n const nodes = columns.map(col => buildColumnNode(this.env.table, col));\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = astService.withDistinct(nodes);\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n}\r\n","import { ExpressionNode } from '../core/ast/expression.js';\r\nimport { SelectQueryNode } from '../core/ast/query.js';\r\nimport { SelectQueryBuilderContext, SelectQueryBuilderEnvironment } from './select-query-builder-deps.js';\r\nimport { JoinKind } from '../core/sql/sql.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\n\r\n/**\r\n * Manages relation operations (joins, includes, etc.) for query building\r\n */\r\nexport class RelationManager {\r\n /**\r\n * Creates a new RelationManager instance\r\n * @param env - Query builder environment\r\n */\r\n constructor(private readonly env: SelectQueryBuilderEnvironment) {}\r\n\r\n /**\r\n * Matches records based on a relation with an optional predicate\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to match\r\n * @param predicate - Optional predicate expression\r\n * @returns Updated query context with relation match\r\n */\r\n match(context: SelectQueryBuilderContext, relationName: string, predicate?: ExpressionNode): SelectQueryBuilderContext {\r\n const result = this.createService(context).match(relationName, predicate);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Joins a relation to the query\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to join\r\n * @param joinKind - Type of join to use\r\n * @param extraCondition - Additional join condition\r\n * @returns Updated query context with relation join\r\n */\r\n joinRelation(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n joinKind: JoinKind,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).joinRelation(relationName, joinKind, extraCondition);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Includes a relation in the query result\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation to include\r\n * @param options - Options for relation inclusion\r\n * @returns Updated query context with included relation\r\n */\r\n include(\r\n context: SelectQueryBuilderContext,\r\n relationName: string,\r\n options?: RelationIncludeOptions\r\n ): SelectQueryBuilderContext {\r\n const result = this.createService(context).include(relationName, options);\r\n return { state: result.state, hydration: result.hydration };\r\n }\r\n\r\n /**\r\n * Applies relation correlation to a query AST\r\n * @param context - Current query context\r\n * @param relationName - Name of the relation\r\n * @param ast - Query AST to modify\r\n * @returns Modified query AST with relation correlation\r\n */\r\n applyRelationCorrelation(context: SelectQueryBuilderContext, relationName: string, ast: SelectQueryNode): SelectQueryNode {\r\n return this.createService(context).applyRelationCorrelation(relationName, ast);\r\n }\r\n\r\n /**\r\n * Creates a relation service instance\r\n * @param context - Current query context\r\n * @returns Relation service instance\r\n */\r\n private createService(context: SelectQueryBuilderContext) {\r\n return this.env.deps.createRelationService(this.env.table, context.state, context.hydration);\r\n }\r\n}\r\n","import { HydrationPlan, HydrationRelationPlan } from '../core/ast/query.js';\r\nimport { isRelationAlias, makeRelationAlias } from '../query-builder/relation-alias.js';\r\n\r\n/**\r\n * Hydrates query results according to a hydration plan\r\n * @param rows - Raw database rows\r\n * @param plan - Hydration plan\r\n * @returns Hydrated result objects with nested relations\r\n */\r\nexport const hydrateRows = (rows: Record<string, any>[], plan?: HydrationPlan): Record<string, any>[] => {\r\n if (!plan || !rows.length) return rows;\r\n\r\n const rootMap = new Map<any, Record<string, any>>();\r\n const relationIndex = new Map<any, Record<string, Set<any>>>();\r\n\r\n const getOrCreateParent = (row: Record<string, any>) => {\r\n const rootId = row[plan.rootPrimaryKey];\r\n if (rootId === undefined) return undefined;\r\n\r\n if (!rootMap.has(rootId)) {\r\n rootMap.set(rootId, createBaseRow(row, plan));\r\n }\r\n\r\n return rootMap.get(rootId);\r\n };\r\n\r\n const getRelationSeenSet = (rootId: any, relationName: string): Set<any> => {\r\n let byRelation = relationIndex.get(rootId);\r\n if (!byRelation) {\r\n byRelation = {};\r\n relationIndex.set(rootId, byRelation);\r\n }\r\n\r\n let seen = byRelation[relationName];\r\n if (!seen) {\r\n seen = new Set<any>();\r\n byRelation[relationName] = seen;\r\n }\r\n\r\n return seen;\r\n };\r\n\r\n for (const row of rows) {\r\n const rootId = row[plan.rootPrimaryKey];\r\n if (rootId === undefined) continue;\r\n\r\n const parent = getOrCreateParent(row);\r\n if (!parent) continue;\r\n\r\n for (const rel of plan.relations) {\r\n const childPkKey = makeRelationAlias(rel.aliasPrefix, rel.targetPrimaryKey);\r\n const childPk = row[childPkKey];\r\n if (childPk === null || childPk === undefined) continue;\r\n\r\n const seen = getRelationSeenSet(rootId, rel.name);\r\n if (seen.has(childPk)) continue;\r\n seen.add(childPk);\r\n\r\n const bucket = parent[rel.name] as any[];\r\n bucket.push(buildChild(row, rel));\r\n }\r\n }\r\n\r\n return Array.from(rootMap.values());\r\n};\r\n\r\nconst createBaseRow = (row: Record<string, any>, plan: HydrationPlan): Record<string, any> => {\r\n const base: Record<string, any> = {};\r\n const baseKeys = plan.rootColumns.length\r\n ? plan.rootColumns\r\n : Object.keys(row).filter(k => !isRelationAlias(k));\r\n\r\n for (const key of baseKeys) {\r\n base[key] = row[key];\r\n }\r\n\r\n for (const rel of plan.relations) {\r\n base[rel.name] = [];\r\n }\r\n\r\n return base;\r\n};\r\n\r\nconst buildChild = (row: Record<string, any>, rel: HydrationRelationPlan): Record<string, any> => {\r\n const child: Record<string, any> = {};\r\n for (const col of rel.columns) {\r\n const key = makeRelationAlias(rel.aliasPrefix, col);\r\n child[col] = row[key];\r\n }\r\n\r\n const pivot = buildPivot(row, rel);\r\n if (pivot) {\r\n (child as any)._pivot = pivot;\r\n }\r\n\r\n return child;\r\n};\r\n\r\nconst buildPivot = (row: Record<string, any>, rel: HydrationRelationPlan): Record<string, any> | undefined => {\r\n if (!rel.pivot) return undefined;\r\n\r\n const pivot: Record<string, any> = {};\r\n for (const col of rel.pivot.columns) {\r\n const key = makeRelationAlias(rel.pivot.aliasPrefix, col);\r\n pivot[col] = row[key];\r\n }\r\n\r\n const hasValue = Object.values(pivot).some(v => v !== null && v !== undefined);\r\n return hasValue ? pivot : undefined;\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { OrmContext } from './orm-context.js';\r\nimport { RelationMap } from '../schema/types.js';\r\n\r\nexport const ENTITY_META = Symbol('EntityMeta');\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nexport interface EntityMeta<TTable extends TableDef> {\r\n ctx: OrmContext;\r\n table: TTable;\r\n lazyRelations: (keyof RelationMap<TTable>)[];\r\n relationCache: Map<string, Promise<any>>;\r\n relationHydration: Map<string, Map<string, any>>;\r\n relationWrappers: Map<string, unknown>;\r\n}\r\n\r\nexport const getHydrationRows = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, any>[] | undefined => {\r\n const map = meta.relationHydration.get(relationName);\r\n if (!map) return undefined;\r\n const rows = map.get(toKey(key));\r\n if (!rows) return undefined;\r\n return Array.isArray(rows) ? rows : undefined;\r\n};\r\n\r\nexport const getHydrationRecord = <TTable extends TableDef>(\r\n meta: EntityMeta<TTable>,\r\n relationName: string,\r\n key: unknown\r\n): Record<string, any> | undefined => {\r\n const map = meta.relationHydration.get(relationName);\r\n if (!map) return undefined;\r\n const value = map.get(toKey(key));\r\n if (!value) return undefined;\r\n if (Array.isArray(value)) {\r\n return value[0];\r\n }\r\n return value;\r\n};\r\n\r\nexport const getEntityMeta = <TTable extends TableDef>(entity: any): EntityMeta<TTable> | undefined => {\r\n if (!entity || typeof entity !== 'object') return undefined;\r\n return (entity as any)[ENTITY_META];\r\n};\r\n\r\nexport const hasEntityMeta = (entity: any): entity is { [ENTITY_META]: EntityMeta<TableDef> } => {\r\n return Boolean(getEntityMeta(entity));\r\n};\r\n","import { HasManyCollection } from '../../schema/types.js';\r\nimport { OrmContext, RelationKey } from '../orm-context.js';\r\nimport { HasManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>[];\n\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\n\nconst hideInternal = (obj: any, keys: string[]): void => {\n for (const key of keys) {\n Object.defineProperty(obj, key, {\n value: obj[key],\n writable: false,\n configurable: false,\n enumerable: false\n });\n }\n};\n\nexport class DefaultHasManyCollection<TChild> implements HasManyCollection<TChild> {\n private loaded = false;\n private items: TChild[] = [];\n private readonly added = new Set<TChild>();\n private readonly removed = new Set<TChild>();\n\r\n constructor(\r\n private readonly ctx: OrmContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: HasManyRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, any>) => TChild,\r\n private readonly localKey: string\n ) {\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\n this.hydrateFromCache();\n }\n\n async load(): Promise<TChild[]> {\n if (this.loaded) return this.items;\n const map = await this.loader();\r\n const key = toKey(this.root[this.localKey]);\r\n const rows = map.get(key) ?? [];\r\n this.items = rows.map(row => this.createEntity(row));\r\n this.loaded = true;\r\n return this.items;\r\n }\r\n\r\n getItems(): TChild[] {\r\n return this.items;\r\n }\r\n\r\n add(data: Partial<TChild>): TChild {\r\n const keyValue = this.root[this.localKey];\r\n const childRow: Record<string, any> = {\r\n ...data,\r\n [this.relation.foreignKey]: keyValue\r\n };\r\n const entity = this.createEntity(childRow);\r\n this.added.add(entity);\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'add', entity }\r\n );\r\n return entity;\r\n }\r\n\r\n attach(entity: TChild): void {\r\n const keyValue = this.root[this.localKey];\r\n (entity as Record<string, any>)[this.relation.foreignKey] = keyValue;\r\n this.ctx.markDirty(entity);\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n }\r\n\r\n remove(entity: TChild): void {\r\n this.items = this.items.filter(item => item !== entity);\r\n this.removed.add(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity }\r\n );\r\n }\r\n\r\n clear(): void {\r\n for (const entity of [...this.items]) {\r\n this.remove(entity);\r\n }\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private hydrateFromCache(): void {\n const keyValue = this.root[this.localKey];\n if (keyValue === undefined || keyValue === null) return;\n const rows = getHydrationRows(this.meta, this.relationName, keyValue);\n if (!rows?.length) return;\n this.items = rows.map(row => this.createEntity(row));\n this.loaded = true;\n }\n\n toJSON(): TChild[] {\n return this.items;\n }\n}\n","import { BelongsToReference } from '../../schema/types.js';\r\nimport { OrmContext, RelationKey } from '../orm-context.js';\r\nimport { BelongsToRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { EntityMeta, getHydrationRecord, hasEntityMeta } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>;\n\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\n\nconst hideInternal = (obj: any, keys: string[]): void => {\n for (const key of keys) {\n Object.defineProperty(obj, key, {\n value: obj[key],\n writable: false,\n configurable: false,\n enumerable: false\n });\n }\n};\n\nexport class DefaultBelongsToReference<TParent> implements BelongsToReference<TParent> {\n private loaded = false;\n private current: TParent | null = null;\n\n constructor(\n private readonly ctx: OrmContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: BelongsToRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, any>) => TParent,\n private readonly targetKey: string\n ) {\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'targetKey']);\n this.populateFromHydrationCache();\n }\n\n async load(): Promise<TParent | null> {\n if (this.loaded) return this.current;\n const map = await this.loader();\r\n const fkValue = this.root[this.relation.foreignKey];\r\n if (fkValue === null || fkValue === undefined) {\r\n this.current = null;\r\n } else {\r\n const row = map.get(toKey(fkValue));\r\n this.current = row ? this.createEntity(row) : null;\r\n }\r\n this.loaded = true;\r\n return this.current;\r\n }\r\n\r\n get(): TParent | null {\r\n return this.current;\r\n }\r\n\r\n set(data: Partial<TParent> | TParent | null): TParent | null {\r\n if (data === null) {\r\n const previous = this.current;\r\n this.root[this.relation.foreignKey] = null;\r\n this.current = null;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'remove', entity: previous }\r\n );\r\n return null;\r\n }\r\n\r\n const entity = hasEntityMeta(data) ? (data as TParent) : this.createEntity(data as Record<string, any>);\r\n const pkValue = (entity as any)[this.targetKey];\r\n if (pkValue !== undefined) {\r\n this.root[this.relation.foreignKey] = pkValue;\r\n }\r\n this.current = entity;\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n return entity;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private populateFromHydrationCache(): void {\n const fkValue = this.root[this.relation.foreignKey];\n if (fkValue === undefined || fkValue === null) return;\n const row = getHydrationRecord(this.meta, this.relationName, fkValue);\n if (!row) return;\n this.current = this.createEntity(row);\n this.loaded = true;\n }\n\n toJSON(): TParent | null {\n return this.current;\n }\n}\n","import { ManyToManyCollection } from '../../schema/types.js';\r\nimport { OrmContext, RelationKey } from '../orm-context.js';\r\nimport { BelongsToManyRelation } from '../../schema/relation.js';\r\nimport { TableDef } from '../../schema/table.js';\r\nimport { findPrimaryKey } from '../../query-builder/hydration-planner.js';\r\nimport { EntityMeta, getHydrationRows } from '../entity-meta.js';\r\n\r\ntype Rows = Record<string, any>[];\n\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\n\nconst hideInternal = (obj: any, keys: string[]): void => {\n for (const key of keys) {\n Object.defineProperty(obj, key, {\n value: obj[key],\n writable: false,\n configurable: false,\n enumerable: false\n });\n }\n};\n\nexport class DefaultManyToManyCollection<TTarget> implements ManyToManyCollection<TTarget> {\n private loaded = false;\n private items: TTarget[] = [];\n\n constructor(\n private readonly ctx: OrmContext,\r\n private readonly meta: EntityMeta<any>,\r\n private readonly root: any,\r\n private readonly relationName: string,\r\n private readonly relation: BelongsToManyRelation,\r\n private readonly rootTable: TableDef,\r\n private readonly loader: () => Promise<Map<string, Rows>>,\r\n private readonly createEntity: (row: Record<string, any>) => TTarget,\n private readonly localKey: string\n ) {\n hideInternal(this, ['ctx', 'meta', 'root', 'relationName', 'relation', 'rootTable', 'loader', 'createEntity', 'localKey']);\n this.hydrateFromCache();\n }\n\n async load(): Promise<TTarget[]> {\n if (this.loaded) return this.items;\n const map = await this.loader();\r\n const key = toKey(this.root[this.localKey]);\r\n const rows = map.get(key) ?? [];\r\n this.items = rows.map(row => {\r\n const entity = this.createEntity(row);\r\n if ((row as any)._pivot) {\r\n (entity as any)._pivot = row._pivot;\r\n }\r\n return entity;\r\n });\r\n this.loaded = true;\r\n return this.items;\r\n }\r\n\r\n getItems(): TTarget[] {\r\n return this.items;\r\n }\r\n\r\n attach(target: TTarget | number | string): void {\r\n const entity = this.ensureEntity(target);\r\n const id = this.extractId(entity);\r\n if (id == null) return;\r\n if (this.items.some(item => this.extractId(item) === id)) {\r\n return;\r\n }\r\n this.items.push(entity);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'attach', entity }\r\n );\r\n }\r\n\r\n detach(target: TTarget | number | string): void {\r\n const id = typeof target === 'number' || typeof target === 'string'\r\n ? target\r\n : this.extractId(target);\r\n\r\n if (id == null) return;\r\n\r\n const existing = this.items.find(item => this.extractId(item) === id);\r\n if (!existing) return;\r\n\r\n this.items = this.items.filter(item => this.extractId(item) !== id);\r\n this.ctx.registerRelationChange(\r\n this.root,\r\n this.relationKey,\r\n this.rootTable,\r\n this.relationName,\r\n this.relation,\r\n { kind: 'detach', entity: existing }\r\n );\r\n }\r\n\r\n async syncByIds(ids: (number | string)[]): Promise<void> {\r\n await this.load();\r\n const targetKey = this.relation.targetKey || findPrimaryKey(this.relation.target);\r\n const normalized = new Set(ids.map(id => toKey(id)));\r\n const currentIds = new Set(this.items.map(item => toKey(this.extractId(item))));\r\n\r\n for (const id of normalized) {\r\n if (!currentIds.has(id)) {\r\n this.attach(id);\r\n }\r\n }\r\n\r\n for (const item of [...this.items]) {\r\n const itemId = toKey(this.extractId(item));\r\n if (!normalized.has(itemId)) {\r\n this.detach(item);\r\n }\r\n }\r\n }\r\n\r\n private ensureEntity(target: TTarget | number | string): TTarget {\r\n if (typeof target === 'number' || typeof target === 'string') {\r\n const stub: Record<string, any> = {\r\n [this.targetKey]: target\r\n };\r\n return this.createEntity(stub);\r\n }\r\n return target;\r\n }\r\n\r\n private extractId(entity: TTarget | number | string | null | undefined): number | string | null {\r\n if (entity === null || entity === undefined) return null;\r\n if (typeof entity === 'number' || typeof entity === 'string') {\r\n return entity;\r\n }\r\n return (entity as any)[this.targetKey] ?? null;\r\n }\r\n\r\n private get relationKey(): RelationKey {\r\n return `${this.rootTable.name}.${this.relationName}`;\r\n }\r\n\r\n private get targetKey(): string {\r\n return this.relation.targetKey || findPrimaryKey(this.relation.target);\r\n }\r\n\r\n private hydrateFromCache(): void {\n const keyValue = this.root[this.localKey];\n if (keyValue === undefined || keyValue === null) return;\n const rows = getHydrationRows(this.meta, this.relationName, keyValue);\n if (!rows?.length) return;\n this.items = rows.map(row => {\r\n const entity = this.createEntity(row);\r\n if ((row as any)._pivot) {\r\n (entity as any)._pivot = (row as any)._pivot;\r\n }\r\n return entity;\n });\n this.loaded = true;\n }\n\n toJSON(): TTarget[] {\n return this.items;\n }\n}\n","import { TableDef } from '../schema/table.js';\r\nimport { BelongsToManyRelation, HasManyRelation, BelongsToRelation } from '../schema/relation.js';\r\nimport { SelectQueryBuilder } from '../query-builder/select.js';\r\nimport { inList, LiteralNode } from '../core/ast/expression.js';\r\nimport { OrmContext, QueryResult } from './orm-context.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst selectAllColumns = (table: TableDef): Record<string, ColumnDef> =>\r\n Object.entries(table.columns).reduce((acc, [name, def]) => {\r\n acc[name] = def;\r\n return acc;\r\n }, {} as Record<string, ColumnDef>);\r\n\r\nconst rowsFromResults = (results: QueryResult[]): Rows => {\r\n const rows: Rows = [];\r\n for (const result of results) {\r\n const { columns, values } = result;\r\n for (const valueRow of values) {\r\n const row: Record<string, any> = {};\r\n columns.forEach((column, idx) => {\r\n row[column] = valueRow[idx];\r\n });\r\n rows.push(row);\r\n }\r\n }\r\n return rows;\r\n};\r\n\r\nconst executeQuery = async (ctx: OrmContext, qb: SelectQueryBuilder<any, TableDef<any>>): Promise<Rows> => {\r\n const compiled = ctx.dialect.compileSelect(qb.getAST());\r\n const results = await ctx.executor.executeSql(compiled.sql, compiled.params);\r\n return rowsFromResults(results);\r\n};\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\nexport const loadHasManyRelation = async (\r\n ctx: OrmContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: HasManyRelation\r\n): Promise<Map<string, Rows>> => {\r\n const localKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const keys = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[localKey];\r\n if (value !== null && value !== undefined) {\r\n keys.add(value);\r\n }\r\n }\r\n\r\n if (!keys.size) {\r\n return new Map();\r\n }\r\n\r\n const selectMap = selectAllColumns(relation.target);\r\n const fb = new SelectQueryBuilder(relation.target).select(selectMap);\r\n const fkColumn = relation.target.columns[relation.foreignKey];\r\n if (!fkColumn) return new Map();\r\n\r\n fb.where(inList(fkColumn, Array.from(keys) as (string | number | LiteralNode)[]));\r\n\r\n const rows = await executeQuery(ctx, fb);\r\n const grouped = new Map<string, Rows>();\r\n\r\n for (const row of rows) {\r\n const fkValue = row[relation.foreignKey];\r\n if (fkValue === null || fkValue === undefined) continue;\r\n const key = toKey(fkValue);\r\n const bucket = grouped.get(key) ?? [];\r\n bucket.push(row);\r\n grouped.set(key, bucket);\r\n }\r\n\r\n return grouped;\r\n};\r\n\r\nexport const loadBelongsToRelation = async (\r\n ctx: OrmContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToRelation\r\n): Promise<Map<string, Record<string, any>>> => {\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const foreignKeys = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[relation.foreignKey];\r\n if (value !== null && value !== undefined) {\r\n foreignKeys.add(value);\r\n }\r\n }\r\n\r\n if (!foreignKeys.size) {\r\n return new Map();\r\n }\r\n\r\n const selectMap = selectAllColumns(relation.target);\r\n const qb = new SelectQueryBuilder(relation.target).select(selectMap);\r\n const targetKey = relation.localKey || findPrimaryKey(relation.target);\r\n const pkColumn = relation.target.columns[targetKey];\r\n if (!pkColumn) return new Map();\r\n\r\n qb.where(inList(pkColumn, Array.from(foreignKeys) as (string | number | LiteralNode)[]));\r\n const rows = await executeQuery(ctx, qb);\r\n const map = new Map<string, Record<string, any>>();\r\n\r\n for (const row of rows) {\r\n const keyValue = row[targetKey];\r\n if (keyValue === null || keyValue === undefined) continue;\r\n map.set(toKey(keyValue), row);\r\n }\r\n\r\n return map;\r\n};\r\n\r\nexport const loadBelongsToManyRelation = async (\r\n ctx: OrmContext,\r\n rootTable: TableDef,\r\n _relationName: string,\r\n relation: BelongsToManyRelation\r\n): Promise<Map<string, Rows>> => {\r\n const rootKey = relation.localKey || findPrimaryKey(rootTable);\r\n const roots = ctx.getEntitiesForTable(rootTable);\r\n const rootIds = new Set<unknown>();\r\n\r\n for (const tracked of roots) {\r\n const value = tracked.entity[rootKey];\r\n if (value !== null && value !== undefined) {\r\n rootIds.add(value);\r\n }\r\n }\r\n\r\n if (!rootIds.size) {\r\n return new Map();\r\n }\r\n\r\n const pivotSelect = selectAllColumns(relation.pivotTable);\r\n const pivotQb = new SelectQueryBuilder(relation.pivotTable).select(pivotSelect);\r\n const pivotFkCol = relation.pivotTable.columns[relation.pivotForeignKeyToRoot];\r\n if (!pivotFkCol) return new Map();\r\n\r\n pivotQb.where(inList(pivotFkCol, Array.from(rootIds) as (string | number | LiteralNode)[]));\r\n const pivotRows = await executeQuery(ctx, pivotQb);\r\n\r\n const rootLookup = new Map<string, { targetId: unknown; pivot: Record<string, any> }[]>();\r\n const targetIds = new Set<unknown>();\r\n\r\n for (const pivot of pivotRows) {\r\n const rootValue = pivot[relation.pivotForeignKeyToRoot];\r\n const targetValue = pivot[relation.pivotForeignKeyToTarget];\r\n if (rootValue === null || rootValue === undefined || targetValue === null || targetValue === undefined) {\r\n continue;\r\n }\r\n const bucket = rootLookup.get(toKey(rootValue)) ?? [];\r\n bucket.push({\r\n targetId: targetValue,\r\n pivot: { ...pivot }\r\n });\r\n rootLookup.set(toKey(rootValue), bucket);\r\n targetIds.add(targetValue);\r\n }\r\n\r\n if (!targetIds.size) {\r\n return new Map();\r\n }\r\n\r\n const targetSelect = selectAllColumns(relation.target);\r\n const targetKey = relation.targetKey || findPrimaryKey(relation.target);\r\n const targetPkColumn = relation.target.columns[targetKey];\r\n if (!targetPkColumn) return new Map();\r\n\r\n const targetQb = new SelectQueryBuilder(relation.target).select(targetSelect);\r\n targetQb.where(inList(targetPkColumn, Array.from(targetIds) as (string | number | LiteralNode)[]));\r\n const targetRows = await executeQuery(ctx, targetQb);\r\n const targetMap = new Map<string, Record<string, any>>();\r\n\r\n for (const row of targetRows) {\r\n const pkValue = row[targetKey];\r\n if (pkValue === null || pkValue === undefined) continue;\r\n targetMap.set(toKey(pkValue), row);\r\n }\r\n\r\n const result = new Map<string, Rows>();\r\n\r\n for (const [rootId, entries] of rootLookup.entries()) {\r\n const bucket: Rows = [];\r\n for (const entry of entries) {\r\n const targetRow = targetMap.get(toKey(entry.targetId));\r\n if (!targetRow) continue;\r\n bucket.push({\r\n ...targetRow,\r\n _pivot: entry.pivot\r\n });\r\n }\r\n result.set(rootId, bucket);\r\n }\r\n\r\n return result;\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { Entity, RelationMap, HasManyCollection, BelongsToReference, ManyToManyCollection } from '../schema/types.js';\r\nimport { OrmContext } from './orm-context.js';\r\nimport { ENTITY_META, EntityMeta, getEntityMeta } from './entity-meta.js';\r\nimport { DefaultHasManyCollection } from './relations/has-many.js';\r\nimport { DefaultBelongsToReference } from './relations/belongs-to.js';\r\nimport { DefaultManyToManyCollection } from './relations/many-to-many.js';\r\nimport { HasManyRelation, BelongsToRelation, BelongsToManyRelation, RelationKinds } from '../schema/relation.js';\r\nimport { loadHasManyRelation, loadBelongsToRelation, loadBelongsToManyRelation } from './lazy-batch.js';\r\nimport { findPrimaryKey } from '../query-builder/hydration-planner.js';\r\n\r\ntype Rows = Record<string, any>[];\r\n\r\nconst relationLoaderCache = <T extends Map<string, any>>(\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n factory: () => Promise<T>\r\n): Promise<T> => {\r\n if (meta.relationCache.has(relationName)) {\r\n return meta.relationCache.get(relationName)! as Promise<T>;\r\n }\r\n\r\n const promise = factory().then(value => {\r\n for (const tracked of meta.ctx.getEntitiesForTable(meta.table)) {\r\n const otherMeta = getEntityMeta(tracked.entity);\r\n if (!otherMeta) continue;\r\n otherMeta.relationHydration.set(relationName, value);\r\n }\r\n return value;\r\n });\r\n\r\n meta.relationCache.set(relationName, promise);\r\n\r\n for (const tracked of meta.ctx.getEntitiesForTable(meta.table)) {\r\n const otherMeta = getEntityMeta(tracked.entity);\r\n if (!otherMeta) continue;\r\n otherMeta.relationCache.set(relationName, promise);\r\n }\r\n\r\n return promise;\r\n};\r\n\r\nexport const createEntityProxy = <\r\n TTable extends TableDef,\r\n TLazy extends keyof RelationMap<TTable> = keyof RelationMap<TTable>\r\n>(\r\n ctx: OrmContext,\r\n table: TTable,\r\n row: Record<string, any>,\r\n lazyRelations: TLazy[] = [] as TLazy[]\r\n): Entity<TTable> => {\r\n const target: Record<string, any> = { ...row };\r\n const meta: EntityMeta<TTable> = {\r\n ctx,\r\n table,\r\n lazyRelations: [...lazyRelations],\r\n relationCache: new Map(),\r\n relationHydration: new Map(),\r\n relationWrappers: new Map()\r\n };\r\n\r\n Object.defineProperty(target, ENTITY_META, {\r\n value: meta,\r\n enumerable: false,\r\n writable: false\r\n });\r\n\r\n let proxy: Entity<TTable>;\r\n const handler: ProxyHandler<any> = {\r\n get(targetObj, prop, receiver) {\r\n if (prop === ENTITY_META) {\r\n return meta;\r\n }\r\n\r\n if (prop === '$load') {\r\n return async (relationName: keyof RelationMap<TTable>) => {\r\n const wrapper = getRelationWrapper(meta, relationName as string, proxy);\r\n if (wrapper && typeof wrapper.load === 'function') {\r\n return wrapper.load();\r\n }\r\n return undefined;\r\n };\r\n }\r\n\r\n if (typeof prop === 'string' && table.relations[prop]) {\r\n return getRelationWrapper(meta, prop, proxy);\r\n }\r\n\r\n return Reflect.get(targetObj, prop, receiver);\r\n },\r\n\r\n set(targetObj, prop, value, receiver) {\r\n const result = Reflect.set(targetObj, prop, value, receiver);\r\n if (typeof prop === 'string' && table.columns[prop]) {\r\n ctx.markDirty(proxy);\r\n }\r\n return result;\r\n }\r\n };\r\n\r\n proxy = new Proxy(target, handler) as Entity<TTable>;\r\n populateHydrationCache(proxy, row, meta);\r\n return proxy;\r\n};\r\n\r\nexport const createEntityFromRow = <TTable extends TableDef>(\r\n ctx: OrmContext,\r\n table: TTable,\r\n row: Record<string, any>,\r\n lazyRelations: (keyof RelationMap<TTable>)[] = []\r\n): Entity<TTable> => {\r\n const pkName = findPrimaryKey(table);\r\n const pkValue = row[pkName];\r\n if (pkValue !== undefined && pkValue !== null) {\r\n const tracked = ctx.getEntity(table, pkValue);\r\n if (tracked) return tracked;\r\n }\r\n\r\n const entity = createEntityProxy(ctx, table, row, lazyRelations);\r\n if (pkValue !== undefined && pkValue !== null) {\r\n ctx.trackManaged(table, pkValue, entity);\r\n } else {\r\n ctx.trackNew(table, entity);\r\n }\r\n\r\n return entity;\r\n};\r\n\r\nconst toKey = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\r\n\r\n const populateHydrationCache = <TTable extends TableDef>(\r\n entity: any,\r\n row: Record<string, any>,\r\n meta: EntityMeta<TTable>\r\n ): void => {\r\n for (const relationName of Object.keys(meta.table.relations)) {\r\n const relation = meta.table.relations[relationName];\r\n const data = row[relationName];\r\n if (!Array.isArray(data)) continue;\r\n\r\n if (relation.type === RelationKinds.HasMany || relation.type === RelationKinds.BelongsToMany) {\r\n const localKey = relation.localKey || findPrimaryKey(meta.table);\r\n const rootValue = entity[localKey];\r\n if (rootValue === undefined || rootValue === null) continue;\r\n const cache = new Map<string, Rows>();\r\n cache.set(toKey(rootValue), data as Rows);\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n continue;\r\n }\r\n\r\n if (relation.type === RelationKinds.BelongsTo) {\r\n const targetKey = relation.localKey || findPrimaryKey(relation.target);\r\n const cache = new Map<string, Record<string, any>>();\r\n for (const item of data) {\r\n const pkValue = item[targetKey];\r\n if (pkValue === undefined || pkValue === null) continue;\r\n cache.set(toKey(pkValue), item);\r\n }\r\n if (cache.size) {\r\n meta.relationHydration.set(relationName, cache);\r\n meta.relationCache.set(relationName, Promise.resolve(cache));\r\n }\r\n }\r\n }\r\n };\r\n\r\nconst getRelationWrapper = (\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n owner: any\r\n): HasManyCollection<any> | BelongsToReference<any> | ManyToManyCollection<any> | undefined => {\r\n if (meta.relationWrappers.has(relationName)) {\r\n return meta.relationWrappers.get(relationName) as HasManyCollection<any>;\r\n }\r\n\r\n const relation = meta.table.relations[relationName];\r\n if (!relation) return undefined;\r\n\r\n const wrapper = instantiateWrapper(meta, relationName, relation as any, owner);\r\n if (wrapper) {\r\n meta.relationWrappers.set(relationName, wrapper);\r\n }\r\n\r\n return wrapper;\r\n};\r\n\r\nconst instantiateWrapper = (\r\n meta: EntityMeta<any>,\r\n relationName: string,\r\n relation: HasManyRelation | BelongsToRelation | BelongsToManyRelation,\r\n owner: any\r\n): HasManyCollection<any> | BelongsToReference<any> | ManyToManyCollection<any> | undefined => {\r\n switch (relation.type) {\r\n case RelationKinds.HasMany: {\r\n const hasMany = relation as HasManyRelation;\r\n const localKey = hasMany.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadHasManyRelation(meta.ctx, meta.table, relationName, hasMany)\r\n );\r\n return new DefaultHasManyCollection(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n hasMany,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n localKey\r\n );\r\n }\r\n case RelationKinds.BelongsTo: {\r\n const belongsTo = relation as BelongsToRelation;\r\n const targetKey = belongsTo.localKey || findPrimaryKey(belongsTo.target);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadBelongsToRelation(meta.ctx, meta.table, relationName, belongsTo)\r\n );\r\n return new DefaultBelongsToReference(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n belongsTo,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n targetKey\r\n );\r\n }\r\n case RelationKinds.BelongsToMany: {\r\n const many = relation as BelongsToManyRelation;\r\n const localKey = many.localKey || findPrimaryKey(meta.table);\r\n const loader = () => relationLoaderCache(meta, relationName, () =>\r\n loadBelongsToManyRelation(meta.ctx, meta.table, relationName, many)\r\n );\r\n return new DefaultManyToManyCollection(\r\n meta.ctx,\r\n meta,\r\n owner,\r\n relationName,\r\n many,\r\n meta.table,\r\n loader,\r\n (row: Record<string, any>) => createEntityFromRow(meta.ctx, relation.target, row),\r\n localKey\r\n );\r\n }\r\n default:\r\n return undefined;\r\n }\r\n};\r\n","import { TableDef } from '../schema/table.js';\r\nimport { Entity } from '../schema/types.js';\r\nimport { hydrateRows } from './hydration.js';\nimport { OrmContext } from './orm-context.js';\nimport { SelectQueryBuilder } from '../query-builder/select.js';\nimport { createEntityFromRow, createEntityProxy } from './entity.js';\n\r\ntype Row = Record<string, any>;\r\n\r\nconst flattenResults = (results: { columns: string[]; values: unknown[][] }[]): Row[] => {\r\n const rows: Row[] = [];\r\n for (const result of results) {\r\n const { columns, values } = result;\r\n for (const valueRow of values) {\r\n const row: Row = {};\r\n columns.forEach((column, idx) => {\r\n row[column] = valueRow[idx];\r\n });\r\n rows.push(row);\r\n }\r\n }\r\n return rows;\r\n};\r\n\r\nexport async function executeHydrated<TTable extends TableDef>(\n ctx: OrmContext,\n qb: SelectQueryBuilder<any, TTable>\n): Promise<Entity<TTable>[]> {\n const ast = qb.getAST();\n const compiled = ctx.dialect.compileSelect(ast);\n const executed = await ctx.executor.executeSql(compiled.sql, compiled.params);\n const rows = flattenResults(executed);\n\n // Set-operation queries cannot be reliably hydrated and should not collapse duplicates.\n if (ast.setOps && ast.setOps.length > 0) {\n return rows.map(row =>\n createEntityProxy(ctx, qb.getTable(), row, qb.getLazyRelations())\n );\n }\n\n const hydrated = hydrateRows(rows, qb.getHydrationPlan());\n return hydrated.map(row =>\n createEntityFromRow(ctx, qb.getTable(), row, qb.getLazyRelations())\n );\n}\n","import { TableDef } from '../schema/table.js';\r\nimport { ColumnDef } from '../schema/column.js';\r\nimport { SelectQueryNode, HydrationPlan, SetOperationKind } from '../core/ast/query.js';\nimport {\r\n ColumnNode,\r\n ExpressionNode,\r\n FunctionNode,\r\n LiteralNode,\r\n BinaryExpressionNode,\r\n CaseExpressionNode,\r\n WindowFunctionNode,\r\n exists,\r\n notExists\r\n} from '../core/ast/expression.js';\r\nimport { CompiledQuery, Dialect } from '../core/dialect/abstract.js';\r\nimport { SelectQueryState } from './select-query-state.js';\r\nimport { HydrationManager } from './hydration-manager.js';\r\nimport {\r\n resolveSelectQueryBuilderDependencies,\r\n SelectQueryBuilderContext,\r\n SelectQueryBuilderDependencies,\r\n SelectQueryBuilderEnvironment\r\n} from './select-query-builder-deps.js';\r\nimport { QueryAstService } from './query-ast-service.js';\r\nimport { ColumnSelector } from './column-selector.js';\r\nimport { RelationManager } from './relation-manager.js';\r\nimport { RelationIncludeOptions } from './relation-types.js';\r\nimport { JOIN_KINDS, JoinKind, ORDER_DIRECTIONS, OrderDirection } from '../core/sql/sql.js';\r\nimport { Entity, RelationMap } from '../schema/types.js';\r\nimport { OrmContext } from '../orm/orm-context.js';\r\nimport { executeHydrated } from '../orm/execute.js';\r\nimport { createJoinNode } from '../core/ast/join-node.js';\r\n\r\n/**\r\n * Main query builder class for constructing SQL SELECT queries\r\n * @typeParam T - Result type for projections (unused)\r\n * @typeParam TTable - Table definition being queried\r\n */\r\nexport class SelectQueryBuilder<T = any, TTable extends TableDef = TableDef> {\r\n private readonly env: SelectQueryBuilderEnvironment;\r\n private readonly context: SelectQueryBuilderContext;\r\n private readonly columnSelector: ColumnSelector;\r\n private readonly relationManager: RelationManager;\r\n private readonly lazyRelations: Set<string>;\r\n\r\n /**\r\n * Creates a new SelectQueryBuilder instance\r\n * @param table - Table definition to query\r\n * @param state - Optional initial query state\r\n * @param hydration - Optional hydration manager\r\n * @param dependencies - Optional query builder dependencies\r\n */\r\n constructor(\r\n table: TTable,\r\n state?: SelectQueryState,\r\n hydration?: HydrationManager,\r\n dependencies?: Partial<SelectQueryBuilderDependencies>,\r\n lazyRelations?: Set<string>\r\n ) {\r\n const deps = resolveSelectQueryBuilderDependencies(dependencies);\r\n this.env = { table, deps };\r\n const initialState = state ?? deps.createState(table);\r\n const initialHydration = hydration ?? deps.createHydration(table);\r\n this.context = {\r\n state: initialState,\r\n hydration: initialHydration\r\n };\r\n this.lazyRelations = new Set(lazyRelations ?? []);\r\n this.columnSelector = new ColumnSelector(this.env);\r\n this.relationManager = new RelationManager(this.env);\r\n }\r\n\r\n private clone(\r\n context: SelectQueryBuilderContext = this.context,\r\n lazyRelations = new Set(this.lazyRelations)\r\n ): SelectQueryBuilder<T, TTable> {\r\n return new SelectQueryBuilder(this.env.table as TTable, context.state, context.hydration, this.env.deps, lazyRelations);\r\n }\r\n\r\n private resolveQueryNode(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryNode {\r\n return typeof (query as any).getAST === 'function'\r\n ? (query as SelectQueryBuilder<any, TableDef<any>>).getAST()\r\n : (query as SelectQueryNode);\r\n }\r\n\r\n private createChildBuilder<R, TChild extends TableDef>(table: TChild): SelectQueryBuilder<R, TChild> {\r\n return new SelectQueryBuilder(table, undefined, undefined, this.env.deps);\r\n }\r\n\r\n private applyAst(\r\n context: SelectQueryBuilderContext,\r\n mutator: (service: QueryAstService) => SelectQueryState\r\n ): SelectQueryBuilderContext {\r\n const astService = this.env.deps.createQueryAstService(this.env.table, context.state);\r\n const nextState = mutator(astService);\r\n return { state: nextState, hydration: context.hydration };\r\n }\r\n\r\n private applyJoin(\n context: SelectQueryBuilderContext,\n table: TableDef,\n condition: BinaryExpressionNode,\n kind: JoinKind\n ): SelectQueryBuilderContext {\n const joinNode = createJoinNode(kind, table.name, condition);\n return this.applyAst(context, service => service.withJoin(joinNode));\n }\n\n private applySetOperation(\n operator: SetOperationKind,\n query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode\n ): SelectQueryBuilderContext {\n const subAst = this.resolveQueryNode(query);\n return this.applyAst(this.context, service => service.withSetOperation(operator, subAst));\n }\n\r\n /**\r\n * Selects specific columns for the query\r\n * @param columns - Record of column definitions, function nodes, case expressions, or window functions\r\n * @returns New query builder instance with selected columns\r\n */\r\n select(columns: Record<string, ColumnDef | FunctionNode | CaseExpressionNode | WindowFunctionNode>): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.columnSelector.select(this.context, columns));\r\n }\r\n\r\n /**\r\n * Selects raw column expressions\r\n * @param cols - Column expressions as strings\r\n * @returns New query builder instance with raw column selections\r\n */\r\n selectRaw(...cols: string[]): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.columnSelector.selectRaw(this.context, cols));\r\n }\r\n\r\n /**\r\n * Adds a Common Table Expression (CTE) to the query\r\n * @param name - Name of the CTE\r\n * @param query - Query builder or query node for the CTE\r\n * @param columns - Optional column names for the CTE\r\n * @returns New query builder instance with the CTE\r\n */\r\n with(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(query);\r\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, false));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a recursive Common Table Expression (CTE) to the query\r\n * @param name - Name of the CTE\r\n * @param query - Query builder or query node for the CTE\r\n * @param columns - Optional column names for the CTE\r\n * @returns New query builder instance with the recursive CTE\r\n */\r\n withRecursive(name: string, query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode, columns?: string[]): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(query);\r\n const nextContext = this.applyAst(this.context, service => service.withCte(name, subAst, columns, true));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Selects a subquery as a column\r\n * @param alias - Alias for the subquery column\r\n * @param sub - Query builder or query node for the subquery\r\n * @returns New query builder instance with the subquery selection\r\n */\r\n selectSubquery(alias: string, sub: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const query = this.resolveQueryNode(sub);\r\n return this.clone(this.columnSelector.selectSubquery(this.context, alias, query));\r\n }\r\n\r\n /**\r\n * Adds an INNER JOIN to the query\r\n * @param table - Table to join\r\n * @param condition - Join condition expression\r\n * @returns New query builder instance with the INNER JOIN\r\n */\r\n innerJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.INNER);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a LEFT JOIN to the query\r\n * @param table - Table to join\r\n * @param condition - Join condition expression\r\n * @returns New query builder instance with the LEFT JOIN\r\n */\r\n leftJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.LEFT);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a RIGHT JOIN to the query\r\n * @param table - Table to join\r\n * @param condition - Join condition expression\r\n * @returns New query builder instance with the RIGHT JOIN\r\n */\r\n rightJoin(table: TableDef, condition: BinaryExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyJoin(this.context, table, condition, JOIN_KINDS.RIGHT);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Matches records based on a relationship\r\n * @param relationName - Name of the relationship to match\r\n * @param predicate - Optional predicate expression\r\n * @returns New query builder instance with the relationship match\r\n */\r\n match(relationName: string, predicate?: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.relationManager.match(this.context, relationName, predicate);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Joins a related table\r\n * @param relationName - Name of the relationship to join\r\n * @param joinKind - Type of join (defaults to INNER)\r\n * @param extraCondition - Optional additional join condition\r\n * @returns New query builder instance with the relationship join\r\n */\r\n joinRelation(\r\n relationName: string,\r\n joinKind: JoinKind = JOIN_KINDS.INNER,\r\n extraCondition?: ExpressionNode\r\n ): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.relationManager.joinRelation(this.context, relationName, joinKind, extraCondition);\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Includes related data in the query results\r\n * @param relationName - Name of the relationship to include\r\n * @param options - Optional include options\r\n * @returns New query builder instance with the relationship inclusion\r\n */\r\n include(relationName: string, options?: RelationIncludeOptions): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.relationManager.include(this.context, relationName, options);\r\n return this.clone(nextContext);\r\n }\r\n\r\n includeLazy<K extends keyof RelationMap<TTable>>(relationName: K): SelectQueryBuilder<T, TTable> {\r\n const nextLazy = new Set(this.lazyRelations);\r\n nextLazy.add(relationName as string);\r\n return this.clone(this.context, nextLazy);\r\n }\r\n\r\n getLazyRelations(): (keyof RelationMap<TTable>)[] {\r\n return Array.from(this.lazyRelations) as (keyof RelationMap<TTable>)[];\r\n }\r\n\r\n getTable(): TTable {\r\n return this.env.table as TTable;\r\n }\r\n\r\n async execute(ctx: OrmContext): Promise<Entity<TTable>[]> {\r\n return executeHydrated(ctx, this);\r\n }\r\n\r\n /**\r\n * Adds a WHERE condition to the query\r\n * @param expr - Expression for the WHERE clause\r\n * @returns New query builder instance with the WHERE condition\r\n */\r\n where(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withWhere(expr));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a GROUP BY clause to the query\r\n * @param col - Column definition or column node to group by\r\n * @returns New query builder instance with the GROUP BY clause\r\n */\r\n groupBy(col: ColumnDef | ColumnNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withGroupBy(col));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a HAVING condition to the query\r\n * @param expr - Expression for the HAVING clause\r\n * @returns New query builder instance with the HAVING condition\r\n */\r\n having(expr: ExpressionNode): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withHaving(expr));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds an ORDER BY clause to the query\r\n * @param col - Column definition or column node to order by\r\n * @param direction - Order direction (defaults to ASC)\r\n * @returns New query builder instance with the ORDER BY clause\r\n */\r\n orderBy(col: ColumnDef | ColumnNode, direction: OrderDirection = ORDER_DIRECTIONS.ASC): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withOrderBy(col, direction));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds a DISTINCT clause to the query\r\n * @param cols - Columns to make distinct\r\n * @returns New query builder instance with the DISTINCT clause\r\n */\r\n distinct(...cols: (ColumnDef | ColumnNode)[]): SelectQueryBuilder<T, TTable> {\r\n return this.clone(this.columnSelector.distinct(this.context, cols));\r\n }\r\n\r\n /**\r\n * Adds a LIMIT clause to the query\r\n * @param n - Maximum number of rows to return\r\n * @returns New query builder instance with the LIMIT clause\r\n */\r\n limit(n: number): SelectQueryBuilder<T, TTable> {\r\n const nextContext = this.applyAst(this.context, service => service.withLimit(n));\r\n return this.clone(nextContext);\r\n }\r\n\r\n /**\r\n * Adds an OFFSET clause to the query\r\n * @param n - Number of rows to skip\r\n * @returns New query builder instance with the OFFSET clause\r\n */\r\n offset(n: number): SelectQueryBuilder<T, TTable> {\n const nextContext = this.applyAst(this.context, service => service.withOffset(n));\n return this.clone(nextContext);\n }\n\n /**\n * Combines this query with another using UNION\n * @param query - Query to union with\n * @returns New query builder instance with the set operation\n */\n union(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n return this.clone(this.applySetOperation('UNION', query));\n }\n\n /**\n * Combines this query with another using UNION ALL\n * @param query - Query to union with\n * @returns New query builder instance with the set operation\n */\n unionAll(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n return this.clone(this.applySetOperation('UNION ALL', query));\n }\n\n /**\n * Combines this query with another using INTERSECT\n * @param query - Query to intersect with\n * @returns New query builder instance with the set operation\n */\n intersect(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n return this.clone(this.applySetOperation('INTERSECT', query));\n }\n\n /**\n * Combines this query with another using EXCEPT\n * @param query - Query to subtract\n * @returns New query builder instance with the set operation\n */\n except(query: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\n return this.clone(this.applySetOperation('EXCEPT', query));\n }\n\r\n /**\r\n * Adds a WHERE EXISTS condition to the query\r\n * @param subquery - Subquery to check for existence\r\n * @returns New query builder instance with the WHERE EXISTS condition\r\n */\r\n whereExists(subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(subquery);\r\n return this.where(exists(subAst));\r\n }\r\n\r\n /**\r\n * Adds a WHERE NOT EXISTS condition to the query\r\n * @param subquery - Subquery to check for non-existence\r\n * @returns New query builder instance with the WHERE NOT EXISTS condition\r\n */\r\n whereNotExists(subquery: SelectQueryBuilder<any, TableDef<any>> | SelectQueryNode): SelectQueryBuilder<T, TTable> {\r\n const subAst = this.resolveQueryNode(subquery);\r\n return this.where(notExists(subAst));\r\n }\r\n\r\n /**\r\n * Adds a WHERE EXISTS condition based on a relationship\r\n * @param relationName - Name of the relationship to check\r\n * @param callback - Optional callback to modify the relationship query\r\n * @returns New query builder instance with the relationship existence check\r\n */\r\n whereHas(\r\n relationName: string,\r\n callback?: <TChildTable extends TableDef>(\r\n qb: SelectQueryBuilder<any, TChildTable>\r\n ) => SelectQueryBuilder<any, TChildTable>\r\n ): SelectQueryBuilder<T, TTable> {\r\n const relation = this.env.table.relations[relationName];\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\r\n }\r\n\r\n let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\r\n if (callback) {\r\n subQb = callback(subQb);\r\n }\r\n\r\n const subAst = subQb.getAST();\r\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst);\r\n return this.where(exists(finalSubAst));\r\n }\r\n\r\n /**\r\n * Adds a WHERE NOT EXISTS condition based on a relationship\r\n * @param relationName - Name of the relationship to check\r\n * @param callback - Optional callback to modify the relationship query\r\n * @returns New query builder instance with the relationship non-existence check\r\n */\r\n whereHasNot(\r\n relationName: string,\r\n callback?: <TChildTable extends TableDef>(\r\n qb: SelectQueryBuilder<any, TChildTable>\r\n ) => SelectQueryBuilder<any, TChildTable>\r\n ): SelectQueryBuilder<T, TTable> {\r\n const relation = this.env.table.relations[relationName];\r\n if (!relation) {\r\n throw new Error(`Relation '${relationName}' not found on table '${this.env.table.name}'`);\r\n }\r\n\r\n let subQb = this.createChildBuilder<any, typeof relation.target>(relation.target);\r\n if (callback) {\r\n subQb = callback(subQb);\r\n }\r\n\r\n const subAst = subQb.getAST();\r\n const finalSubAst = this.relationManager.applyRelationCorrelation(this.context, relationName, subAst);\r\n return this.where(notExists(finalSubAst));\r\n }\r\n\r\n /**\r\n * Compiles the query to SQL for a specific dialect\r\n * @param dialect - Database dialect to compile for\r\n * @returns Compiled query with SQL and parameters\r\n */\r\n compile(dialect: Dialect): CompiledQuery {\r\n return dialect.compileSelect(this.context.state.ast);\r\n }\r\n\r\n /**\r\n * Converts the query to SQL string for a specific dialect\r\n * @param dialect - Database dialect to generate SQL for\r\n * @returns SQL string representation of the query\r\n */\r\n toSql(dialect: Dialect): string {\r\n return this.compile(dialect).sql;\r\n }\r\n\r\n /**\r\n * Gets the hydration plan for the query\r\n * @returns Hydration plan or undefined if none exists\r\n */\r\n getHydrationPlan(): HydrationPlan | undefined {\r\n return this.context.hydration.getPlan();\r\n }\r\n\r\n /**\r\n * Gets the Abstract Syntax Tree (AST) representation of the query\r\n * @returns Query AST with hydration applied\r\n */\r\n getAST(): SelectQueryNode {\r\n return this.context.hydration.applyToAst(this.context.state.ast);\r\n }\r\n}\r\n\r\n/**\r\n * Creates a column node for use in expressions\r\n * @param table - Table name\r\n * @param name - Column name\r\n * @returns ColumnNode with the specified table and name\r\n */\r\nexport const createColumn = (table: string, name: string): ColumnNode => ({ type: 'Column', table, name });\r\n\r\n/**\r\n * Creates a literal value node for use in expressions\r\n * @param val - Literal value (string or number)\r\n * @returns LiteralNode with the specified value\r\n */\r\nexport const createLiteral = (val: string | number): LiteralNode => ({ type: 'Literal', value: val });\r\n","import { SelectQueryBuilder } from '../query-builder/select.js';\nimport {\n hasMany,\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.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","state","hydration","relationSelectionResult","toKey","toKey","hideInternal","toKey","hideInternal","toKey","toKey","hasMany","belongsTo"]}