{"version":3,"sources":["../../src/errors/query-builder-error.ts","../../src/compilers/compiler-registry.ts","../../src/metadata/output-metadata-builder.ts","../../src/plan/query-plan.ts","../../src/compilers/sql/sql-compiler.ts","../../src/compilers/sql/clickhouse.ts","../../src/compilers/sql/postgres.ts","../../src/compilers/search-dsl/search-dsl-compiler.ts","../../src/compilers/search-dsl/elasticsearch.ts","../../src/compilers/search-dsl/opensearch.ts","../../src/compilers/register-default-compilers.ts","../../src/input/normalize-input.ts","../../src/input/validate-input.ts","../../src/input/validate-mutation.ts","../../src/metadata/output-name-generator.ts","../../src/plan/input-to-plan.ts","../../src/plan/mutation-plan.ts","../../src/plan/input-to-mutation-plan.ts","../../src/plan/validate-plan.ts","../../src/query-builder.ts"],"names":["QueryBuilderError","Error","constructor","payload","message","code","path","details","name","CompilerRegistry","compilers","Map","register","engine","compiler","set","has","get","registered","keys","join","defaultRegistry","buildOutputMetadata","plan","paginationMode","outputFields","grouping","aggregations","length","group","groups","push","outputName","kind","sourceField","field","type","granularity","agg","function","fn","projection","fields","qualifiedName","pagination","mode","requiresStableSort","PlanNode","FieldRefNode","nestedPath","SourceNode","schema","ProjectionNode","FilterNode","FilterConditionNode","operator","value","LogicalFilterNode","children","NotFilterNode","child","AggregationNode","GroupFieldNode","offset","limit","GroupingNode","HavingNode","HavingConditionNode","aggregation","LogicalHavingNode","NotHavingNode","OrderNode","target","direction","PaginationNode","skip","cursor","LimitNode","QueryPlan","source","filter","having","ordering","limits","SqlParamContext","values","namedValues","counter","next","SqlCompiler","dialect","compile","ctx","bind","bindValue","literal","renderLiteral","query","render","plainQuery","metadata","compileMutation","emit","table","qualifiedTable","operation","valuesSql","rows","map","row","renderInsert","columns","conflictKeys","keyColumns","where","renderFilter","renderDelete","assignments","a","col","escapeIdentifier","op","renderAssignment","renderUpdate","node","renderFieldPath","parts","renderSelect","renderGroupBy","renderHaving","renderOrderBy","groupExpr","aggExpr","f","expr","g","renderDateGroup","toUpperCase","renderCondition","c","escapeLikePattern","split","asArray","v","String","low","high","renderComparison","ops","eq","neq","gt","gte","lt","lte","sql","order","dir","find","Array","isArray","CLICKHOUSE_DATE_FN","hour","day","week","month","quarter","year","clickHouseType","Number","isInteger","Date","CLICKHOUSE_JSON_EXTRACT","string","number","boolean","date","ClickHouseDialect","identifier","k","undefined","_conflict","cols","column","ClickHouseCompiler","POSTGRES_JSON_CAST","PostgresDialect","segments","key","forEach","segment","i","cast","conflict","updates","includes","PostgresCompiler","SearchDslCompiler","body","grouped","_source","esFieldName","buildQuery","aggs","buildAggs","size","sort","buildSort","Object","assign","renderSearchAfter","from","index","documents","doc","onConflict","match_all","params","lines","assignment","param","script","lang","clauses","bool","must","should","minimum_should_match","must_not","renderTerm","renderRange","terms","renderWildcard","escapeWildcard","exists","metrics","metricAgg","inner","shell","renderDateHistogram","renderTermsAggregation","value_count","ElasticsearchDialect","term","bounds","range","pattern","wildcard","dateHistogram","calendar_interval","date_histogram","search_after","ElasticsearchCompiler","OpenSearchDialect","OpenSearchCompiler","registerDefaultCompilers","registry","DEFAULT_LIMIT","normalizeInput","input","FIELD_TYPES","Set","validateFieldPath","jsonPath","errors","validateFilterPaths","and","e","or","not","validateInputShape","select","sel","groupBy","orderBy","o","validateMutationInput","validateInsertRows","validateOnConflict","setCount","actionCount","actions","action","validateUpdateAction","allowUnfiltered","isPlainObject","r","firstKeys","keySignature","by","OutputNameGenerator","reserved","reserve","add","aggregationName","base","ensureUnique","dateGroupName","safe","suffix","candidate","inputToPlan","names","s","_a","buildFilter","buildAggregation","_b","_c","_d","_e","buildHaving","buildOrder","def","buildFilterNode","resolveAggregation","match","AssignmentNode","MutationPlan","inputToMutationPlan","buildAssignments","MAX_LIMIT","MAX_SKIP","MAX_SELECTED_FIELDS","engineRules","validatePlan","context","hasSelect","hasGrouping","hasAggregations","groupFields","rule","validate","QueryBuilder","options","resolveEngine","shapeErrors","valid","planErrors","assertValid","transpile","optionEngine","ctorEngine","MutationBuilder"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Error model for `@qrvey/query-builder`.\n *\n * Every failure is a {@link QueryBuilderError} with a stable {@link\n * QueryBuilderErrorCode} and a `path` pointing at the offending input location\n * (e.g. `$.groupBy[0].limit`). Add a code here when a new failure mode appears.\n */\n\nexport type QueryBuilderErrorCode =\n    | 'INVALID_INPUT'\n    | 'MISSING_ENGINE'\n    | 'UNSUPPORTED_ENGINE'\n    | 'UNSUPPORTED_ENGINE_BEHAVIOR'\n    | 'INVALID_IDENTIFIER'\n    | 'INVALID_FIELD_TYPE'\n    | 'INVALID_OPERATOR_FOR_TYPE'\n    | 'INVALID_IN_VALUE'\n    | 'INVALID_GROUP_SELECTION'\n    | 'INVALID_AGGREGATION_SELECTION'\n    | 'INVALID_HAVING_CONDITION'\n    | 'INVALID_ORDER_BY'\n    | 'INVALID_MUTATION'\n    | 'UNFILTERED_MUTATION'\n    | 'UNSUPPORTED_AGGREGATION_FOR_ENGINE'\n    | 'UNSUPPORTED_DATE_GRANULARITY_FOR_ENGINE'\n    | 'UNSUPPORTED_PAGINATION_FOR_ENGINE'\n    | 'UNSUPPORTED_GROUP_LIMIT_FOR_ENGINE'\n    | 'LIMIT_EXCEEDED'\n    | 'SKIP_EXCEEDED'\n    | 'MAX_SELECTED_FIELDS_EXCEEDED'\n    | 'SEARCH_AFTER_REQUIRES_ORDER_BY'\n    | 'AMBIGUOUS_PAGINATION';\n\nexport type QueryBuilderErrorPayload = {\n    code: QueryBuilderErrorCode;\n    /** JSON-path-like pointer to the offending input, e.g. `$.select[0]`. */\n    path: string;\n    message: string;\n    details?: Record<string, unknown>;\n};\n\nexport class QueryBuilderError extends Error {\n    readonly code: QueryBuilderErrorCode;\n    readonly path: string;\n    readonly details?: Record<string, unknown>;\n\n    constructor(readonly payload: QueryBuilderErrorPayload) {\n        super(payload.message);\n        this.name = 'QueryBuilderError';\n        this.code = payload.code;\n        this.path = payload.path;\n        this.details = payload.details;\n    }\n}\n","/**\n * Maps an {@link Engine} to its {@link QueryCompiler}.\n *\n * Compilers are wired in `register-default-compilers.ts`. Adding an engine means\n * registering a compiler, not changing the input contract.\n */\nimport { QueryBuilderError } from '../errors/query-builder-error';\nimport type { Engine } from '../input/input-types';\nimport type { QueryCompiler, TranspileResult } from './compiler';\n\nexport class CompilerRegistry {\n    private readonly compilers = new Map<\n        Engine,\n        QueryCompiler<TranspileResult>\n    >();\n\n    register(engine: Engine, compiler: QueryCompiler<TranspileResult>): void {\n        this.compilers.set(engine, compiler);\n    }\n\n    has(engine: Engine): boolean {\n        return this.compilers.has(engine);\n    }\n\n    get(engine: Engine): QueryCompiler<TranspileResult> {\n        const compiler = this.compilers.get(engine);\n        if (!compiler) {\n            const registered = [...this.compilers.keys()].join(', ') || 'none';\n            throw new QueryBuilderError({\n                code: 'UNSUPPORTED_ENGINE',\n                path: '$.engine',\n                message: `Unsupported engine: \"${engine}\". Registered engines: ${registered}.`,\n                details: { engine },\n            });\n        }\n        return compiler;\n    }\n}\n\n/** The registry used by {@link QueryBuilder} by default. */\nexport const defaultRegistry = new CompilerRegistry();\n","/**\n * Builds output metadata from a {@link QueryPlan}.\n *\n * Every compiler uses this so `outputFields` (names/types/kinds) stay identical\n * across engines. The pagination mode is passed in by the compiler because it\n * is family-specific (SQL → offset; search → offset or search_after).\n */\nimport type {\n    QueryOutputField,\n    QueryOutputMetadata,\n} from '../compilers/compiler';\nimport type { QueryPlan } from '../plan/query-plan';\n\nexport function buildOutputMetadata(\n    plan: QueryPlan,\n    paginationMode: 'offset' | 'search_after',\n): QueryOutputMetadata {\n    const outputFields: QueryOutputField[] = [];\n\n    // Grouped/aggregated output: group fields + aggregations.\n    if (plan.grouping || plan.aggregations.length > 0) {\n        for (const group of plan.grouping?.groups ?? []) {\n            outputFields.push({\n                name: group.outputName,\n                kind: 'group',\n                sourceField: group.field.field,\n                type: group.field.type,\n                ...(group.granularity\n                    ? { granularity: group.granularity }\n                    : {}),\n            });\n        }\n        for (const agg of plan.aggregations) {\n            outputFields.push({\n                name: agg.outputName,\n                kind: 'aggregation',\n                sourceField: agg.field?.field ?? '',\n                function: agg.fn,\n                // Aggregations produce numbers (count/sum/avg/min/max).\n                type: 'number',\n            });\n        }\n    } else if (plan.projection) {\n        // Row output: selected fields.\n        for (const field of plan.projection.fields) {\n            outputFields.push({\n                name: field.qualifiedName(),\n                kind: 'field',\n                sourceField: field.qualifiedName(),\n                type: field.type,\n            });\n        }\n    }\n\n    const pagination: QueryOutputMetadata['pagination'] =\n        paginationMode === 'search_after'\n            ? { mode: 'search_after', requiresStableSort: true }\n            : { mode: 'offset' };\n\n    return { outputFields, pagination };\n}\n","/**\n * Internal logical model (QueryPlan / AST).\n *\n * The plan separates the public input contract from engine compilers. It\n * represents query *intent*, not engine syntax. Compilers consume a validated\n * plan; they must not depend on the raw {@link QueryInput}.\n *\n * `path` on every node points back to the input location it came from, so\n * validation errors can pinpoint the exact input segment.\n */\nimport type {\n    AggregationFunction,\n    DateGranularity,\n    FieldType,\n    FilterOperator,\n    SortDirection,\n} from '../input/input-types';\n\nexport abstract class PlanNode {\n    abstract readonly kind: string;\n    constructor(readonly path: string) {}\n}\n\nexport class FieldRefNode extends PlanNode {\n    readonly kind = 'field-ref';\n    constructor(\n        path: string,\n        readonly field: string,\n        readonly type: FieldType,\n        /**\n         * Nested access path *within* `field` when it holds a JSON/object value\n         * (equivalent to data-persistence `relativePath`). `null`/empty = scalar\n         * field. Rendered per engine: JSON operators (SQL) or a dotted field\n         * name (ES/OS).\n         */\n        readonly nestedPath: string[] | null = null,\n    ) {\n        super(path);\n    }\n\n    /**\n     * Dotted name including the nested path (`profile.address.city`), used for\n     * SQL column aliases, ES/OS field names and output metadata so the field's\n     * output name is consistent across engines. Plain `field` when scalar.\n     */\n    qualifiedName(): string {\n        return this.nestedPath && this.nestedPath.length > 0\n            ? [this.field, ...this.nestedPath].join('.')\n            : this.field;\n    }\n}\n\nexport class SourceNode extends PlanNode {\n    readonly kind = 'source';\n    constructor(\n        path: string,\n        readonly name: string,\n        readonly schema: string | null = null,\n    ) {\n        super(path);\n    }\n}\n\nexport class ProjectionNode extends PlanNode {\n    readonly kind = 'projection';\n    constructor(\n        path: string,\n        readonly fields: FieldRefNode[],\n    ) {\n        super(path);\n    }\n}\n\n/* ── Filters ─────────────────────────────────────────────────── */\n\nexport abstract class FilterNode extends PlanNode {}\n\nexport class FilterConditionNode extends FilterNode {\n    readonly kind = 'filter-condition';\n    constructor(\n        path: string,\n        readonly field: FieldRefNode,\n        readonly operator: FilterOperator,\n        readonly value: unknown,\n    ) {\n        super(path);\n    }\n}\n\nexport class LogicalFilterNode extends FilterNode {\n    readonly kind = 'logical-filter';\n    constructor(\n        path: string,\n        readonly operator: 'and' | 'or',\n        readonly children: FilterNode[],\n    ) {\n        super(path);\n    }\n}\n\nexport class NotFilterNode extends FilterNode {\n    readonly kind = 'not-filter';\n    constructor(\n        path: string,\n        readonly child: FilterNode,\n    ) {\n        super(path);\n    }\n}\n\n/* ── Aggregations & grouping ─────────────────────────────────── */\n\nexport class AggregationNode extends PlanNode {\n    readonly kind = 'aggregation';\n    constructor(\n        path: string,\n        readonly fn: AggregationFunction,\n        /** `null` only for `count` without a field (COUNT(*)). */\n        readonly field: FieldRefNode | null,\n        /** Deterministic output name, generated once during plan creation. */\n        readonly outputName: string,\n    ) {\n        super(path);\n    }\n}\n\nexport class GroupFieldNode extends PlanNode {\n    readonly kind = 'group-field';\n    constructor(\n        path: string,\n        readonly field: FieldRefNode,\n        readonly granularity: DateGranularity | null,\n        readonly offset: string | null,\n        readonly limit: number | null,\n        /** Deterministic output name for this group level. */\n        readonly outputName: string,\n    ) {\n        super(path);\n    }\n}\n\nexport class GroupingNode extends PlanNode {\n    readonly kind = 'grouping';\n    constructor(\n        path: string,\n        readonly groups: GroupFieldNode[],\n    ) {\n        super(path);\n    }\n}\n\n/* ── Having ──────────────────────────────────────────────────── */\n\nexport abstract class HavingNode extends PlanNode {}\n\nexport class HavingConditionNode extends HavingNode {\n    readonly kind = 'having-condition';\n    constructor(\n        path: string,\n        readonly aggregation: AggregationNode,\n        readonly operator: FilterOperator,\n        readonly value: unknown,\n    ) {\n        super(path);\n    }\n}\n\nexport class LogicalHavingNode extends HavingNode {\n    readonly kind = 'logical-having';\n    constructor(\n        path: string,\n        readonly operator: 'and' | 'or',\n        readonly children: HavingNode[],\n    ) {\n        super(path);\n    }\n}\n\nexport class NotHavingNode extends HavingNode {\n    readonly kind = 'not-having';\n    constructor(\n        path: string,\n        readonly child: HavingNode,\n    ) {\n        super(path);\n    }\n}\n\n/* ── Ordering ────────────────────────────────────────────────── */\n\nexport type OrderTarget =\n    | { kind: 'field'; field: FieldRefNode }\n    | { kind: 'aggregation'; aggregation: AggregationNode };\n\nexport class OrderNode extends PlanNode {\n    readonly kind = 'order';\n    constructor(\n        path: string,\n        readonly target: OrderTarget,\n        readonly direction: SortDirection,\n    ) {\n        super(path);\n    }\n}\n\n/* ── Pagination & limits ─────────────────────────────────────── */\n\nexport class PaginationNode extends PlanNode {\n    readonly kind = 'pagination';\n    constructor(\n        path: string,\n        readonly skip: number | null,\n        readonly cursor: unknown[] | null,\n    ) {\n        super(path);\n    }\n}\n\nexport class LimitNode extends PlanNode {\n    readonly kind = 'limit';\n    constructor(\n        path: string,\n        readonly limit: number,\n    ) {\n        super(path);\n    }\n}\n\n/* ── Root ────────────────────────────────────────────────────── */\n\nexport class QueryPlan extends PlanNode {\n    readonly kind = 'query-plan';\n    constructor(\n        path: string,\n        readonly source: SourceNode,\n        readonly projection: ProjectionNode | null,\n        readonly filter: FilterNode | null,\n        readonly grouping: GroupingNode | null,\n        readonly aggregations: AggregationNode[],\n        readonly having: HavingNode | null,\n        readonly ordering: OrderNode[],\n        readonly pagination: PaginationNode,\n        readonly limits: LimitNode,\n    ) {\n        super(path);\n    }\n}\n","/**\n * SQL compiler family base + dialect contract.\n *\n * `SqlCompiler` owns the orchestration shared by all SQL engines (how a plan\n * becomes SELECT/WHERE/GROUP BY/ORDER BY/LIMIT). Engine differences live in a\n * `SqlDialect`. To add a SQL engine, implement a dialect and construct a\n * `SqlCompiler(new YourDialect())` — the shared flow does not change.\n */\nimport type {\n    QueryCompiler,\n    SqlMutationResult,\n    SqlTranspileResult,\n} from '../compiler';\nimport { buildOutputMetadata } from '../../metadata/output-metadata-builder';\nimport type { MutationPlan } from '../../plan/mutation-plan';\nimport type { AssignmentOp } from '../../plan/mutation-plan';\nimport {\n    AggregationNode,\n    FieldRefNode,\n    FilterConditionNode,\n    FilterNode,\n    GroupFieldNode,\n    GroupingNode,\n    HavingConditionNode,\n    HavingNode,\n    LogicalFilterNode,\n    LogicalHavingNode,\n    NotFilterNode,\n    NotHavingNode,\n    QueryPlan,\n    SourceNode,\n} from '../../plan/query-plan';\n\n/** Collects bound values while building a statement. */\nexport class SqlParamContext {\n    /** Positional values (recommended executable form). */\n    readonly values: unknown[] = [];\n    /** ClickHouse-style named params (name → value). */\n    readonly namedValues: Record<string, unknown> = {};\n    private counter = 0;\n\n    /** Reserve the next parameter slot; returns its 0-based index. */\n    next(): number {\n        return this.counter++;\n    }\n}\n\n/**\n * Engine-specific SQL syntax/behavior. Implemented per engine\n * (`ClickHouseDialect`, `PostgresDialect`, …).\n */\nexport interface SqlDialect {\n    readonly engine: 'postgresql' | 'clickhouse';\n\n    /** Quote an identifier (e.g. PG `\"col\"`, ClickHouse `` `col` ``). */\n    escapeIdentifier(identifier: string): string;\n\n    /**\n     * Render access to a nested value inside a JSON/object column, using the\n     * node's `field` (base column) and `nestedPath` (keys). Engines diverge:\n     * PostgreSQL uses `->`/`->>` with a type cast; ClickHouse uses\n     * `JSONExtract<Type>`. Only called when `nestedPath` is non-empty.\n     */\n    renderFieldPath(field: FieldRefNode): string;\n\n    /**\n     * Bind a value and return the placeholder to inline in SQL. Positional\n     * dialects (PostgreSQL) push to `ctx.values` and return `$n`; named\n     * dialects (ClickHouse) add to `ctx.namedValues` and return `{pN:Type}`\n     * (the ClickHouse type must be inferred from the value here).\n     */\n    bindValue(value: unknown, ctx: SqlParamContext): string;\n\n    /** Serialize a value for the debug `plainQuery` (never used for execution). */\n    renderLiteral(value: unknown): string;\n\n    /** Date-group expression for a group field (e.g. `toStartOfMonth(\"d\")`). */\n    renderDateGroup(field: FieldRefNode, group: GroupFieldNode): string;\n\n    /**\n     * Assemble an INSERT from a pre-built `VALUES` fragment. When `conflict` is\n     * set the insert is an upsert: PostgreSQL renders `ON CONFLICT (keys) DO\n     * UPDATE`; ClickHouse ignores it (dedup happens at the table engine level).\n     * `columns` are raw names — the dialect escapes them.\n     */\n    renderInsert(\n        table: string,\n        columns: string[],\n        valuesSql: string,\n        conflict: { keyColumns: string[] } | null,\n    ): string;\n\n    /**\n     * Assemble a single UPDATE assignment (`col = …`). `value` is the emitted\n     * placeholder for set/increment/append, or `null` for `removeField`.\n     * Engines diverge on append (`array_append` vs `arrayPushBack`).\n     */\n    renderAssignment(\n        column: string,\n        op: AssignmentOp,\n        value: string | null,\n    ): string;\n\n    /**\n     * Assemble a DELETE statement from a pre-built WHERE (`null` = unfiltered).\n     * PostgreSQL: `DELETE FROM t WHERE …`; ClickHouse: `ALTER TABLE t DELETE WHERE …`.\n     */\n    renderDelete(table: string, where: string | null): string;\n\n    /**\n     * Assemble an UPDATE statement from pre-built SET assignments and WHERE.\n     * PostgreSQL: `UPDATE t SET … WHERE …`; ClickHouse: `ALTER TABLE t UPDATE … WHERE …`.\n     */\n    renderUpdate(\n        table: string,\n        assignments: string,\n        where: string | null,\n    ): string;\n}\n\n/** Emits a value into SQL: either a bound placeholder or a debug literal. */\ntype ValueEmitter = (value: unknown) => string;\n\n/**\n * Shared SQL orchestration. The flow below is engine-agnostic; every\n * engine-specific fragment is delegated to `this.dialect`. A dialect\n * implementation plugs in via `new SqlCompiler(dialect)`.\n *\n * NOTE: per-group `limit` (top-N per group level) is not yet handled here — it\n * needs window/ranking (`ROW_NUMBER` CTEs) or ClickHouse `LIMIT n BY`. See the\n * `TODO(group-limits)` below.\n */\nexport abstract class SqlCompiler implements QueryCompiler<SqlTranspileResult> {\n    constructor(protected readonly dialect: SqlDialect) {}\n\n    compile(plan: QueryPlan): SqlTranspileResult {\n        const ctx = new SqlParamContext();\n        const bind: ValueEmitter = (value) =>\n            this.dialect.bindValue(value, ctx);\n        const literal: ValueEmitter = (value) =>\n            this.dialect.renderLiteral(value);\n\n        // Build the executable form first (populates ctx), then the debug form.\n        const query = this.render(plan, bind);\n        const plainQuery = this.render(plan, literal);\n\n        return {\n            engine: this.dialect.engine,\n            kind: 'sql',\n            query,\n            plainQuery,\n            values: ctx.values,\n            namedValues: ctx.namedValues,\n            metadata: buildOutputMetadata(plan, 'offset'),\n        };\n    }\n\n    compileMutation(plan: MutationPlan): SqlMutationResult {\n        const render = (emit: ValueEmitter): string => {\n            const table = this.qualifiedTable(plan.source);\n            if (plan.operation === 'insert') {\n                // Build the VALUES tuples; the dialect assembles the statement\n                // (and any ON CONFLICT upsert clause).\n                const valuesSql = plan.rows\n                    .map(\n                        (row) =>\n                            `(${row.map((value) => emit(value)).join(', ')})`,\n                    )\n                    .join(', ');\n                return this.dialect.renderInsert(\n                    table,\n                    plan.columns,\n                    valuesSql,\n                    plan.conflictKeys\n                        ? { keyColumns: plan.conflictKeys }\n                        : null,\n                );\n            }\n            if (plan.operation === 'delete') {\n                const where = plan.filter\n                    ? this.renderFilter(plan.filter, emit)\n                    : null;\n                return this.dialect.renderDelete(table, where);\n            }\n            // update: bind SET assignments first, then WHERE.\n            const assignments = plan.assignments\n                .map((a) => {\n                    const col = this.dialect.escapeIdentifier(a.field.field);\n                    const value = a.op === 'removeField' ? null : emit(a.value);\n                    return this.dialect.renderAssignment(col, a.op, value);\n                })\n                .join(', ');\n            const where = plan.filter\n                ? this.renderFilter(plan.filter, emit)\n                : null;\n            return this.dialect.renderUpdate(table, assignments, where);\n        };\n\n        const ctx = new SqlParamContext();\n        const query = render((value) => this.dialect.bindValue(value, ctx));\n        const plainQuery = render((value) => this.dialect.renderLiteral(value));\n\n        return {\n            engine: this.dialect.engine,\n            kind: 'sql',\n            operation: plan.operation,\n            query,\n            plainQuery,\n            values: ctx.values,\n            namedValues: ctx.namedValues,\n        };\n    }\n\n    /** Qualify the table with its schema when present: `\"schema\".\"name\"`. */\n    private qualifiedTable(source: SourceNode): string {\n        const name = this.dialect.escapeIdentifier(source.name);\n        return source.schema\n            ? `${this.dialect.escapeIdentifier(source.schema)}.${name}`\n            : name;\n    }\n\n    /** Render a field reference: a plain identifier or a nested JSON path. */\n    private col(node: FieldRefNode): string {\n        return node.nestedPath && node.nestedPath.length > 0\n            ? this.dialect.renderFieldPath(node)\n            : this.dialect.escapeIdentifier(node.field);\n    }\n\n    private render(plan: QueryPlan, emit: ValueEmitter): string {\n        const parts: string[] = [\n            `SELECT ${this.renderSelect(plan)}`,\n            `FROM ${this.qualifiedTable(plan.source)}`,\n        ];\n        if (plan.filter) {\n            parts.push(`WHERE ${this.renderFilter(plan.filter, emit)}`);\n        }\n        if (plan.grouping) {\n            // TODO(group-limits): honor per-level GroupFieldNode.limit\n            // via ROW_NUMBER CTEs (default) or a dialect override (ClickHouse LIMIT BY).\n            parts.push(`GROUP BY ${this.renderGroupBy(plan.grouping)}`);\n        }\n        if (plan.having) {\n            parts.push(`HAVING ${this.renderHaving(plan.having, emit)}`);\n        }\n        if (plan.ordering.length > 0) {\n            parts.push(`ORDER BY ${this.renderOrderBy(plan)}`);\n        }\n        parts.push(`LIMIT ${plan.limits.limit}`);\n        if (plan.pagination.skip !== null) {\n            parts.push(`OFFSET ${plan.pagination.skip}`);\n        }\n        return parts.join(' ');\n    }\n\n    private renderSelect(plan: QueryPlan): string {\n        if (plan.grouping || plan.aggregations.length > 0) {\n            const columns: string[] = [];\n            for (const group of plan.grouping?.groups ?? []) {\n                columns.push(\n                    `${this.groupExpr(\n                        group,\n                    )} AS ${this.dialect.escapeIdentifier(group.outputName)}`,\n                );\n            }\n            for (const agg of plan.aggregations) {\n                columns.push(\n                    `${this.aggExpr(agg)} AS ${this.dialect.escapeIdentifier(\n                        agg.outputName,\n                    )}`,\n                );\n            }\n            return columns.join(', ');\n        }\n        if (plan.projection) {\n            return plan.projection.fields\n                .map((f) => {\n                    const expr = this.col(f);\n                    // Nested paths render to an expression with no natural\n                    // column name; alias it with the dotted name so results are\n                    // stable and match the output metadata.\n                    return f.nestedPath && f.nestedPath.length > 0\n                        ? `${expr} AS ${this.dialect.escapeIdentifier(\n                              f.qualifiedName(),\n                          )}`\n                        : expr;\n                })\n                .join(', ');\n        }\n        return '*';\n    }\n\n    private renderGroupBy(grouping: GroupingNode): string {\n        return grouping.groups.map((g) => this.groupExpr(g)).join(', ');\n    }\n\n    private groupExpr(group: GroupFieldNode): string {\n        return group.granularity\n            ? this.dialect.renderDateGroup(group.field, group)\n            : this.col(group.field);\n    }\n\n    private aggExpr(agg: AggregationNode): string {\n        if (agg.fn === 'count') {\n            return agg.field ? `COUNT(${this.col(agg.field)})` : 'COUNT(*)';\n        }\n        const field = agg.field ? this.col(agg.field) : '';\n        return `${agg.fn.toUpperCase()}(${field})`;\n    }\n\n    private renderFilter(node: FilterNode, emit: ValueEmitter): string {\n        if (node instanceof FilterConditionNode) {\n            return this.renderCondition(node, emit);\n        }\n        if (node instanceof LogicalFilterNode) {\n            const op = node.operator === 'and' ? ' AND ' : ' OR ';\n            return `(${node.children\n                .map((c) => this.renderFilter(c, emit))\n                .join(op)})`;\n        }\n        if (node instanceof NotFilterNode) {\n            return `NOT (${this.renderFilter(node.child, emit)})`;\n        }\n        return '';\n    }\n\n    /**\n     * Escape the LIKE wildcards `%` and `_` (and the escape char) so user input\n     * in contains/startsWith/endsWith/notContains is matched literally.\n     * PostgreSQL, ClickHouse and MySQL all use backslash as the LIKE escape\n     * character; a dialect that differs (e.g. SQL Server) should override this.\n     */\n    protected escapeLikePattern(value: string): string {\n        return value\n            .split('\\\\')\n            .join('\\\\\\\\')\n            .split('%')\n            .join('\\\\%')\n            .split('_')\n            .join('\\\\_');\n    }\n\n    private renderCondition(\n        node: FilterConditionNode,\n        emit: ValueEmitter,\n    ): string {\n        const col = this.col(node.field);\n        switch (node.operator) {\n            case 'eq':\n                return `${col} = ${emit(node.value)}`;\n            case 'neq':\n                return `${col} != ${emit(node.value)}`;\n            case 'gt':\n                return `${col} > ${emit(node.value)}`;\n            case 'gte':\n                return `${col} >= ${emit(node.value)}`;\n            case 'lt':\n                return `${col} < ${emit(node.value)}`;\n            case 'lte':\n                return `${col} <= ${emit(node.value)}`;\n            case 'in':\n                return `${col} IN (${asArray(node.value)\n                    .map((v) => emit(v))\n                    .join(', ')})`;\n            case 'notIn':\n                return `${col} NOT IN (${asArray(node.value)\n                    .map((v) => emit(v))\n                    .join(', ')})`;\n            case 'contains':\n                return `${col} LIKE ${emit(\n                    `%${this.escapeLikePattern(String(node.value))}%`,\n                )}`;\n            case 'notContains':\n                return `${col} NOT LIKE ${emit(\n                    `%${this.escapeLikePattern(String(node.value))}%`,\n                )}`;\n            case 'startsWith':\n                return `${col} LIKE ${emit(\n                    `${this.escapeLikePattern(String(node.value))}%`,\n                )}`;\n            case 'endsWith':\n                return `${col} LIKE ${emit(\n                    `%${this.escapeLikePattern(String(node.value))}`,\n                )}`;\n            case 'between': {\n                const [low, high] = asArray(node.value);\n                return `${col} BETWEEN ${emit(low)} AND ${emit(high)}`;\n            }\n            case 'exists':\n            case 'isNotNull':\n                return `${col} IS NOT NULL`;\n            case 'isNull':\n                return `${col} IS NULL`;\n            default:\n                return '';\n        }\n    }\n\n    private renderHaving(node: HavingNode, emit: ValueEmitter): string {\n        if (node instanceof HavingConditionNode) {\n            const expr = this.aggExpr(node.aggregation);\n            return this.renderComparison(expr, node.operator, node.value, emit);\n        }\n        if (node instanceof LogicalHavingNode) {\n            const op = node.operator === 'and' ? ' AND ' : ' OR ';\n            return `(${node.children\n                .map((c) => this.renderHaving(c, emit))\n                .join(op)})`;\n        }\n        if (node instanceof NotHavingNode) {\n            return `NOT (${this.renderHaving(node.child, emit)})`;\n        }\n        return '';\n    }\n\n    private renderComparison(\n        expr: string,\n        operator: string,\n        value: unknown,\n        emit: ValueEmitter,\n    ): string {\n        const ops: Record<string, string> = {\n            eq: '=',\n            neq: '!=',\n            gt: '>',\n            gte: '>=',\n            lt: '<',\n            lte: '<=',\n        };\n        const sql = ops[operator];\n        return sql ? `${expr} ${sql} ${emit(value)}` : expr;\n    }\n\n    private renderOrderBy(plan: QueryPlan): string {\n        const groups = plan.grouping?.groups ?? [];\n        return plan.ordering\n            .map((order) => {\n                const dir = order.direction === 'desc' ? 'DESC' : 'ASC';\n                if (order.target.kind === 'aggregation') {\n                    const target = this.dialect.escapeIdentifier(\n                        order.target.aggregation.outputName,\n                    );\n                    return `${target} ${dir}`;\n                }\n                // When grouped, an order field must render as the GROUP BY\n                // expression (e.g. toStartOfMonth(\"created\")), not the raw\n                // column — otherwise the column is not in GROUP BY (invalid SQL).\n                const field = order.target.field;\n                const group = groups.find((g) => g.field.field === field.field);\n                const target = group ? this.groupExpr(group) : this.col(field);\n                return `${target} ${dir}`;\n            })\n            .join(', ');\n    }\n}\n\nfunction asArray(value: unknown): unknown[] {\n    return Array.isArray(value) ? value : [value];\n}\n","/**\n * ClickHouse SQL dialect + compiler.\n *\n * ClickHouse specifics:\n *   - identifiers quoted with backticks: `col`\n *   - named parameters `{pN:Type}` (ClickHouse does not use positional `?`);\n *     the type is inferred from the JS value (String/Int64/Float64/Bool/…) and\n *     the value stored in `ctx.namedValues`.\n *   - date grouping via `toStartOfHour/Day/Week/Month/Quarter/Year`.\n *   - mutations use `ALTER TABLE … UPDATE/DELETE`; upserts rely on the table\n *     engine (e.g. ReplacingMergeTree) rather than an `ON CONFLICT` clause.\n */\nimport { SqlCompiler, SqlParamContext, type SqlDialect } from './sql-compiler';\nimport type { DateGranularity, FieldType } from '../../input/input-types';\nimport type { FieldRefNode, GroupFieldNode } from '../../plan/query-plan';\nimport type { AssignmentOp } from '../../plan/mutation-plan';\n\n/** ClickHouse `toStartOf*` function per date granularity. */\nconst CLICKHOUSE_DATE_FN: Record<DateGranularity, string> = {\n    hour: 'toStartOfHour',\n    day: 'toStartOfDay',\n    week: 'toStartOfWeek',\n    month: 'toStartOfMonth',\n    quarter: 'toStartOfQuarter',\n    year: 'toStartOfYear',\n};\n\n/** Infer the ClickHouse parameter type from a JS value. */\nfunction clickHouseType(value: unknown): string {\n    if (typeof value === 'number') {\n        return Number.isInteger(value) ? 'Int64' : 'Float64';\n    }\n    if (typeof value === 'boolean') {\n        return 'Bool';\n    }\n    if (value instanceof Date) {\n        return 'DateTime';\n    }\n    return 'String';\n}\n\n/** `JSONExtract*` function used to read a nested value, per field type. */\nconst CLICKHOUSE_JSON_EXTRACT: Record<FieldType, string> = {\n    string: 'JSONExtractString',\n    number: 'JSONExtractFloat',\n    boolean: 'JSONExtractBool',\n    date: 'JSONExtractString',\n};\n\nexport class ClickHouseDialect implements SqlDialect {\n    readonly engine = 'clickhouse' as const;\n\n    escapeIdentifier(identifier: string): string {\n        // Quote the whole identifier with backticks, escaping embedded backticks.\n        return `\\`${identifier.split('`').join('``')}\\``;\n    }\n\n    renderFieldPath(field: FieldRefNode): string {\n        // JSONExtract<Type>(`col`, 'key1', 'key2', …) — keys are string literals.\n        const fn = CLICKHOUSE_JSON_EXTRACT[field.type];\n        const keys = (field.nestedPath ?? [])\n            .map((k) => `'${k.split(\"'\").join(\"''\")}'`)\n            .join(', ');\n        return `${fn}(${this.escapeIdentifier(field.field)}, ${keys})`;\n    }\n\n    bindValue(value: unknown, ctx: SqlParamContext): string {\n        // ClickHouse uses named params `{name:Type}` passed via `query_params`.\n        const name = `p${ctx.next()}`;\n        ctx.namedValues[name] = value;\n        ctx.values.push(value); // keep positional list in sync for consumers\n        return `{${name}:${clickHouseType(value)}}`;\n    }\n\n    renderLiteral(value: unknown): string {\n        if (value === null || value === undefined) {\n            return 'NULL';\n        }\n        if (typeof value === 'number' || typeof value === 'boolean') {\n            return String(value);\n        }\n        return `'${String(value).split(\"'\").join(\"''\")}'`;\n    }\n\n    renderDateGroup(field: FieldRefNode, group: GroupFieldNode): string {\n        const fn = CLICKHOUSE_DATE_FN[group.granularity ?? 'day'];\n        return `${fn}(${this.escapeIdentifier(field.field)})`;\n    }\n\n    renderInsert(\n        table: string,\n        columns: string[],\n        valuesSql: string,\n        _conflict: { keyColumns: string[] } | null,\n    ): string {\n        // ClickHouse has no ON CONFLICT; upsert semantics rely on the table\n        // engine (e.g. ReplacingMergeTree) deduplicating at merge time, so the\n        // conflict keys are intentionally ignored here.\n        const cols = columns.map((c) => this.escapeIdentifier(c)).join(', ');\n        return `INSERT INTO ${table} (${cols}) VALUES ${valuesSql}`;\n    }\n\n    renderDelete(table: string, where: string | null): string {\n        // ClickHouse mutations use ALTER TABLE ... DELETE WHERE (WHERE required).\n        return `ALTER TABLE ${table} DELETE WHERE ${where ?? '1 = 1'}`;\n    }\n\n    renderAssignment(\n        column: string,\n        op: AssignmentOp,\n        value: string | null,\n    ): string {\n        switch (op) {\n            case 'increment':\n                return `${column} = ${column} + ${value}`;\n            case 'append':\n                return `${column} = arrayPushBack(${column}, ${value})`;\n            case 'removeField':\n                return `${column} = NULL`;\n            case 'set':\n            default:\n                return `${column} = ${value}`;\n        }\n    }\n\n    renderUpdate(\n        table: string,\n        assignments: string,\n        where: string | null,\n    ): string {\n        return `ALTER TABLE ${table} UPDATE ${assignments} WHERE ${\n            where ?? '1 = 1'\n        }`;\n    }\n}\n\nexport class ClickHouseCompiler extends SqlCompiler {\n    constructor() {\n        super(new ClickHouseDialect());\n    }\n}\n","/**\n * PostgreSQL SQL dialect + compiler.\n *\n * PostgreSQL specifics:\n *   - identifiers quoted with double quotes: \"col\"\n *   - positional parameters `$1, $2, …` (pushed to `ctx.values`).\n *   - date grouping via `date_trunc('<granularity>', field)`.\n *   - upserts via `INSERT … ON CONFLICT (keys) DO UPDATE/NOTHING`.\n */\nimport { SqlCompiler, SqlParamContext, type SqlDialect } from './sql-compiler';\nimport type { FieldRefNode, GroupFieldNode } from '../../plan/query-plan';\nimport type { AssignmentOp } from '../../plan/mutation-plan';\nimport type { FieldType } from '../../input/input-types';\n\n/** Cast applied to a text value extracted from JSON (`->>`), per field type. */\nconst POSTGRES_JSON_CAST: Partial<Record<FieldType, string>> = {\n    number: 'numeric',\n    boolean: 'boolean',\n    date: 'timestamptz',\n    // string: no cast — `->>` already returns text.\n};\n\nexport class PostgresDialect implements SqlDialect {\n    readonly engine = 'postgresql' as const;\n\n    escapeIdentifier(identifier: string): string {\n        // Quote the whole identifier with double quotes, escaping embedded ones.\n        return `\"${identifier.split('\"').join('\"\"')}\"`;\n    }\n\n    renderFieldPath(field: FieldRefNode): string {\n        // Chain `->` for intermediate keys and `->>` (text) for the last one,\n        // then cast to the field's type. Keys are single-quoted string literals.\n        const segments = field.nestedPath ?? [];\n        const key = (k: string): string => `'${k.split(\"'\").join(\"''\")}'`;\n        let expr = this.escapeIdentifier(field.field);\n        segments.forEach((segment, i) => {\n            expr += `${i === segments.length - 1 ? ' ->> ' : ' -> '}${key(\n                segment,\n            )}`;\n        });\n        expr = `(${expr})`;\n        const cast = POSTGRES_JSON_CAST[field.type];\n        return cast ? `${expr}::${cast}` : expr;\n    }\n\n    bindValue(value: unknown, ctx: SqlParamContext): string {\n        ctx.values.push(value);\n        return `$${ctx.values.length}`;\n    }\n\n    renderLiteral(value: unknown): string {\n        if (value === null || value === undefined) {\n            return 'NULL';\n        }\n        if (typeof value === 'number' || typeof value === 'boolean') {\n            return String(value);\n        }\n        return `'${String(value).split(\"'\").join(\"''\")}'`;\n    }\n\n    renderDateGroup(field: FieldRefNode, group: GroupFieldNode): string {\n        // TODO: apply the group's timezone `offset` when set.\n        return `date_trunc('${\n            group.granularity ?? 'day'\n        }', ${this.escapeIdentifier(field.field)})`;\n    }\n\n    renderInsert(\n        table: string,\n        columns: string[],\n        valuesSql: string,\n        conflict: { keyColumns: string[] } | null,\n    ): string {\n        const cols = columns.map((c) => this.escapeIdentifier(c)).join(', ');\n        let sql = `INSERT INTO ${table} (${cols}) VALUES ${valuesSql}`;\n        if (conflict) {\n            const keys = conflict.keyColumns\n                .map((c) => this.escapeIdentifier(c))\n                .join(', ');\n            const updates = columns\n                .filter((c) => !conflict.keyColumns.includes(c))\n                .map(\n                    (c) =>\n                        `${this.escapeIdentifier(\n                            c,\n                        )} = EXCLUDED.${this.escapeIdentifier(c)}`,\n                )\n                .join(', ');\n            sql += updates\n                ? ` ON CONFLICT (${keys}) DO UPDATE SET ${updates}`\n                : ` ON CONFLICT (${keys}) DO NOTHING`;\n        }\n        return sql;\n    }\n\n    renderDelete(table: string, where: string | null): string {\n        return `DELETE FROM ${table}${where ? ` WHERE ${where}` : ''}`;\n    }\n\n    renderAssignment(\n        column: string,\n        op: AssignmentOp,\n        value: string | null,\n    ): string {\n        switch (op) {\n            case 'increment':\n                return `${column} = ${column} + ${value}`;\n            case 'append':\n                return `${column} = array_append(${column}, ${value})`;\n            case 'removeField':\n                return `${column} = NULL`;\n            case 'set':\n            default:\n                return `${column} = ${value}`;\n        }\n    }\n\n    renderUpdate(\n        table: string,\n        assignments: string,\n        where: string | null,\n    ): string {\n        return `UPDATE ${table} SET ${assignments}${\n            where ? ` WHERE ${where}` : ''\n        }`;\n    }\n}\n\nexport class PostgresCompiler extends SqlCompiler {\n    constructor() {\n        super(new PostgresDialect());\n    }\n}\n","/**\n * Search DSL compiler family base + dialect contract.\n *\n * `SearchDslCompiler` owns the orchestration shared by Elasticsearch and\n * OpenSearch (how a plan becomes `_source`/`query`/`aggs`/`sort`/pagination).\n * Engine differences live in a `SearchDslDialect`; OpenSearch's dialect extends\n * Elasticsearch's and overrides only the fragments that differ.\n */\nimport type {\n    QueryCompiler,\n    SearchDslMutationResult,\n    SearchDslTranspileResult,\n} from '../compiler';\nimport { buildOutputMetadata } from '../../metadata/output-metadata-builder';\nimport type { MutationPlan } from '../../plan/mutation-plan';\nimport {\n    AggregationNode,\n    FieldRefNode,\n    FilterConditionNode,\n    FilterNode,\n    GroupFieldNode,\n    LogicalFilterNode,\n    NotFilterNode,\n    OrderNode,\n    QueryPlan,\n} from '../../plan/query-plan';\n\n/** Engine-specific search DSL fragments. */\nexport interface SearchDslDialect {\n    readonly engine: 'elasticsearch' | 'opensearch';\n\n    renderTerm(field: FieldRefNode, value: unknown): Record<string, unknown>;\n\n    renderRange(\n        field: FieldRefNode,\n        bounds: Partial<Record<'gt' | 'gte' | 'lt' | 'lte', unknown>>,\n    ): Record<string, unknown>;\n\n    renderWildcard(\n        field: FieldRefNode,\n        pattern: string,\n    ): Record<string, unknown>;\n\n    renderTermsAggregation(group: GroupFieldNode): Record<string, unknown>;\n\n    renderDateHistogram(group: GroupFieldNode): Record<string, unknown>;\n\n    renderSearchAfter(cursor: unknown[]): Record<string, unknown>;\n}\n\n/**\n * Shared search-DSL orchestration. The flow below is engine-agnostic; every\n * engine-specific fragment is delegated to `this.dialect`.\n *\n * NOTE: bucket ordering (`terms.order` from aggregation ordering) and per-level\n * bucket `size` (`GroupFieldNode.limit`) are left as TODOs in `buildAggs` — they\n * are refinements on top of the shared aggregation nesting.\n */\nexport abstract class SearchDslCompiler\n    implements QueryCompiler<SearchDslTranspileResult>\n{\n    constructor(protected readonly dialect: SearchDslDialect) {}\n\n    compile(plan: QueryPlan): SearchDslTranspileResult {\n        const body: Record<string, unknown> = {};\n        const grouped = plan.grouping !== null || plan.aggregations.length > 0;\n\n        if (plan.projection) {\n            body._source = plan.projection.fields.map((f) => esFieldName(f));\n        }\n        if (plan.filter) {\n            body.query = this.buildQuery(plan.filter);\n        }\n\n        if (grouped) {\n            body.aggs = this.buildAggs(plan);\n            body.size = 0; // aggregation-only response\n        } else {\n            if (plan.ordering.length > 0) {\n                body.sort = this.buildSort(plan.ordering);\n            }\n            body.size = plan.limits.limit;\n            if (plan.pagination.cursor !== null) {\n                Object.assign(\n                    body,\n                    this.dialect.renderSearchAfter(plan.pagination.cursor),\n                );\n            } else if (plan.pagination.skip !== null) {\n                body.from = plan.pagination.skip;\n            }\n        }\n\n        const paginationMode =\n            plan.pagination.cursor !== null ? 'search_after' : 'offset';\n\n        return {\n            engine: this.dialect.engine,\n            kind: 'search-dsl',\n            index: plan.source.name,\n            body,\n            metadata: buildOutputMetadata(plan, paginationMode),\n        };\n    }\n\n    compileMutation(plan: MutationPlan): SearchDslMutationResult {\n        // insert → bulk index: reconstruct the documents from columns/rows so\n        // the executor can build the bulk NDJSON for `plan.source.name`.\n        if (plan.operation === 'insert') {\n            const documents = plan.rows.map((row) => {\n                const doc: Record<string, unknown> = {};\n                plan.columns.forEach((col, i) => {\n                    doc[col] = row[i];\n                });\n                return doc;\n            });\n            return {\n                engine: this.dialect.engine,\n                kind: 'search-dsl',\n                operation: 'insert',\n                index: plan.source.name,\n                body: {},\n                documents,\n                ...(plan.conflictKeys ? { onConflict: plan.conflictKeys } : {}),\n            };\n        }\n\n        // delete_by_query / update_by_query share the same body shape; the\n        // `operation` tells the executor which endpoint to call.\n        const body: Record<string, unknown> = {\n            query: plan.filter\n                ? this.buildQuery(plan.filter)\n                : { match_all: {} },\n        };\n\n        if (plan.operation === 'update') {\n            const params: Record<string, unknown> = {};\n            const lines: string[] = [];\n            plan.assignments.forEach((assignment, i) => {\n                // Bracket access supports dotted field paths safely.\n                const target = `ctx._source['${assignment.field.field}']`;\n                if (assignment.op === 'removeField') {\n                    lines.push(\n                        `ctx._source.remove('${assignment.field.field}')`,\n                    );\n                    return;\n                }\n                const param = `p${i}`;\n                params[param] = assignment.value;\n                if (assignment.op === 'increment') {\n                    lines.push(\n                        `${target} = (${target} ?: 0) + params.${param}`,\n                    );\n                } else if (assignment.op === 'append') {\n                    lines.push(\n                        `if (${target} == null) { ${target} = [] } ${target}.add(params.${param})`,\n                    );\n                } else {\n                    lines.push(`${target} = params.${param}`);\n                }\n            });\n            body.script = {\n                lang: 'painless',\n                source: lines.join('; '),\n                params,\n            };\n        }\n\n        return {\n            engine: this.dialect.engine,\n            kind: 'search-dsl',\n            operation: plan.operation,\n            index: plan.source.name,\n            body,\n        };\n    }\n\n    private buildQuery(node: FilterNode): Record<string, unknown> {\n        if (node instanceof FilterConditionNode) {\n            return this.renderCondition(node);\n        }\n        if (node instanceof LogicalFilterNode) {\n            const clauses = node.children.map((c) => this.buildQuery(c));\n            return node.operator === 'and'\n                ? { bool: { must: clauses } }\n                : { bool: { should: clauses, minimum_should_match: 1 } };\n        }\n        if (node instanceof NotFilterNode) {\n            return { bool: { must_not: [this.buildQuery(node.child)] } };\n        }\n        return {};\n    }\n\n    private renderCondition(\n        node: FilterConditionNode,\n    ): Record<string, unknown> {\n        const { field } = node;\n        switch (node.operator) {\n            case 'eq':\n                return this.dialect.renderTerm(field, node.value);\n            case 'neq':\n                return {\n                    bool: {\n                        must_not: [this.dialect.renderTerm(field, node.value)],\n                    },\n                };\n            case 'gt':\n            case 'gte':\n            case 'lt':\n            case 'lte':\n                return this.dialect.renderRange(field, {\n                    [node.operator]: node.value,\n                });\n            case 'in':\n                return { terms: { [esFieldName(field)]: asArray(node.value) } };\n            case 'notIn':\n                return {\n                    bool: {\n                        must_not: [\n                            {\n                                terms: {\n                                    [esFieldName(field)]: asArray(node.value),\n                                },\n                            },\n                        ],\n                    },\n                };\n            case 'contains':\n                return this.dialect.renderWildcard(\n                    field,\n                    `*${escapeWildcard(String(node.value))}*`,\n                );\n            case 'notContains':\n                return {\n                    bool: {\n                        must_not: [\n                            this.dialect.renderWildcard(\n                                field,\n                                `*${escapeWildcard(String(node.value))}*`,\n                            ),\n                        ],\n                    },\n                };\n            case 'startsWith':\n                return this.dialect.renderWildcard(\n                    field,\n                    `${escapeWildcard(String(node.value))}*`,\n                );\n            case 'endsWith':\n                return this.dialect.renderWildcard(\n                    field,\n                    `*${escapeWildcard(String(node.value))}`,\n                );\n            case 'between': {\n                const [low, high] = asArray(node.value);\n                return this.dialect.renderRange(field, {\n                    gte: low,\n                    lte: high,\n                });\n            }\n            case 'exists':\n            case 'isNotNull':\n                return { exists: { field: esFieldName(field) } };\n            case 'isNull':\n                return {\n                    bool: {\n                        must_not: [{ exists: { field: esFieldName(field) } }],\n                    },\n                };\n            default:\n                return {};\n        }\n    }\n\n    private buildAggs(plan: QueryPlan): Record<string, unknown> {\n        const metrics: Record<string, unknown> = {};\n        for (const agg of plan.aggregations) {\n            metrics[agg.outputName] = this.metricAgg(agg);\n        }\n\n        const groups = plan.grouping?.groups ?? [];\n        if (groups.length === 0) {\n            return metrics;\n        }\n\n        // Nest from innermost group outward; innermost carries the metrics.\n        let inner = metrics;\n        for (let i = groups.length - 1; i >= 0; i -= 1) {\n            const group = groups[i];\n            const shell = group.granularity\n                ? this.dialect.renderDateHistogram(group)\n                : this.dialect.renderTermsAggregation(group);\n            // TODO(bucket-order): merge bucket `order` (from aggregation ordering)\n            // and per-level `size` (group.limit) into the terms/date_histogram shell.\n            const node: Record<string, unknown> = { ...shell };\n            if (Object.keys(inner).length > 0) {\n                node.aggs = inner;\n            }\n            inner = { [group.outputName]: node };\n        }\n        return inner;\n    }\n\n    private metricAgg(agg: AggregationNode): Record<string, unknown> {\n        if (agg.fn === 'count') {\n            return {\n                value_count: {\n                    field: agg.field ? esFieldName(agg.field) : '_index',\n                },\n            };\n        }\n        return { [agg.fn]: { field: agg.field ? esFieldName(agg.field) : '' } };\n    }\n\n    private buildSort(ordering: OrderNode[]): unknown[] {\n        const sort: unknown[] = [];\n        for (const order of ordering) {\n            if (order.target.kind === 'field') {\n                sort.push({\n                    [esFieldName(order.target.field)]: {\n                        order: order.direction,\n                    },\n                });\n            }\n            // Aggregation ordering applies to buckets (see buildAggs TODO),\n            // not to top-level sort in a row query.\n        }\n        return sort;\n    }\n}\n\nfunction asArray(value: unknown): unknown[] {\n    return Array.isArray(value) ? value : [value];\n}\n\n/**\n * Resolve the Elasticsearch/OpenSearch field name for a reference. A nested\n * path is expressed as a dotted name (`profile.address.city`), which is how\n * ES/OS address object sub-fields natively.\n */\nexport function esFieldName(node: FieldRefNode): string {\n    return node.qualifiedName();\n}\n\n/**\n * Escape the wildcard metacharacters `*` and `?` (and the escape char `\\`) so\n * user input in contains/startsWith/endsWith/notContains is matched literally\n * inside a `wildcard` query.\n */\nexport function escapeWildcard(value: string): string {\n    return value\n        .split('\\\\')\n        .join('\\\\\\\\')\n        .split('*')\n        .join('\\\\*')\n        .split('?')\n        .join('\\\\?');\n}\n","/**\n * Elasticsearch search DSL dialect + compiler.\n *\n * The reference dialect for the search family — OpenSearch extends it. The\n * shared flow lives in `SearchDslCompiler`; this dialect provides the\n * Elasticsearch query fragments:\n *   - term:           { term: { <field>: <value> } }\n *   - range:          { range: { <field>: { gte: <value> } } }\n *   - wildcard:       { wildcard: { <field>: '*value*' } }\n *   - terms agg:      { terms: { field, size } }\n *   - date histogram: { date_histogram: { field, calendar_interval, offset } }\n *   - search_after:   { search_after: cursor }\n */\nimport {\n    SearchDslCompiler,\n    esFieldName,\n    type SearchDslDialect,\n} from './search-dsl-compiler';\nimport type { FieldRefNode, GroupFieldNode } from '../../plan/query-plan';\n\nexport class ElasticsearchDialect implements SearchDslDialect {\n    readonly engine: 'elasticsearch' | 'opensearch' = 'elasticsearch';\n\n    renderTerm(field: FieldRefNode, value: unknown): Record<string, unknown> {\n        return { term: { [esFieldName(field)]: value } };\n    }\n\n    renderRange(\n        field: FieldRefNode,\n        bounds: Partial<Record<'gt' | 'gte' | 'lt' | 'lte', unknown>>,\n    ): Record<string, unknown> {\n        return { range: { [esFieldName(field)]: bounds } };\n    }\n\n    renderWildcard(\n        field: FieldRefNode,\n        pattern: string,\n    ): Record<string, unknown> {\n        return { wildcard: { [esFieldName(field)]: pattern } };\n    }\n\n    renderTermsAggregation(group: GroupFieldNode): Record<string, unknown> {\n        const terms: Record<string, unknown> = {\n            field: esFieldName(group.field),\n        };\n        if (group.limit != null) {\n            terms.size = group.limit;\n        }\n        return { terms };\n    }\n\n    renderDateHistogram(group: GroupFieldNode): Record<string, unknown> {\n        const dateHistogram: Record<string, unknown> = {\n            field: esFieldName(group.field),\n            calendar_interval: group.granularity,\n        };\n        if (group.offset) {\n            dateHistogram.offset = group.offset;\n        }\n        return { date_histogram: dateHistogram };\n    }\n\n    renderSearchAfter(cursor: unknown[]): Record<string, unknown> {\n        return { search_after: cursor };\n    }\n}\n\nexport class ElasticsearchCompiler extends SearchDslCompiler {\n    constructor() {\n        super(new ElasticsearchDialect());\n    }\n}\n","/**\n * OpenSearch search DSL dialect + compiler.\n *\n * OpenSearch shares almost all of Elasticsearch's DSL, so `OpenSearchDialect`\n * extends `ElasticsearchDialect` and overrides only the fragments that differ\n * (e.g. version-specific query clauses), rather than forking the compiler.\n */\nimport { ElasticsearchDialect } from './elasticsearch';\nimport { SearchDslCompiler } from './search-dsl-compiler';\n\nexport class OpenSearchDialect extends ElasticsearchDialect {\n    override readonly engine = 'opensearch' as const;\n\n    // Override individual fragments here if OpenSearch diverges from\n    // Elasticsearch; inherited methods cover the shared behavior.\n}\n\nexport class OpenSearchCompiler extends SearchDslCompiler {\n    constructor() {\n        super(new OpenSearchDialect());\n    }\n}\n","/**\n * Registers the built-in engine compilers. This is the single place engines are\n * wired to the registry; add a new engine's compiler here.\n */\nimport type { CompilerRegistry } from './compiler-registry';\nimport { defaultRegistry } from './compiler-registry';\nimport { ClickHouseCompiler } from './sql/clickhouse';\nimport { PostgresCompiler } from './sql/postgres';\nimport { ElasticsearchCompiler } from './search-dsl/elasticsearch';\nimport { OpenSearchCompiler } from './search-dsl/opensearch';\n\nexport function registerDefaultCompilers(\n    registry: CompilerRegistry = defaultRegistry,\n): void {\n    registry.register('clickhouse', new ClickHouseCompiler());\n    registry.register('postgresql', new PostgresCompiler());\n    registry.register('elasticsearch', new ElasticsearchCompiler());\n    registry.register('opensearch', new OpenSearchCompiler());\n}\n","/**\n * Input normalization.\n *\n * Applies safe defaults and canonical shapes before plan creation. Keep this\n * pure: no engine knowledge, no validation (validation happens separately).\n */\nimport type { QueryInput } from './input-types';\n\nexport const DEFAULT_LIMIT = 25;\n\nexport type NormalizedInput = Omit<QueryInput, 'limit' | 'skip' | 'cursor'> & {\n    limit: number;\n    skip: number | null;\n    cursor: unknown[] | null;\n};\n\nexport function normalizeInput(input: QueryInput): NormalizedInput {\n    return {\n        ...input,\n        limit: input.limit ?? DEFAULT_LIMIT,\n        skip: input.skip ?? null,\n        cursor: input.cursor ?? null,\n        // TODO: flatten nested same-operator logical filter nodes and other\n        // safe canonicalizations here.\n    };\n}\n","/**\n * Input shape validation.\n *\n * Structure-only checks (required fields, types, formats). Semantic rules\n * (group/select combinations, pagination ambiguity, engine limits) live in\n * `plan/validate-plan.ts`. Extend the shape checks here as the input grows.\n */\nimport { QueryBuilderError } from '../errors/query-builder-error';\nimport type { FieldPath, FilterExpression, QueryInput } from './input-types';\n\nconst FIELD_TYPES = new Set(['string', 'number', 'boolean', 'date']);\n\n/** Validate an optional nested field path: an array of non-empty strings. */\nfunction validateFieldPath(\n    path: FieldPath | undefined,\n    jsonPath: string,\n    errors: QueryBuilderError[],\n): void {\n    if (path === undefined) {\n        return;\n    }\n    if (!Array.isArray(path) || path.length === 0) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_INPUT',\n                path: jsonPath,\n                message: 'path must be a non-empty array of strings.',\n            }),\n        );\n        return;\n    }\n    path.forEach((segment, i) => {\n        if (typeof segment !== 'string' || segment.length === 0) {\n            errors.push(\n                new QueryBuilderError({\n                    code: 'INVALID_INPUT',\n                    path: `${jsonPath}[${i}]`,\n                    message: 'path segments must be non-empty strings.',\n                }),\n            );\n        }\n    });\n}\n\n/** Walk a filter tree validating each leaf condition's nested path. */\nexport function validateFilterPaths(\n    expr: FilterExpression,\n    jsonPath: string,\n    errors: QueryBuilderError[],\n): void {\n    if ('and' in expr) {\n        expr.and.forEach((e, i) =>\n            validateFilterPaths(e, `${jsonPath}.and[${i}]`, errors),\n        );\n        return;\n    }\n    if ('or' in expr) {\n        expr.or.forEach((e, i) =>\n            validateFilterPaths(e, `${jsonPath}.or[${i}]`, errors),\n        );\n        return;\n    }\n    if ('not' in expr) {\n        validateFilterPaths(expr.not, `${jsonPath}.not`, errors);\n        return;\n    }\n    validateFieldPath(expr.path, `${jsonPath}.path`, errors);\n}\n\nexport function validateInputShape(input: QueryInput): QueryBuilderError[] {\n    const errors: QueryBuilderError[] = [];\n\n    if (!input || typeof input !== 'object') {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_INPUT',\n                path: '$',\n                message: 'Query input must be an object.',\n            }),\n        );\n        return errors;\n    }\n\n    // Source\n    if (!input.source || typeof input.source.name !== 'string') {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_INPUT',\n                path: '$.source.name',\n                message: 'source.name is required and must be a string.',\n            }),\n        );\n    } else if (input.source.name.includes(';')) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_IDENTIFIER',\n                path: '$.source.name',\n                message: 'Identifier cannot contain semicolon.',\n            }),\n        );\n    }\n\n    if (input.source && input.source.schema !== undefined) {\n        if (typeof input.source.schema !== 'string') {\n            errors.push(\n                new QueryBuilderError({\n                    code: 'INVALID_INPUT',\n                    path: '$.source.schema',\n                    message: 'source.schema must be a string when provided.',\n                }),\n            );\n        } else if (input.source.schema.includes(';')) {\n            errors.push(\n                new QueryBuilderError({\n                    code: 'INVALID_IDENTIFIER',\n                    path: '$.source.schema',\n                    message: 'Identifier cannot contain semicolon.',\n                }),\n            );\n        }\n    }\n\n    // Select field types\n    input.select?.forEach((sel, i) => {\n        if (!sel.field || typeof sel.field !== 'string') {\n            errors.push(\n                new QueryBuilderError({\n                    code: 'INVALID_INPUT',\n                    path: `$.select[${i}].field`,\n                    message: 'select field is required.',\n                }),\n            );\n        }\n        if (!FIELD_TYPES.has(sel.type)) {\n            errors.push(\n                new QueryBuilderError({\n                    code: 'INVALID_FIELD_TYPE',\n                    path: `$.select[${i}].type`,\n                    message: `Invalid field type: \"${sel.type}\".`,\n                }),\n            );\n        }\n        validateFieldPath(sel.path, `$.select[${i}].path`, errors);\n    });\n\n    // Nested paths on group-by, aggregations, order-by and filter leaves.\n    input.groupBy?.forEach((g, i) =>\n        validateFieldPath(g.path, `$.groupBy[${i}].path`, errors),\n    );\n    input.aggregations?.forEach((a, i) =>\n        validateFieldPath(a.path, `$.aggregations[${i}].path`, errors),\n    );\n    input.orderBy?.forEach((o, i) => {\n        if ('field' in o) {\n            validateFieldPath(o.path, `$.orderBy[${i}].path`, errors);\n        }\n    });\n    if (input.filter) {\n        validateFilterPaths(input.filter, '$.filter', errors);\n    }\n\n    if (input.limit !== undefined && typeof input.limit !== 'number') {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_INPUT',\n                path: '$.limit',\n                message: 'limit must be a number.',\n            }),\n        );\n    }\n    if (input.skip !== undefined && typeof input.skip !== 'number') {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_INPUT',\n                path: '$.skip',\n                message: 'skip must be a number.',\n            }),\n        );\n    }\n    if (input.cursor !== undefined && !Array.isArray(input.cursor)) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_INPUT',\n                path: '$.cursor',\n                message: 'cursor must be an array.',\n            }),\n        );\n    }\n\n    // TODO: extend shape checks for filter/aggregation/groupBy/having/orderBy\n    // structure as the contract is exercised by real inputs.\n\n    return errors;\n}\n","/**\n * Mutation input validation.\n *\n * Shape checks plus the critical safety rule: an unfiltered delete/update\n * (no `filter`) is rejected unless `allowUnfiltered: true` is set, to prevent\n * accidental full-table/index wipes.\n */\nimport { QueryBuilderError } from '../errors/query-builder-error';\nimport type { MutationInput, UpdateAction } from './input-types';\nimport { validateFilterPaths } from './validate-input';\n\nconst FIELD_TYPES = new Set(['string', 'number', 'boolean', 'date']);\n\nexport function validateMutationInput(\n    input: MutationInput,\n): QueryBuilderError[] {\n    const errors: QueryBuilderError[] = [];\n\n    if (!input || typeof input !== 'object') {\n        return [\n            new QueryBuilderError({\n                code: 'INVALID_MUTATION',\n                path: '$',\n                message: 'Mutation input must be an object.',\n            }),\n        ];\n    }\n\n    if (\n        input.operation !== 'delete' &&\n        input.operation !== 'update' &&\n        input.operation !== 'insert'\n    ) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_MUTATION',\n                path: '$.operation',\n                message: \"operation must be 'insert', 'delete' or 'update'.\",\n            }),\n        );\n    }\n\n    if (!input.source || typeof input.source.name !== 'string') {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_MUTATION',\n                path: '$.source.name',\n                message: 'source.name is required and must be a string.',\n            }),\n        );\n    } else if (input.source.name.includes(';')) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_IDENTIFIER',\n                path: '$.source.name',\n                message: 'Identifier cannot contain semicolon.',\n            }),\n        );\n    }\n\n    if (input.source && input.source.schema !== undefined) {\n        if (typeof input.source.schema !== 'string') {\n            errors.push(\n                new QueryBuilderError({\n                    code: 'INVALID_MUTATION',\n                    path: '$.source.schema',\n                    message: 'source.schema must be a string when provided.',\n                }),\n            );\n        } else if (input.source.schema.includes(';')) {\n            errors.push(\n                new QueryBuilderError({\n                    code: 'INVALID_IDENTIFIER',\n                    path: '$.source.schema',\n                    message: 'Identifier cannot contain semicolon.',\n                }),\n            );\n        }\n    }\n\n    if (input.operation === 'insert') {\n        validateInsertRows(input.rows, errors);\n        validateOnConflict(input.onConflict, input.rows, errors);\n        return errors;\n    }\n\n    if (input.operation === 'update') {\n        const setCount = input.set?.length ?? 0;\n        const actionCount = input.actions?.length ?? 0;\n        if (setCount === 0 && actionCount === 0) {\n            errors.push(\n                new QueryBuilderError({\n                    code: 'INVALID_MUTATION',\n                    path: '$.set',\n                    message:\n                        'update requires a non-empty set list or actions list.',\n                }),\n            );\n        }\n        (input.set ?? []).forEach((assignment, i) => {\n            if (!assignment.field || typeof assignment.field !== 'string') {\n                errors.push(\n                    new QueryBuilderError({\n                        code: 'INVALID_MUTATION',\n                        path: `$.set[${i}].field`,\n                        message: 'set field is required.',\n                    }),\n                );\n            }\n            if (!FIELD_TYPES.has(assignment.type)) {\n                errors.push(\n                    new QueryBuilderError({\n                        code: 'INVALID_FIELD_TYPE',\n                        path: `$.set[${i}].type`,\n                        message: `Invalid field type: \"${assignment.type}\".`,\n                    }),\n                );\n            }\n        });\n        (input.actions ?? []).forEach((action, i) =>\n            validateUpdateAction(action, `$.actions[${i}]`, errors),\n        );\n    }\n\n    // Safety: refuse to affect all rows/documents unless explicitly allowed.\n    if (!input.filter && !input.allowUnfiltered) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'UNFILTERED_MUTATION',\n                path: '$.filter',\n                message:\n                    `${input.operation} without a filter affects ALL rows/documents. ` +\n                    'Provide a filter, or set allowUnfiltered: true to confirm.',\n            }),\n        );\n    }\n\n    if (input.filter) {\n        validateFilterPaths(input.filter, '$.filter', errors);\n    }\n\n    return errors;\n}\n\n/** Validate `insert` rows: non-empty, object rows with a consistent key set. */\nfunction validateInsertRows(\n    rows: Array<Record<string, unknown>>,\n    errors: QueryBuilderError[],\n): void {\n    if (!Array.isArray(rows) || rows.length === 0) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_MUTATION',\n                path: '$.rows',\n                message: 'insert requires a non-empty rows array.',\n            }),\n        );\n        return;\n    }\n\n    const isPlainObject = (r: unknown): r is Record<string, unknown> =>\n        !!r && typeof r === 'object' && !Array.isArray(r);\n\n    const firstKeys = isPlainObject(rows[0]) ? Object.keys(rows[0]) : [];\n    const keySignature = [...firstKeys].sort().join('\\u0000');\n\n    rows.forEach((row, i) => {\n        if (!isPlainObject(row) || Object.keys(row).length === 0) {\n            errors.push(\n                new QueryBuilderError({\n                    code: 'INVALID_MUTATION',\n                    path: `$.rows[${i}]`,\n                    message: 'each insert row must be a non-empty object.',\n                }),\n            );\n            return;\n        }\n        if ([...Object.keys(row)].sort().join('\\u0000') !== keySignature) {\n            errors.push(\n                new QueryBuilderError({\n                    code: 'INVALID_MUTATION',\n                    path: `$.rows[${i}]`,\n                    message: 'all insert rows must share the same columns.',\n                }),\n            );\n        }\n    });\n}\n\n/** Validate `onConflict` upsert keys: non-empty strings that exist as columns. */\nfunction validateOnConflict(\n    onConflict: string[] | undefined,\n    rows: Array<Record<string, unknown>>,\n    errors: QueryBuilderError[],\n): void {\n    if (onConflict === undefined) {\n        return;\n    }\n    if (!Array.isArray(onConflict) || onConflict.length === 0) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_MUTATION',\n                path: '$.onConflict',\n                message:\n                    'onConflict must be a non-empty array of column names.',\n            }),\n        );\n        return;\n    }\n    const columns = new Set(\n        rows[0] && typeof rows[0] === 'object' ? Object.keys(rows[0]) : [],\n    );\n    onConflict.forEach((key, i) => {\n        if (typeof key !== 'string' || key.length === 0) {\n            errors.push(\n                new QueryBuilderError({\n                    code: 'INVALID_MUTATION',\n                    path: `$.onConflict[${i}]`,\n                    message: 'onConflict keys must be non-empty strings.',\n                }),\n            );\n        } else if (!columns.has(key)) {\n            errors.push(\n                new QueryBuilderError({\n                    code: 'INVALID_MUTATION',\n                    path: `$.onConflict[${i}]`,\n                    message: `onConflict key \"${key}\" is not one of the inserted columns.`,\n                }),\n            );\n        }\n    });\n}\n\n/** Validate a granular update action (increment/append/removeField/set). */\nfunction validateUpdateAction(\n    action: UpdateAction,\n    path: string,\n    errors: QueryBuilderError[],\n): void {\n    if (!action || typeof action !== 'object') {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_MUTATION',\n                path,\n                message: 'update action must be an object.',\n            }),\n        );\n        return;\n    }\n    if (!action.field || typeof action.field !== 'string') {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_MUTATION',\n                path: `${path}.field`,\n                message: 'update action field is required.',\n            }),\n        );\n    }\n    if (action.op === 'increment' && typeof action.by !== 'number') {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_MUTATION',\n                path: `${path}.by`,\n                message: 'increment \"by\" must be a number.',\n            }),\n        );\n    }\n    if (\n        (action.op === 'set' || action.op === 'append') &&\n        !FIELD_TYPES.has(action.type)\n    ) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_FIELD_TYPE',\n                path: `${path}.type`,\n                message: `Invalid field type: \"${action.type}\".`,\n            }),\n        );\n    }\n    if (\n        action.op !== 'set' &&\n        action.op !== 'increment' &&\n        action.op !== 'append' &&\n        action.op !== 'removeField'\n    ) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_MUTATION',\n                path: `${path}.op`,\n                message: `Unknown update action op: \"${\n                    (action as { op: string }).op\n                }\".`,\n            }),\n        );\n    }\n}\n","/**\n * Deterministic output-name generation.\n *\n * Aggregation and date-group output names are generated ONCE during plan\n * creation and stored on the plan nodes, so every compiler uses the same names\n * and metadata stays consistent. Collisions with selected/grouped fields are\n * auto-fixed with a numeric suffix.\n */\nimport type {\n    AggregationFunction,\n    DateGranularity,\n} from '../input/input-types';\n\nexport class OutputNameGenerator {\n    private readonly reserved = new Set<string>();\n\n    /** Reserve an already-known name (e.g. a selected/grouped field). */\n    reserve(name: string): void {\n        this.reserved.add(name);\n    }\n\n    aggregationName(fn: AggregationFunction, field: string | null): string {\n        const base = field\n            ? `__${fn}_${field.split('.').join('_')}`\n            : `__${fn}`;\n        return this.ensureUnique(base);\n    }\n\n    dateGroupName(field: string, granularity: DateGranularity | null): string {\n        const safe = field.split('.').join('_');\n        const base = granularity ? `${safe}_${granularity}` : safe;\n        return this.ensureUnique(base);\n    }\n\n    private ensureUnique(base: string): string {\n        if (!this.reserved.has(base)) {\n            this.reserved.add(base);\n            return base;\n        }\n        let suffix = 2;\n        let candidate = `${base}_${suffix}`;\n        while (this.reserved.has(candidate)) {\n            suffix += 1;\n            candidate = `${base}_${suffix}`;\n        }\n        this.reserved.add(candidate);\n        return candidate;\n    }\n}\n","/**\n * Builds a {@link QueryPlan} from a normalized input.\n *\n * This is the bridge from the public contract to the internal model that all\n * compilers consume. It also generates deterministic output names for\n * aggregations and date groups (once), so every engine stays consistent.\n */\nimport type {\n    AggregationDefinition,\n    FilterExpression,\n    HavingExpression,\n    OrderByDefinition,\n} from '../input/input-types';\nimport type { NormalizedInput } from '../input/normalize-input';\nimport { OutputNameGenerator } from '../metadata/output-name-generator';\nimport {\n    AggregationNode,\n    FieldRefNode,\n    FilterConditionNode,\n    FilterNode,\n    GroupFieldNode,\n    GroupingNode,\n    HavingConditionNode,\n    HavingNode,\n    LimitNode,\n    LogicalFilterNode,\n    LogicalHavingNode,\n    NotFilterNode,\n    NotHavingNode,\n    OrderNode,\n    PaginationNode,\n    ProjectionNode,\n    QueryPlan,\n    SourceNode,\n} from './query-plan';\n\nexport function inputToPlan(input: NormalizedInput): QueryPlan {\n    const names = new OutputNameGenerator();\n\n    const source = new SourceNode(\n        '$.source.name',\n        input.source.name,\n        input.source.schema ?? null,\n    );\n\n    // Reserve selected field names so generated names don't collide with them.\n    // Group output names are generated (and reserved) below via the name\n    // generator, so we must NOT pre-reserve the raw group field names here.\n    input.select?.forEach((s) => names.reserve(s.field));\n\n    const projection = input.select?.length\n        ? new ProjectionNode(\n              '$.select',\n              input.select.map(\n                  (s, i) =>\n                      new FieldRefNode(\n                          `$.select[${i}]`,\n                          s.field,\n                          s.type,\n                          s.path ?? null,\n                      ),\n              ),\n          )\n        : null;\n\n    const filter = input.filter ? buildFilter(input.filter, '$.filter') : null;\n\n    const aggregations = (input.aggregations ?? []).map((a, i) =>\n        buildAggregation(a, `$.aggregations[${i}]`, names),\n    );\n\n    const grouping = input.groupBy?.length\n        ? new GroupingNode(\n              '$.groupBy',\n              input.groupBy.map(\n                  (g, i) =>\n                      new GroupFieldNode(\n                          `$.groupBy[${i}]`,\n                          new FieldRefNode(\n                              `$.groupBy[${i}]`,\n                              g.field,\n                              g.type,\n                              g.path ?? null,\n                          ),\n                          g.granularity ?? null,\n                          g.offset ?? null,\n                          g.limit ?? null,\n                          names.dateGroupName(g.field, g.granularity ?? null),\n                      ),\n              ),\n          )\n        : null;\n\n    const having = input.having\n        ? buildHaving(input.having, '$.having', aggregations, names)\n        : null;\n\n    const ordering = (input.orderBy ?? []).map((o, i) =>\n        buildOrder(o, `$.orderBy[${i}]`, aggregations, names),\n    );\n\n    const pagination = new PaginationNode('$', input.skip, input.cursor);\n    const limits = new LimitNode('$.limit', input.limit);\n\n    return new QueryPlan(\n        '$',\n        source,\n        projection,\n        filter,\n        grouping,\n        aggregations,\n        having,\n        ordering,\n        pagination,\n        limits,\n    );\n}\n\nfunction buildAggregation(\n    def: AggregationDefinition,\n    path: string,\n    names: OutputNameGenerator,\n): AggregationNode {\n    // TODO: plan validation should require `type` when `field` is present.\n    // Kept lenient here (aggregations produce numbers).\n    const field = def.field\n        ? new FieldRefNode(\n              path,\n              def.field,\n              def.type ?? 'number',\n              def.path ?? null,\n          )\n        : null;\n    return new AggregationNode(\n        path,\n        def.function,\n        field,\n        names.aggregationName(def.function, def.field ?? null),\n    );\n}\n\nfunction buildFilter(expr: FilterExpression, path: string): FilterNode {\n    return buildFilterNode(expr, path);\n}\n\n/** Build a {@link FilterNode} tree from a filter expression (shared with mutations). */\nexport function buildFilterNode(\n    expr: FilterExpression,\n    path: string,\n): FilterNode {\n    if ('and' in expr) {\n        return new LogicalFilterNode(\n            path,\n            'and',\n            expr.and.map((e, i) => buildFilter(e, `${path}.and[${i}]`)),\n        );\n    }\n    if ('or' in expr) {\n        return new LogicalFilterNode(\n            path,\n            'or',\n            expr.or.map((e, i) => buildFilter(e, `${path}.or[${i}]`)),\n        );\n    }\n    if ('not' in expr) {\n        return new NotFilterNode(path, buildFilter(expr.not, `${path}.not`));\n    }\n    return new FilterConditionNode(\n        path,\n        new FieldRefNode(path, expr.field, expr.type, expr.path ?? null),\n        expr.operator,\n        expr.value,\n    );\n}\n\nfunction buildHaving(\n    expr: HavingExpression,\n    path: string,\n    aggregations: AggregationNode[],\n    names: OutputNameGenerator,\n): HavingNode {\n    if ('and' in expr) {\n        return new LogicalHavingNode(\n            path,\n            'and',\n            expr.and.map((e, i) =>\n                buildHaving(e, `${path}.and[${i}]`, aggregations, names),\n            ),\n        );\n    }\n    if ('or' in expr) {\n        return new LogicalHavingNode(\n            path,\n            'or',\n            expr.or.map((e, i) =>\n                buildHaving(e, `${path}.or[${i}]`, aggregations, names),\n            ),\n        );\n    }\n    if ('not' in expr) {\n        return new NotHavingNode(\n            path,\n            buildHaving(expr.not, `${path}.not`, aggregations, names),\n        );\n    }\n    return new HavingConditionNode(\n        path,\n        resolveAggregation(expr.aggregation, path, aggregations, names),\n        expr.operator,\n        expr.value,\n    );\n}\n\nfunction buildOrder(\n    def: OrderByDefinition,\n    path: string,\n    aggregations: AggregationNode[],\n    names: OutputNameGenerator,\n): OrderNode {\n    if ('aggregation' in def) {\n        return new OrderNode(\n            path,\n            {\n                kind: 'aggregation',\n                aggregation: resolveAggregation(\n                    def.aggregation,\n                    path,\n                    aggregations,\n                    names,\n                ),\n            },\n            def.direction,\n        );\n    }\n    return new OrderNode(\n        path,\n        {\n            kind: 'field',\n            field: new FieldRefNode(\n                path,\n                def.field,\n                def.type,\n                def.path ?? null,\n            ),\n        },\n        def.direction,\n    );\n}\n\n/** Reuse the matching aggregation node when possible; else create a new one. */\nfunction resolveAggregation(\n    def: AggregationDefinition,\n    path: string,\n    aggregations: AggregationNode[],\n    names: OutputNameGenerator,\n): AggregationNode {\n    const match = aggregations.find(\n        (a) =>\n            a.fn === def.function &&\n            (a.field?.field ?? null) === (def.field ?? null),\n    );\n    return match ?? buildAggregation(def, path, names);\n}\n","/**\n * Logical model for write mutations (insert/update/delete).\n *\n * Mirrors the read {@link QueryPlan} but for mutations. Reuses {@link FilterNode}\n * for the WHERE/query criteria so filters behave identically to reads.\n */\nimport type { FieldRefNode, FilterNode, SourceNode } from './query-plan';\nimport { PlanNode } from './query-plan';\n\n/** How an update assignment mutates its target field. */\nexport type AssignmentOp = 'set' | 'increment' | 'append' | 'removeField';\n\n/** A single update assignment (`set`/`increment`/`append`/`removeField`). */\nexport class AssignmentNode extends PlanNode {\n    readonly kind = 'assignment';\n    constructor(\n        path: string,\n        readonly field: FieldRefNode,\n        readonly op: AssignmentOp,\n        /** Value to set/increment-by/append; `null` for `removeField`. */\n        readonly value: unknown,\n    ) {\n        super(path);\n    }\n}\n\n/** A delete/update/insert over one source. */\nexport class MutationPlan extends PlanNode {\n    readonly kind = 'mutation-plan';\n    constructor(\n        path: string,\n        readonly operation: 'delete' | 'update' | 'insert',\n        readonly source: SourceNode,\n        /** Assignments for `update`; empty otherwise. */\n        readonly assignments: AssignmentNode[],\n        /** Criteria; `null` means \"all rows/documents\" (unfiltered / N/A). */\n        readonly filter: FilterNode | null,\n        /** Ordered column names for `insert`; empty otherwise. */\n        readonly columns: string[] = [],\n        /** Row values aligned to {@link columns} for `insert`; empty otherwise. */\n        readonly rows: unknown[][] = [],\n        /**\n         * Key columns for an upsert (`insert` with conflict resolution); `null`\n         * for a plain insert or non-insert mutations.\n         */\n        readonly conflictKeys: string[] | null = null,\n    ) {\n        super(path);\n    }\n}\n","/**\n * Builds a {@link MutationPlan} from a {@link MutationInput}.\n */\nimport type { MutationInput } from '../input/input-types';\nimport type { FieldType, UpdateAction } from '../input/input-types';\nimport { buildFilterNode } from './input-to-plan';\nimport { AssignmentNode, MutationPlan } from './mutation-plan';\nimport { FieldRefNode, SourceNode } from './query-plan';\n\nexport function inputToMutationPlan(input: MutationInput): MutationPlan {\n    const source = new SourceNode(\n        '$.source.name',\n        input.source.name,\n        input.source.schema ?? null,\n    );\n\n    if (input.operation === 'insert') {\n        // Column order is taken from the first row; every row is aligned to it.\n        const columns = Object.keys(input.rows[0] ?? {});\n        const rows = input.rows.map((row) => columns.map((col) => row[col]));\n        const conflictKeys = input.onConflict?.length ? input.onConflict : null;\n        return new MutationPlan(\n            '$',\n            'insert',\n            source,\n            [],\n            null,\n            columns,\n            rows,\n            conflictKeys,\n        );\n    }\n\n    const filter = input.filter\n        ? buildFilterNode(input.filter, '$.filter')\n        : null;\n\n    const assignments =\n        input.operation === 'update' ? buildAssignments(input) : [];\n\n    return new MutationPlan('$', input.operation, source, assignments, filter);\n}\n\n/** Fold `set` sugar and granular `actions` into a single assignment list. */\nfunction buildAssignments(input: {\n    set?: Array<{ field: string; type: FieldType; value: unknown }>;\n    actions?: UpdateAction[];\n}): AssignmentNode[] {\n    const assignments: AssignmentNode[] = [];\n\n    (input.set ?? []).forEach((s, i) => {\n        assignments.push(\n            new AssignmentNode(\n                `$.set[${i}]`,\n                new FieldRefNode(`$.set[${i}]`, s.field, s.type),\n                'set',\n                s.value,\n            ),\n        );\n    });\n\n    (input.actions ?? []).forEach((action, i) => {\n        const path = `$.actions[${i}]`;\n        if (action.op === 'increment') {\n            assignments.push(\n                new AssignmentNode(\n                    path,\n                    new FieldRefNode(path, action.field, 'number'),\n                    'increment',\n                    action.by,\n                ),\n            );\n        } else if (action.op === 'removeField') {\n            assignments.push(\n                new AssignmentNode(\n                    path,\n                    new FieldRefNode(path, action.field, 'string'),\n                    'removeField',\n                    null,\n                ),\n            );\n        } else {\n            // 'set' | 'append'\n            assignments.push(\n                new AssignmentNode(\n                    path,\n                    new FieldRefNode(path, action.field, action.type),\n                    action.op,\n                    action.value,\n                ),\n            );\n        }\n    });\n\n    return assignments;\n}\n","/**\n * Semantic + engine validation over a {@link QueryPlan}.\n *\n * Shared semantic rules run for every engine. Engine-specific rules are added\n * via {@link PlanValidationRule} — the extension point for \"known unsupported\n * combinations\" (e.g. an engine that lacks a date granularity or an\n * aggregation), instead of scattering `if (engine === …)`.\n */\nimport type { Engine } from '../input/input-types';\nimport { QueryBuilderError } from '../errors/query-builder-error';\nimport type { QueryPlan } from './query-plan';\n\nexport const MAX_LIMIT = 10_000;\nexport const MAX_SKIP = 10_000;\nexport const MAX_SELECTED_FIELDS = 50;\n\nexport type PlanValidationContext = {\n    engine: Engine;\n};\n\n/** A composable validation rule. Return errors (empty = valid). */\nexport interface PlanValidationRule {\n    validate(\n        plan: QueryPlan,\n        context: PlanValidationContext,\n    ): QueryBuilderError[];\n}\n\n/**\n * Engine-specific validation rules for known unsupported combinations. Register\n * a rule here to reject a combination for a given engine.\n *\n * Example:\n *   engineRules.push({\n *     validate(plan, ctx) {\n *       if (ctx.engine === 'clickhouse' && usesUnsupportedThing(plan)) {\n *         return [new QueryBuilderError({ code: 'UNSUPPORTED_ENGINE_BEHAVIOR', ... })];\n *       }\n *       return [];\n *     },\n *   });\n */\nexport const engineRules: PlanValidationRule[] = [];\n\nexport function validatePlan(\n    plan: QueryPlan,\n    context: PlanValidationContext,\n): QueryBuilderError[] {\n    const errors: QueryBuilderError[] = [];\n\n    const hasSelect = plan.projection !== null;\n    const hasGrouping = plan.grouping !== null;\n    const hasAggregations = plan.aggregations.length > 0;\n\n    // Output shape combinations.\n    if (!hasSelect && !hasGrouping && !hasAggregations) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_INPUT',\n                path: '$',\n                message: 'Query must define select, groupBy, or aggregations.',\n            }),\n        );\n    }\n    if (hasSelect && hasGrouping) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_GROUP_SELECTION',\n                path: '$.select',\n                message:\n                    'select cannot be provided when groupBy exists. Grouped output is inferred from groupBy and aggregations.',\n            }),\n        );\n    }\n    if (hasSelect && hasAggregations && !hasGrouping) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'INVALID_AGGREGATION_SELECTION',\n                path: '$.select',\n                message:\n                    'select cannot be combined with aggregations unless groupBy rules are satisfied.',\n            }),\n        );\n    }\n\n    // Limits.\n    if (plan.limits.limit > MAX_LIMIT) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'LIMIT_EXCEEDED',\n                path: '$.limit',\n                message: `limit must be <= ${MAX_LIMIT}.`,\n            }),\n        );\n    }\n    if (plan.pagination.skip !== null && plan.pagination.skip > MAX_SKIP) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'SKIP_EXCEEDED',\n                path: '$.skip',\n                message: `skip must be <= ${MAX_SKIP}.`,\n            }),\n        );\n    }\n    if (\n        plan.projection &&\n        plan.projection.fields.length > MAX_SELECTED_FIELDS\n    ) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'MAX_SELECTED_FIELDS_EXCEEDED',\n                path: '$.select',\n                message: `A maximum of ${MAX_SELECTED_FIELDS} fields may be selected.`,\n            }),\n        );\n    }\n\n    // Pagination.\n    if (plan.pagination.skip !== null && plan.pagination.cursor !== null) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'AMBIGUOUS_PAGINATION',\n                path: '$',\n                message:\n                    'skip and cursor cannot be provided together because pagination strategy would be ambiguous.',\n            }),\n        );\n    }\n    if (plan.pagination.cursor !== null && plan.ordering.length === 0) {\n        errors.push(\n            new QueryBuilderError({\n                code: 'SEARCH_AFTER_REQUIRES_ORDER_BY',\n                path: '$.orderBy',\n                message: 'cursor pagination (search_after) requires orderBy.',\n            }),\n        );\n    }\n\n    // Grouped ordering must reference grouped fields or aggregations.\n    if (hasGrouping) {\n        const groupFields = new Set(\n            plan.grouping!.groups.map((g) => g.field.field),\n        );\n        for (const order of plan.ordering) {\n            if (\n                order.target.kind === 'field' &&\n                !groupFields.has(order.target.field.field)\n            ) {\n                errors.push(\n                    new QueryBuilderError({\n                        code: 'INVALID_ORDER_BY',\n                        path: order.path,\n                        message:\n                            'Grouped queries can only order by grouped fields or aggregations.',\n                    }),\n                );\n            }\n        }\n    }\n\n    // Engine-specific rules (extension point).\n    for (const rule of engineRules) {\n        errors.push(...rule.validate(plan, context));\n    }\n\n    return errors;\n}\n","/**\n * `QueryBuilder` — the public entry point.\n *\n * Pipeline: validate input shape → normalize → build QueryPlan → validate plan\n * (semantic + engine) → dispatch to the engine compiler. Engines are resolved\n * from `transpile({ engine })` or the constructor; compilers come from the\n * registry. Adding an engine does not change this class.\n */\nimport { registerDefaultCompilers } from './compilers/register-default-compilers';\nimport { defaultRegistry } from './compilers/compiler-registry';\nimport type {\n    MutationTranspileResult,\n    TranspileOptions,\n    TranspileResult,\n} from './compilers/compiler';\nimport { QueryBuilderError } from './errors/query-builder-error';\nimport type { Engine, MutationInput, QueryInput } from './input/input-types';\nimport { normalizeInput } from './input/normalize-input';\nimport { validateInputShape } from './input/validate-input';\nimport { validateMutationInput } from './input/validate-mutation';\nimport { inputToPlan } from './plan/input-to-plan';\nimport { inputToMutationPlan } from './plan/input-to-mutation-plan';\nimport type { MutationPlan } from './plan/mutation-plan';\nimport type { QueryPlan } from './plan/query-plan';\nimport { validatePlan } from './plan/validate-plan';\n\nregisterDefaultCompilers(defaultRegistry);\n\nexport type QueryBuilderOptions = {\n    engine?: Engine;\n};\n\nexport type ValidationResult = {\n    valid: boolean;\n    errors: QueryBuilderError[];\n};\n\nexport class QueryBuilder {\n    constructor(\n        private readonly input: QueryInput,\n        private readonly options: QueryBuilderOptions = {},\n    ) {}\n\n    /** Validate input + plan for the resolved engine without throwing. */\n    validate(options: TranspileOptions = {}): ValidationResult {\n        const engine = resolveEngine(options.engine, this.options.engine);\n        const shapeErrors = validateInputShape(this.input);\n        if (shapeErrors.length > 0) {\n            return { valid: false, errors: shapeErrors };\n        }\n        const plan = inputToPlan(normalizeInput(this.input));\n        const planErrors = validatePlan(plan, { engine });\n        return { valid: planErrors.length === 0, errors: planErrors };\n    }\n\n    /** Return the validated {@link QueryPlan}. Throws on the first error. */\n    plan(options: TranspileOptions = {}): QueryPlan {\n        const engine = resolveEngine(options.engine, this.options.engine);\n        this.assertValid(validateInputShape(this.input));\n        const plan = inputToPlan(normalizeInput(this.input));\n        this.assertValid(validatePlan(plan, { engine }));\n        return plan;\n    }\n\n    /** Compile the query for the resolved engine. Throws on validation errors. */\n    transpile(options: TranspileOptions = {}): TranspileResult {\n        const engine = resolveEngine(options.engine, this.options.engine);\n        const plan = this.plan(options);\n        return defaultRegistry.get(engine).compile(plan);\n    }\n\n    private assertValid(errors: QueryBuilderError[]): void {\n        if (errors.length > 0) {\n            throw errors[0];\n        }\n    }\n}\n\nfunction resolveEngine(\n    optionEngine: Engine | undefined,\n    ctorEngine: Engine | undefined,\n): Engine {\n    const engine = optionEngine ?? ctorEngine;\n    if (!engine) {\n        throw new QueryBuilderError({\n            code: 'MISSING_ENGINE',\n            path: '$.engine',\n            message:\n                'Engine must be provided in the constructor or transpile options.',\n        });\n    }\n    return engine;\n}\n\n/**\n * `MutationBuilder` — portable write mutations. Mirrors {@link QueryBuilder} but\n * compiles a {@link MutationInput} into an INSERT/UPSERT/UPDATE/DELETE (SQL) or\n * a bulk index / `_delete_by_query` / `_update_by_query` (ES/OS) via the engine\n * compiler's `compileMutation`.\n */\nexport class MutationBuilder {\n    constructor(\n        private readonly input: MutationInput,\n        private readonly options: QueryBuilderOptions = {},\n    ) {}\n\n    /** Validate the mutation input without throwing. */\n    validate(): ValidationResult {\n        const errors = validateMutationInput(this.input);\n        return { valid: errors.length === 0, errors };\n    }\n\n    /** Return the validated {@link MutationPlan}. Throws on the first error. */\n    plan(): MutationPlan {\n        const errors = validateMutationInput(this.input);\n        if (errors.length > 0) {\n            throw errors[0];\n        }\n        return inputToMutationPlan(this.input);\n    }\n\n    /** Compile the mutation for the resolved engine. Throws on validation errors. */\n    transpile(options: TranspileOptions = {}): MutationTranspileResult {\n        const engine = resolveEngine(options.engine, this.options.engine);\n        const plan = this.plan();\n        const compiler = defaultRegistry.get(engine);\n        if (!compiler.compileMutation) {\n            throw new QueryBuilderError({\n                code: 'UNSUPPORTED_ENGINE_BEHAVIOR',\n                path: '$.engine',\n                message: `Engine \"${engine}\" does not support mutations.`,\n                details: { engine },\n            });\n        }\n        return compiler.compileMutation(plan);\n    }\n}\n"]}