@jaepil/uqa 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +788 -0
- package/dist/types/src/analysis/analyzer.d.ts +27 -0
- package/dist/types/src/analysis/analyzer.d.ts.map +1 -0
- package/dist/types/src/analysis/char-filter.d.ts +27 -0
- package/dist/types/src/analysis/char-filter.d.ts.map +1 -0
- package/dist/types/src/analysis/token-filter.d.ts +73 -0
- package/dist/types/src/analysis/token-filter.d.ts.map +1 -0
- package/dist/types/src/analysis/tokenizer.d.ts +42 -0
- package/dist/types/src/analysis/tokenizer.d.ts.map +1 -0
- package/dist/types/src/api/query-builder.d.ts +103 -0
- package/dist/types/src/api/query-builder.d.ts.map +1 -0
- package/dist/types/src/cli/repl.d.ts +42 -0
- package/dist/types/src/cli/repl.d.ts.map +1 -0
- package/dist/types/src/core/functor.d.ts +38 -0
- package/dist/types/src/core/functor.d.ts.map +1 -0
- package/dist/types/src/core/hierarchical.d.ts +24 -0
- package/dist/types/src/core/hierarchical.d.ts.map +1 -0
- package/dist/types/src/core/posting-list.d.ts +43 -0
- package/dist/types/src/core/posting-list.d.ts.map +1 -0
- package/dist/types/src/core/types.d.ts +116 -0
- package/dist/types/src/core/types.d.ts.map +1 -0
- package/dist/types/src/engine.d.ts +130 -0
- package/dist/types/src/engine.d.ts.map +1 -0
- package/dist/types/src/execution/batch.d.ts +144 -0
- package/dist/types/src/execution/batch.d.ts.map +1 -0
- package/dist/types/src/execution/physical.d.ts +18 -0
- package/dist/types/src/execution/physical.d.ts.map +1 -0
- package/dist/types/src/execution/relational.d.ts +174 -0
- package/dist/types/src/execution/relational.d.ts.map +1 -0
- package/dist/types/src/execution/scan.d.ts +41 -0
- package/dist/types/src/execution/scan.d.ts.map +1 -0
- package/dist/types/src/execution/spill.d.ts +39 -0
- package/dist/types/src/execution/spill.d.ts.map +1 -0
- package/dist/types/src/fdw/arrow-handler.d.ts +28 -0
- package/dist/types/src/fdw/arrow-handler.d.ts.map +1 -0
- package/dist/types/src/fdw/duckdb-handler.d.ts +32 -0
- package/dist/types/src/fdw/duckdb-handler.d.ts.map +1 -0
- package/dist/types/src/fdw/foreign-table.d.ts +47 -0
- package/dist/types/src/fdw/foreign-table.d.ts.map +1 -0
- package/dist/types/src/fdw/handler.d.ts +52 -0
- package/dist/types/src/fdw/handler.d.ts.map +1 -0
- package/dist/types/src/fusion/attention.d.ts +23 -0
- package/dist/types/src/fusion/attention.d.ts.map +1 -0
- package/dist/types/src/fusion/boolean.d.ts +6 -0
- package/dist/types/src/fusion/boolean.d.ts.map +1 -0
- package/dist/types/src/fusion/learned.d.ts +12 -0
- package/dist/types/src/fusion/learned.d.ts.map +1 -0
- package/dist/types/src/fusion/log-odds.d.ts +87 -0
- package/dist/types/src/fusion/log-odds.d.ts.map +1 -0
- package/dist/types/src/fusion/query-features.d.ts +8 -0
- package/dist/types/src/fusion/query-features.d.ts.map +1 -0
- package/dist/types/src/graph/centrality.d.ts +35 -0
- package/dist/types/src/graph/centrality.d.ts.map +1 -0
- package/dist/types/src/graph/cross-paradigm.d.ts +68 -0
- package/dist/types/src/graph/cross-paradigm.d.ts.map +1 -0
- package/dist/types/src/graph/cypher/ast.d.ts +175 -0
- package/dist/types/src/graph/cypher/ast.d.ts.map +1 -0
- package/dist/types/src/graph/cypher/compiler.d.ts +60 -0
- package/dist/types/src/graph/cypher/compiler.d.ts.map +1 -0
- package/dist/types/src/graph/cypher/lexer.d.ts +82 -0
- package/dist/types/src/graph/cypher/lexer.d.ts.map +1 -0
- package/dist/types/src/graph/cypher/parser.d.ts +50 -0
- package/dist/types/src/graph/cypher/parser.d.ts.map +1 -0
- package/dist/types/src/graph/delta.d.ts +31 -0
- package/dist/types/src/graph/delta.d.ts.map +1 -0
- package/dist/types/src/graph/graph-embedding.d.ts +13 -0
- package/dist/types/src/graph/graph-embedding.d.ts.map +1 -0
- package/dist/types/src/graph/incremental-match.d.ts +16 -0
- package/dist/types/src/graph/incremental-match.d.ts.map +1 -0
- package/dist/types/src/graph/index.d.ts +58 -0
- package/dist/types/src/graph/index.d.ts.map +1 -0
- package/dist/types/src/graph/join.d.ts +18 -0
- package/dist/types/src/graph/join.d.ts.map +1 -0
- package/dist/types/src/graph/message-passing.d.ts +17 -0
- package/dist/types/src/graph/message-passing.d.ts.map +1 -0
- package/dist/types/src/graph/operators.d.ts +81 -0
- package/dist/types/src/graph/operators.d.ts.map +1 -0
- package/dist/types/src/graph/pattern.d.ts +63 -0
- package/dist/types/src/graph/pattern.d.ts.map +1 -0
- package/dist/types/src/graph/posting-list.d.ts +24 -0
- package/dist/types/src/graph/posting-list.d.ts.map +1 -0
- package/dist/types/src/graph/rpq-optimizer.d.ts +25 -0
- package/dist/types/src/graph/rpq-optimizer.d.ts.map +1 -0
- package/dist/types/src/graph/store.d.ts +61 -0
- package/dist/types/src/graph/store.d.ts.map +1 -0
- package/dist/types/src/graph/temporal-filter.d.ts +12 -0
- package/dist/types/src/graph/temporal-filter.d.ts.map +1 -0
- package/dist/types/src/graph/temporal-pattern-match.d.ts +26 -0
- package/dist/types/src/graph/temporal-pattern-match.d.ts.map +1 -0
- package/dist/types/src/graph/temporal-traverse.d.ts +25 -0
- package/dist/types/src/graph/temporal-traverse.d.ts.map +1 -0
- package/dist/types/src/graph/versioned-store.d.ts +64 -0
- package/dist/types/src/graph/versioned-store.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +20 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/joins/base.d.ts +18 -0
- package/dist/types/src/joins/base.d.ts.map +1 -0
- package/dist/types/src/joins/cross-paradigm.d.ts +46 -0
- package/dist/types/src/joins/cross-paradigm.d.ts.map +1 -0
- package/dist/types/src/joins/cross.d.ts +9 -0
- package/dist/types/src/joins/cross.d.ts.map +1 -0
- package/dist/types/src/joins/index.d.ts +7 -0
- package/dist/types/src/joins/index.d.ts.map +1 -0
- package/dist/types/src/joins/inner.d.ts +7 -0
- package/dist/types/src/joins/inner.d.ts.map +1 -0
- package/dist/types/src/joins/outer.d.ts +16 -0
- package/dist/types/src/joins/outer.d.ts.map +1 -0
- package/dist/types/src/joins/semi.d.ts +22 -0
- package/dist/types/src/joins/semi.d.ts.map +1 -0
- package/dist/types/src/joins/sort-merge.d.ts +7 -0
- package/dist/types/src/joins/sort-merge.d.ts.map +1 -0
- package/dist/types/src/math/linalg.d.ts +27 -0
- package/dist/types/src/math/linalg.d.ts.map +1 -0
- package/dist/types/src/math/random.d.ts +15 -0
- package/dist/types/src/math/random.d.ts.map +1 -0
- package/dist/types/src/operators/aggregation.d.ts +65 -0
- package/dist/types/src/operators/aggregation.d.ts.map +1 -0
- package/dist/types/src/operators/attention.d.ts +16 -0
- package/dist/types/src/operators/attention.d.ts.map +1 -0
- package/dist/types/src/operators/backend.d.ts +52 -0
- package/dist/types/src/operators/backend.d.ts.map +1 -0
- package/dist/types/src/operators/base.d.ts +32 -0
- package/dist/types/src/operators/base.d.ts.map +1 -0
- package/dist/types/src/operators/boolean.d.ts +23 -0
- package/dist/types/src/operators/boolean.d.ts.map +1 -0
- package/dist/types/src/operators/calibrated-vector.d.ts +56 -0
- package/dist/types/src/operators/calibrated-vector.d.ts.map +1 -0
- package/dist/types/src/operators/deep-fusion.d.ts +104 -0
- package/dist/types/src/operators/deep-fusion.d.ts.map +1 -0
- package/dist/types/src/operators/deep-learn.d.ts +87 -0
- package/dist/types/src/operators/deep-learn.d.ts.map +1 -0
- package/dist/types/src/operators/hierarchical.d.ts +44 -0
- package/dist/types/src/operators/hierarchical.d.ts.map +1 -0
- package/dist/types/src/operators/hybrid.d.ts +75 -0
- package/dist/types/src/operators/hybrid.d.ts.map +1 -0
- package/dist/types/src/operators/learned-fusion.d.ts +15 -0
- package/dist/types/src/operators/learned-fusion.d.ts.map +1 -0
- package/dist/types/src/operators/multi-field.d.ts +13 -0
- package/dist/types/src/operators/multi-field.d.ts.map +1 -0
- package/dist/types/src/operators/multi-stage.d.ts +12 -0
- package/dist/types/src/operators/multi-stage.d.ts.map +1 -0
- package/dist/types/src/operators/primitive.d.ts +75 -0
- package/dist/types/src/operators/primitive.d.ts.map +1 -0
- package/dist/types/src/operators/progressive-fusion.d.ts +13 -0
- package/dist/types/src/operators/progressive-fusion.d.ts.map +1 -0
- package/dist/types/src/operators/sparse.d.ts +12 -0
- package/dist/types/src/operators/sparse.d.ts.map +1 -0
- package/dist/types/src/planner/cardinality.d.ts +110 -0
- package/dist/types/src/planner/cardinality.d.ts.map +1 -0
- package/dist/types/src/planner/cost-model.d.ts +16 -0
- package/dist/types/src/planner/cost-model.d.ts.map +1 -0
- package/dist/types/src/planner/executor.d.ts +48 -0
- package/dist/types/src/planner/executor.d.ts.map +1 -0
- package/dist/types/src/planner/join-enumerator.d.ts +76 -0
- package/dist/types/src/planner/join-enumerator.d.ts.map +1 -0
- package/dist/types/src/planner/join-graph.d.ts +61 -0
- package/dist/types/src/planner/join-graph.d.ts.map +1 -0
- package/dist/types/src/planner/join-order.d.ts +24 -0
- package/dist/types/src/planner/join-order.d.ts.map +1 -0
- package/dist/types/src/planner/optimizer.d.ts +62 -0
- package/dist/types/src/planner/optimizer.d.ts.map +1 -0
- package/dist/types/src/planner/parallel.d.ts +43 -0
- package/dist/types/src/planner/parallel.d.ts.map +1 -0
- package/dist/types/src/scoring/bayesian-bm25.d.ts +22 -0
- package/dist/types/src/scoring/bayesian-bm25.d.ts.map +1 -0
- package/dist/types/src/scoring/bm25.d.ts +20 -0
- package/dist/types/src/scoring/bm25.d.ts.map +1 -0
- package/dist/types/src/scoring/calibration.d.ts +68 -0
- package/dist/types/src/scoring/calibration.d.ts.map +1 -0
- package/dist/types/src/scoring/external-prior.d.ts +55 -0
- package/dist/types/src/scoring/external-prior.d.ts.map +1 -0
- package/dist/types/src/scoring/fusion-wand.d.ts +19 -0
- package/dist/types/src/scoring/fusion-wand.d.ts.map +1 -0
- package/dist/types/src/scoring/multi-field.d.ts +10 -0
- package/dist/types/src/scoring/multi-field.d.ts.map +1 -0
- package/dist/types/src/scoring/parameter-learner.d.ts +42 -0
- package/dist/types/src/scoring/parameter-learner.d.ts.map +1 -0
- package/dist/types/src/scoring/vector.d.ts +42 -0
- package/dist/types/src/scoring/vector.d.ts.map +1 -0
- package/dist/types/src/scoring/wand.d.ts +51 -0
- package/dist/types/src/scoring/wand.d.ts.map +1 -0
- package/dist/types/src/sql/compiler.d.ts +551 -0
- package/dist/types/src/sql/compiler.d.ts.map +1 -0
- package/dist/types/src/sql/expr-evaluator.d.ts +43 -0
- package/dist/types/src/sql/expr-evaluator.d.ts.map +1 -0
- package/dist/types/src/sql/fts-query.d.ts +60 -0
- package/dist/types/src/sql/fts-query.d.ts.map +1 -0
- package/dist/types/src/sql/table.d.ts +72 -0
- package/dist/types/src/sql/table.d.ts.map +1 -0
- package/dist/types/src/storage/abc/document-store.d.ts +44 -0
- package/dist/types/src/storage/abc/document-store.d.ts.map +1 -0
- package/dist/types/src/storage/abc/graph-store.d.ts +109 -0
- package/dist/types/src/storage/abc/graph-store.d.ts.map +1 -0
- package/dist/types/src/storage/abc/inverted-index.d.ts +118 -0
- package/dist/types/src/storage/abc/inverted-index.d.ts.map +1 -0
- package/dist/types/src/storage/block-max-index.d.ts +45 -0
- package/dist/types/src/storage/block-max-index.d.ts.map +1 -0
- package/dist/types/src/storage/btree-index.d.ts +18 -0
- package/dist/types/src/storage/btree-index.d.ts.map +1 -0
- package/dist/types/src/storage/catalog.d.ts +87 -0
- package/dist/types/src/storage/catalog.d.ts.map +1 -0
- package/dist/types/src/storage/document-store.d.ts +20 -0
- package/dist/types/src/storage/document-store.d.ts.map +1 -0
- package/dist/types/src/storage/index-abc.d.ts +16 -0
- package/dist/types/src/storage/index-abc.d.ts.map +1 -0
- package/dist/types/src/storage/index-manager.d.ts +19 -0
- package/dist/types/src/storage/index-manager.d.ts.map +1 -0
- package/dist/types/src/storage/index-types.d.ts +10 -0
- package/dist/types/src/storage/index-types.d.ts.map +1 -0
- package/dist/types/src/storage/inverted-index.d.ts +55 -0
- package/dist/types/src/storage/inverted-index.d.ts.map +1 -0
- package/dist/types/src/storage/ivf-index.d.ts +57 -0
- package/dist/types/src/storage/ivf-index.d.ts.map +1 -0
- package/dist/types/src/storage/managed-connection.d.ts +64 -0
- package/dist/types/src/storage/managed-connection.d.ts.map +1 -0
- package/dist/types/src/storage/spatial-index.d.ts +18 -0
- package/dist/types/src/storage/spatial-index.d.ts.map +1 -0
- package/dist/types/src/storage/sqlite-document-store.d.ts +54 -0
- package/dist/types/src/storage/sqlite-document-store.d.ts.map +1 -0
- package/dist/types/src/storage/sqlite-graph-store.d.ts +59 -0
- package/dist/types/src/storage/sqlite-graph-store.d.ts.map +1 -0
- package/dist/types/src/storage/sqlite-inverted-index.d.ts +75 -0
- package/dist/types/src/storage/sqlite-inverted-index.d.ts.map +1 -0
- package/dist/types/src/storage/transaction.d.ts +15 -0
- package/dist/types/src/storage/transaction.d.ts.map +1 -0
- package/dist/types/src/storage/vector-index.d.ts +23 -0
- package/dist/types/src/storage/vector-index.d.ts.map +1 -0
- package/dist/uqa.es.js +16156 -0
- package/dist/uqa.es.js.map +1 -0
- package/dist/uqa.umd.js +11 -0
- package/dist/uqa.umd.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uqa.umd.js","sources":["../src/core/posting-list.ts","../src/core/types.ts","../src/core/hierarchical.ts","../src/analysis/char-filter.ts","../src/analysis/token-filter.ts","../src/analysis/tokenizer.ts","../src/analysis/analyzer.ts","../src/storage/abc/document-store.ts","../src/storage/document-store.ts","../src/storage/abc/inverted-index.ts","../src/storage/inverted-index.ts","../src/math/linalg.ts","../src/storage/vector-index.ts","../src/storage/abc/graph-store.ts","../src/graph/store.ts","../src/scoring/bm25.ts","../src/scoring/bayesian-bm25.ts","../src/operators/base.ts","../src/storage/spatial-index.ts","../src/operators/primitive.ts","../src/operators/boolean.ts","../src/operators/calibrated-vector.ts","../src/scoring/fusion-wand.ts","../src/operators/hybrid.ts","../src/sql/fts-query.ts","../src/sql/expr-evaluator.ts","../src/sql/table.ts","../src/operators/sparse.ts","../src/operators/multi-stage.ts","../src/operators/multi-field.ts","../src/operators/progressive-fusion.ts","../src/operators/backend.ts","../src/operators/deep-fusion.ts","../src/operators/hierarchical.ts","../src/operators/attention.ts","../src/operators/learned-fusion.ts","../src/graph/posting-list.ts","../src/graph/pattern.ts","../src/graph/rpq-optimizer.ts","../src/graph/operators.ts","../src/graph/temporal-traverse.ts","../src/graph/temporal-filter.ts","../src/graph/centrality.ts","../src/graph/message-passing.ts","../src/graph/graph-embedding.ts","../src/scoring/external-prior.ts","../src/operators/deep-learn.ts","../src/fusion/attention.ts","../src/fusion/learned.ts","../src/fusion/query-features.ts","../src/planner/cardinality.ts","../src/operators/aggregation.ts","../src/graph/temporal-pattern-match.ts","../src/joins/cross-paradigm.ts","../src/planner/cost-model.ts","../src/planner/optimizer.ts","../src/planner/executor.ts","../src/sql/compiler.ts","../src/joins/base.ts","../src/joins/inner.ts","../src/api/query-builder.ts","../src/storage/transaction.ts","../src/graph/index.ts","../src/scoring/parameter-learner.ts","../src/engine.ts"],"sourcesContent":["//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- PostingList and GeneralizedPostingList\n// 1:1 port of uqa/core/posting_list.py\n\nimport type { DocId, GeneralizedPostingEntry, Payload, PostingEntry } from \"./types.js\";\n\n// -- Module-private helpers --------------------------------------------------\n\nfunction compareDocIdArrays(a: readonly DocId[], b: readonly DocId[]): number {\n const len = Math.min(a.length, b.length);\n for (let i = 0; i < len; i++) {\n if (a[i]! < b[i]!) return -1;\n if (a[i]! > b[i]!) return 1;\n }\n return a.length - b.length;\n}\n\nfunction docIdArraysEqual(a: readonly DocId[], b: readonly DocId[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nfunction docIdArrayKey(ids: readonly DocId[]): string {\n return ids.join(\"\\0\");\n}\n\n// -- PostingList -------------------------------------------------------------\n\nexport class PostingList {\n private _entries: PostingEntry[];\n private _docIdsCache: Set<DocId> | null = null;\n\n constructor(entries?: PostingEntry[]) {\n if (entries && entries.length > 0) {\n const sorted = entries.slice().sort((a, b) => a.docId - b.docId);\n // Deduplicate: keep first occurrence of each docId\n const deduped: PostingEntry[] = [sorted[0]!];\n const seen = new Set<DocId>([sorted[0]!.docId]);\n for (let i = 1; i < sorted.length; i++) {\n const entry = sorted[i]!;\n if (!seen.has(entry.docId)) {\n seen.add(entry.docId);\n deduped.push(entry);\n }\n }\n this._entries = deduped;\n } else {\n this._entries = [];\n }\n }\n\n static fromSorted(entries: PostingEntry[]): PostingList {\n const pl = Object.create(PostingList.prototype) as PostingList;\n pl._entries = entries;\n pl._docIdsCache = null;\n return pl;\n }\n\n // -- Boolean algebra operations --------------------------------------------\n\n union(other: PostingList): PostingList {\n const a = this._entries;\n const b = other._entries;\n const result: PostingEntry[] = [];\n let i = 0;\n let j = 0;\n while (i < a.length && j < b.length) {\n const ea = a[i]!;\n const eb = b[j]!;\n if (ea.docId === eb.docId) {\n result.push({\n docId: ea.docId,\n payload: PostingList.mergePayloads(ea.payload, eb.payload),\n });\n i++;\n j++;\n } else if (ea.docId < eb.docId) {\n result.push(ea);\n i++;\n } else {\n result.push(eb);\n j++;\n }\n }\n while (i < a.length) {\n result.push(a[i]!);\n i++;\n }\n while (j < b.length) {\n result.push(b[j]!);\n j++;\n }\n return PostingList.fromSorted(result);\n }\n\n intersect(other: PostingList): PostingList {\n const a = this._entries;\n const b = other._entries;\n const result: PostingEntry[] = [];\n let i = 0;\n let j = 0;\n while (i < a.length && j < b.length) {\n const ea = a[i]!;\n const eb = b[j]!;\n if (ea.docId === eb.docId) {\n result.push({\n docId: ea.docId,\n payload: PostingList.mergePayloads(ea.payload, eb.payload),\n });\n i++;\n j++;\n } else if (ea.docId < eb.docId) {\n i++;\n } else {\n j++;\n }\n }\n return PostingList.fromSorted(result);\n }\n\n difference(other: PostingList): PostingList {\n const otherIds = other.docIds;\n const result = this._entries.filter((e) => !otherIds.has(e.docId));\n return PostingList.fromSorted(result);\n }\n\n complement(universal: PostingList): PostingList {\n return universal.difference(this);\n }\n\n // -- Payload merge ---------------------------------------------------------\n\n static mergePayloads(a: Payload, b: Payload): Payload {\n const posSet = new Set([...a.positions, ...b.positions]);\n const positions = [...posSet].sort((x, y) => x - y);\n const score = a.score + b.score;\n const fields = { ...a.fields, ...b.fields };\n return { positions, score, fields };\n }\n\n // -- Accessors -------------------------------------------------------------\n\n get docIds(): Set<DocId> {\n if (this._docIdsCache === null) {\n this._docIdsCache = new Set(this._entries.map((e) => e.docId));\n }\n return this._docIdsCache;\n }\n\n get entries(): PostingEntry[] {\n return this._entries;\n }\n\n getEntry(docId: DocId): PostingEntry | null {\n let lo = 0;\n let hi = this._entries.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const midId = this._entries[mid]!.docId;\n if (midId === docId) return this._entries[mid]!;\n if (midId < docId) {\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return null;\n }\n\n topK(k: number): PostingList {\n if (k >= this._entries.length) {\n return PostingList.fromSorted(this._entries.slice());\n }\n const sorted = this._entries\n .slice()\n .sort((a, b) => b.payload.score - a.payload.score);\n const top = sorted.slice(0, k);\n return new PostingList(top);\n }\n\n withScores(scoreFn: (entry: PostingEntry) => number): PostingList {\n const result: PostingEntry[] = [];\n for (const e of this._entries) {\n const newScore = scoreFn(e);\n result.push({\n docId: e.docId,\n payload: {\n positions: e.payload.positions,\n score: newScore,\n fields: e.payload.fields,\n },\n });\n }\n return PostingList.fromSorted(result);\n }\n\n get length(): number {\n return this._entries.length;\n }\n\n [Symbol.iterator](): Iterator<PostingEntry> {\n return this._entries[Symbol.iterator]();\n }\n\n equals(other: PostingList): boolean {\n if (this._entries.length !== other._entries.length) return false;\n for (let i = 0; i < this._entries.length; i++) {\n if (this._entries[i]!.docId !== other._entries[i]!.docId) return false;\n }\n return true;\n }\n\n toString(): string {\n const ids = this._entries.map((e) => String(e.docId)).join(\", \");\n return `PostingList([${ids}])`;\n }\n\n // Convenience aliases (TS has no operator overloading)\n and(other: PostingList): PostingList {\n return this.intersect(other);\n }\n or(other: PostingList): PostingList {\n return this.union(other);\n }\n sub(other: PostingList): PostingList {\n return this.difference(other);\n }\n}\n\n// -- GeneralizedPostingList --------------------------------------------------\n\nexport class GeneralizedPostingList {\n private _entries: GeneralizedPostingEntry[];\n\n constructor(entries?: GeneralizedPostingEntry[]) {\n this._entries = (entries ?? [])\n .slice()\n .sort((a, b) => compareDocIdArrays(a.docIds, b.docIds));\n }\n\n static fromSorted(entries: GeneralizedPostingEntry[]): GeneralizedPostingList {\n const gpl = Object.create(\n GeneralizedPostingList.prototype,\n ) as GeneralizedPostingList;\n gpl._entries = entries;\n return gpl;\n }\n\n get entries(): GeneralizedPostingEntry[] {\n return this._entries.slice();\n }\n\n get length(): number {\n return this._entries.length;\n }\n\n [Symbol.iterator](): Iterator<GeneralizedPostingEntry> {\n return this._entries[Symbol.iterator]();\n }\n\n // -- Boolean algebra -------------------------------------------------------\n\n union(other: GeneralizedPostingList): GeneralizedPostingList {\n const a = this._entries;\n const b = other._entries;\n const result: GeneralizedPostingEntry[] = [];\n let i = 0;\n let j = 0;\n while (i < a.length && j < b.length) {\n const ea = a[i]!;\n const eb = b[j]!;\n const cmp = compareDocIdArrays(ea.docIds, eb.docIds);\n if (cmp === 0) {\n result.push(ea);\n i++;\n j++;\n } else if (cmp < 0) {\n result.push(ea);\n i++;\n } else {\n result.push(eb);\n j++;\n }\n }\n while (i < a.length) {\n result.push(a[i]!);\n i++;\n }\n while (j < b.length) {\n result.push(b[j]!);\n j++;\n }\n return GeneralizedPostingList.fromSorted(result);\n }\n\n intersect(other: GeneralizedPostingList): GeneralizedPostingList {\n const a = this._entries;\n const b = other._entries;\n const result: GeneralizedPostingEntry[] = [];\n let i = 0;\n let j = 0;\n while (i < a.length && j < b.length) {\n const ea = a[i]!;\n const eb = b[j]!;\n const cmp = compareDocIdArrays(ea.docIds, eb.docIds);\n if (cmp === 0) {\n result.push(ea);\n i++;\n j++;\n } else if (cmp < 0) {\n i++;\n } else {\n j++;\n }\n }\n return GeneralizedPostingList.fromSorted(result);\n }\n\n difference(other: GeneralizedPostingList): GeneralizedPostingList {\n const otherIds = other.docIdsSet;\n const result = this._entries.filter((e) => !otherIds.has(docIdArrayKey(e.docIds)));\n return GeneralizedPostingList.fromSorted(result);\n }\n\n complement(universal: GeneralizedPostingList): GeneralizedPostingList {\n return universal.difference(this);\n }\n\n get docIdsSet(): Set<string> {\n return new Set(this._entries.map((e) => docIdArrayKey(e.docIds)));\n }\n\n equals(other: GeneralizedPostingList): boolean {\n if (this._entries.length !== other._entries.length) return false;\n for (let i = 0; i < this._entries.length; i++) {\n if (!docIdArraysEqual(this._entries[i]!.docIds, other._entries[i]!.docIds)) {\n return false;\n }\n }\n return true;\n }\n\n toString(): string {\n const tuples = this._entries.map((e) => `(${e.docIds.join(\", \")})`).join(\", \");\n return `GeneralizedPostingList([${tuples}])`;\n }\n\n and(other: GeneralizedPostingList): GeneralizedPostingList {\n return this.intersect(other);\n }\n or(other: GeneralizedPostingList): GeneralizedPostingList {\n return this.union(other);\n }\n sub(other: GeneralizedPostingList): GeneralizedPostingList {\n return this.difference(other);\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- core type definitions\n// 1:1 port of uqa/core/types.py\n\n// -- Type aliases ------------------------------------------------------------\n\nexport type DocId = number;\nexport type FieldName = string;\nexport type TermValue = string;\nexport type PathExpr = ReadonlyArray<string | number>;\n\n// -- Frozen data interfaces --------------------------------------------------\n\nexport interface Payload {\n readonly positions: readonly number[];\n readonly score: number;\n readonly fields: Readonly<Record<FieldName, unknown>>;\n}\n\nexport interface PostingEntry {\n readonly docId: DocId;\n readonly payload: Payload;\n}\n\nexport interface GeneralizedPostingEntry {\n readonly docIds: readonly DocId[];\n readonly payload: Payload;\n}\n\nexport interface Vertex {\n readonly vertexId: number;\n readonly label: string;\n readonly properties: Readonly<Record<string, unknown>>;\n}\n\nexport interface Edge {\n readonly edgeId: number;\n readonly sourceId: number;\n readonly targetId: number;\n readonly label: string;\n readonly properties: Readonly<Record<string, unknown>>;\n}\n\n// -- Factory functions (replace Python dataclass defaults) --------------------\n\nexport function createPayload(\n opts?: Partial<Pick<Payload, \"positions\" | \"score\" | \"fields\">>,\n): Payload {\n return {\n positions: opts?.positions ?? [],\n score: opts?.score ?? 0.0,\n fields: opts?.fields ?? {},\n };\n}\n\nexport function createPostingEntry(\n docId: DocId,\n payload?: Partial<Pick<Payload, \"positions\" | \"score\" | \"fields\">>,\n): PostingEntry {\n return { docId, payload: createPayload(payload) };\n}\n\nexport function createGeneralizedPostingEntry(\n docIds: readonly DocId[],\n payload?: Partial<Pick<Payload, \"positions\" | \"score\" | \"fields\">>,\n): GeneralizedPostingEntry {\n return { docIds, payload: createPayload(payload) };\n}\n\nexport function createVertex(\n vertexId: number,\n label: string,\n properties?: Record<string, unknown>,\n): Vertex {\n return { vertexId, label, properties: properties ?? {} };\n}\n\nexport function createEdge(\n edgeId: number,\n sourceId: number,\n targetId: number,\n label: string,\n properties?: Record<string, unknown>,\n): Edge {\n return { edgeId, sourceId, targetId, label, properties: properties ?? {} };\n}\n\n// -- IndexStats (mutable) ----------------------------------------------------\n\nexport class IndexStats {\n totalDocs: number;\n avgDocLength: number;\n dimensions: number;\n private readonly _docFreqs: Map<string, number>;\n\n constructor(totalDocs = 0, avgDocLength = 0.0, dimensions = 0) {\n this.totalDocs = totalDocs;\n this.avgDocLength = avgDocLength;\n this.dimensions = dimensions;\n this._docFreqs = new Map();\n }\n\n docFreq(field: string, term: string): number {\n return this._docFreqs.get(`${field}\\0${term}`) ?? 0;\n }\n\n setDocFreq(field: string, term: string, freq: number): void {\n this._docFreqs.set(`${field}\\0${term}`, freq);\n }\n}\n\n// -- Predicate system --------------------------------------------------------\n\nexport abstract class Predicate {\n abstract evaluate(value: unknown): boolean;\n}\n\nexport class Equals extends Predicate {\n constructor(readonly target: unknown) {\n super();\n }\n evaluate(value: unknown): boolean {\n return value === this.target;\n }\n}\n\nexport class NotEquals extends Predicate {\n constructor(readonly target: unknown) {\n super();\n }\n evaluate(value: unknown): boolean {\n return value !== this.target;\n }\n}\n\nexport class GreaterThan extends Predicate {\n constructor(readonly target: number) {\n super();\n }\n evaluate(value: unknown): boolean {\n return (value as number) > this.target;\n }\n}\n\nexport class GreaterThanOrEqual extends Predicate {\n constructor(readonly target: number) {\n super();\n }\n evaluate(value: unknown): boolean {\n return (value as number) >= this.target;\n }\n}\n\nexport class LessThan extends Predicate {\n constructor(readonly target: number) {\n super();\n }\n evaluate(value: unknown): boolean {\n return (value as number) < this.target;\n }\n}\n\nexport class LessThanOrEqual extends Predicate {\n constructor(readonly target: number) {\n super();\n }\n evaluate(value: unknown): boolean {\n return (value as number) <= this.target;\n }\n}\n\nexport class InSet extends Predicate {\n private readonly _values: Set<unknown>;\n constructor(values: Iterable<unknown>) {\n super();\n this._values = new Set(values);\n }\n get values(): ReadonlySet<unknown> {\n return this._values;\n }\n evaluate(value: unknown): boolean {\n return this._values.has(value);\n }\n}\n\nexport class Between extends Predicate {\n constructor(\n readonly low: number,\n readonly high: number,\n ) {\n super();\n }\n evaluate(value: unknown): boolean {\n const v = value as number;\n return v >= this.low && v <= this.high;\n }\n}\n\nexport class IsNull extends Predicate {\n evaluate(value: unknown): boolean {\n return value === null || value === undefined;\n }\n}\n\nexport class IsNotNull extends Predicate {\n evaluate(value: unknown): boolean {\n return value !== null && value !== undefined;\n }\n}\n\n// -- LIKE predicates with regex cache ----------------------------------------\n\nconst likeRegexCache = new Map<string, RegExp>();\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction compileLikeRegex(pattern: string, caseSensitive: boolean): RegExp {\n const key = `${caseSensitive ? \"s\" : \"i\"}:${pattern}`;\n const cached = likeRegexCache.get(key);\n if (cached !== undefined) return cached;\n\n // Evict oldest if cache exceeds 256 entries\n if (likeRegexCache.size >= 256) {\n const firstKey = likeRegexCache.keys().next().value as string;\n likeRegexCache.delete(firstKey);\n }\n\n let regex = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i]!;\n if (ch === \"%\") {\n regex += \".*\";\n } else if (ch === \"_\") {\n regex += \".\";\n } else if (ch === \"\\\\\" && i + 1 < pattern.length) {\n i++;\n regex += escapeRegex(pattern[i]!);\n } else {\n regex += escapeRegex(ch);\n }\n }\n regex += \"$\";\n\n const flags = caseSensitive ? \"s\" : \"is\";\n const compiled = new RegExp(regex, flags);\n likeRegexCache.set(key, compiled);\n return compiled;\n}\n\nfunction likeMatch(value: string, pattern: string, caseSensitive: boolean): boolean {\n return compileLikeRegex(pattern, caseSensitive).test(value);\n}\n\nexport class Like extends Predicate {\n constructor(readonly pattern: string) {\n super();\n }\n evaluate(value: unknown): boolean {\n return likeMatch(String(value), this.pattern, true);\n }\n}\n\nexport class NotLike extends Predicate {\n constructor(readonly pattern: string) {\n super();\n }\n evaluate(value: unknown): boolean {\n return !likeMatch(String(value), this.pattern, true);\n }\n}\n\nexport class ILike extends Predicate {\n constructor(readonly pattern: string) {\n super();\n }\n evaluate(value: unknown): boolean {\n return likeMatch(String(value), this.pattern, false);\n }\n}\n\nexport class NotILike extends Predicate {\n constructor(readonly pattern: string) {\n super();\n }\n evaluate(value: unknown): boolean {\n return !likeMatch(String(value), this.pattern, false);\n }\n}\n\n// -- Helper ------------------------------------------------------------------\n\nexport function isNullPredicate(pred: Predicate): boolean {\n return pred instanceof IsNull || pred instanceof IsNotNull;\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- HierarchicalDocument\n// 1:1 port of uqa/core/hierarchical.py\n\nimport type { PathExpr } from \"./types.js\";\n\nexport class HierarchicalDocument {\n readonly docId: number;\n readonly data: unknown;\n\n constructor(docId: number, data: unknown) {\n this.docId = docId;\n this.data = data;\n }\n\n /**\n * Evaluate a path expression against this document's data.\n * Uses the same implicit array wildcard logic as MemoryDocumentStore:\n * when the current value is an array and the path component is a string,\n * map over array elements to extract the named field from each.\n */\n evalPath(path: PathExpr): unknown {\n let current: unknown = this.data;\n for (const component of path) {\n if (current === null || current === undefined) return undefined;\n if (typeof component === \"number\") {\n if (!Array.isArray(current)) return undefined;\n current = (current as unknown[])[component];\n } else {\n // Implicit array wildcard\n if (Array.isArray(current)) {\n current = (current as unknown[]).map(\n (item) => (item as Record<string, unknown>)[component],\n );\n } else if (typeof current === \"object\") {\n current = (current as Record<string, unknown>)[component];\n } else {\n return undefined;\n }\n }\n }\n return current;\n }\n}\n\n/**\n * Project a set of path expressions against a HierarchicalDocument,\n * returning a flat record keyed by the string representation of each path.\n */\nexport function projectPaths(\n doc: HierarchicalDocument,\n paths: PathExpr[],\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const path of paths) {\n const key = path.map((c) => String(c)).join(\".\");\n result[key] = doc.evalPath(path);\n }\n return result;\n}\n\n/**\n * Unnest an array field at the given path, producing one HierarchicalDocument\n * per element. Each child document shares the same docId as the parent.\n */\nexport function unnestArray(\n doc: HierarchicalDocument,\n path: PathExpr,\n): HierarchicalDocument[] {\n const arr = doc.evalPath(path);\n if (!Array.isArray(arr)) return [];\n const results: HierarchicalDocument[] = [];\n for (const element of arr) {\n results.push(new HierarchicalDocument(doc.docId, element));\n }\n return results;\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- character filters\n// 1:1 port of uqa/analysis/char_filter.py\n\nexport abstract class CharFilter {\n abstract filter(text: string): string;\n abstract toDict(): Record<string, unknown>;\n\n static fromDict(d: Record<string, unknown>): CharFilter {\n const type = d[\"type\"] as string;\n switch (type) {\n case \"html_strip\":\n return HTMLStripCharFilter._fromDict(d);\n case \"mapping\":\n return MappingCharFilter._fromDict(d);\n case \"pattern_replace\":\n return PatternReplaceCharFilter._fromDict(d);\n default:\n throw new Error(`Unknown CharFilter type: ${type}`);\n }\n }\n}\n\n// -- HTMLStripCharFilter ------------------------------------------------------\n\nconst HTML_TAG_RE = /<[^>]+>/g;\nconst HTML_ENTITIES: Record<string, string> = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n \""\": '\"',\n \"'\": \"'\",\n \"'\": \"'\",\n \" \": \" \",\n};\n\nexport class HTMLStripCharFilter extends CharFilter {\n filter(text: string): string {\n let result = text.replace(HTML_TAG_RE, \" \");\n for (const [entity, char] of Object.entries(HTML_ENTITIES)) {\n result = result.replaceAll(entity, char);\n }\n return result;\n }\n\n toDict(): Record<string, unknown> {\n return { type: \"html_strip\" };\n }\n\n static _fromDict(_d: Record<string, unknown>): HTMLStripCharFilter {\n return new HTMLStripCharFilter();\n }\n}\n\n// -- MappingCharFilter --------------------------------------------------------\n\nexport class MappingCharFilter extends CharFilter {\n private readonly _mapping: [string, string][];\n\n constructor(mapping: Record<string, string>) {\n super();\n // Sort by key length descending (longest-match-first)\n this._mapping = Object.entries(mapping).sort((a, b) => b[0].length - a[0].length);\n }\n\n filter(text: string): string {\n let result = text;\n for (const [key, value] of this._mapping) {\n result = result.replaceAll(key, value);\n }\n return result;\n }\n\n toDict(): Record<string, unknown> {\n const mapping: Record<string, string> = {};\n for (const [k, v] of this._mapping) {\n mapping[k] = v;\n }\n return { type: \"mapping\", mapping };\n }\n\n static _fromDict(d: Record<string, unknown>): MappingCharFilter {\n return new MappingCharFilter(d[\"mapping\"] as Record<string, string>);\n }\n}\n\n// -- PatternReplaceCharFilter -------------------------------------------------\n\nexport class PatternReplaceCharFilter extends CharFilter {\n private readonly _pattern: string;\n private readonly _replacement: string;\n private readonly _re: RegExp;\n\n constructor(pattern: string, replacement = \"\") {\n super();\n this._pattern = pattern;\n this._replacement = replacement;\n this._re = new RegExp(pattern, \"g\");\n }\n\n filter(text: string): string {\n return text.replace(this._re, this._replacement);\n }\n\n toDict(): Record<string, unknown> {\n return {\n type: \"pattern_replace\",\n pattern: this._pattern,\n replacement: this._replacement,\n };\n }\n\n static _fromDict(d: Record<string, unknown>): PatternReplaceCharFilter {\n return new PatternReplaceCharFilter(\n d[\"pattern\"] as string,\n (d[\"replacement\"] as string | undefined) ?? \"\",\n );\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- token filters\n// 1:1 port of uqa/analysis/token_filter.py\n\n// -- Abstract base ------------------------------------------------------------\n\nexport abstract class TokenFilter {\n abstract filter(tokens: string[]): string[];\n abstract toDict(): Record<string, unknown>;\n\n static fromDict(d: Record<string, unknown>): TokenFilter {\n const type = d[\"type\"] as string;\n switch (type) {\n case \"lowercase\":\n return LowerCaseFilter._fromDict(d);\n case \"stop\":\n return StopWordFilter._fromDict(d);\n case \"porter_stem\":\n return PorterStemFilter._fromDict(d);\n case \"ascii_folding\":\n return ASCIIFoldingFilter._fromDict(d);\n case \"synonym\":\n return SynonymFilter._fromDict(d);\n case \"ngram\":\n return NGramFilter._fromDict(d);\n case \"edge_ngram\":\n return EdgeNGramFilter._fromDict(d);\n case \"length\":\n return LengthFilter._fromDict(d);\n default:\n throw new Error(`Unknown TokenFilter type: ${type}`);\n }\n }\n}\n\n// -- LowerCaseFilter ----------------------------------------------------------\n\nexport class LowerCaseFilter extends TokenFilter {\n filter(tokens: string[]): string[] {\n return tokens.map((t) => t.toLowerCase());\n }\n\n toDict(): Record<string, unknown> {\n return { type: \"lowercase\" };\n }\n\n static _fromDict(_d: Record<string, unknown>): LowerCaseFilter {\n return new LowerCaseFilter();\n }\n}\n\n// -- StopWordFilter -----------------------------------------------------------\n\nconst STOP_WORDS: Record<string, Set<string>> = {\n english: new Set([\n \"a\",\n \"an\",\n \"and\",\n \"are\",\n \"as\",\n \"at\",\n \"be\",\n \"but\",\n \"by\",\n \"can\",\n \"could\",\n \"did\",\n \"do\",\n \"does\",\n \"for\",\n \"had\",\n \"has\",\n \"have\",\n \"he\",\n \"her\",\n \"him\",\n \"his\",\n \"how\",\n \"i\",\n \"if\",\n \"in\",\n \"into\",\n \"is\",\n \"it\",\n \"its\",\n \"may\",\n \"me\",\n \"my\",\n \"no\",\n \"nor\",\n \"not\",\n \"of\",\n \"on\",\n \"or\",\n \"our\",\n \"own\",\n \"she\",\n \"should\",\n \"so\",\n \"some\",\n \"such\",\n \"than\",\n \"that\",\n \"the\",\n \"their\",\n \"then\",\n \"there\",\n \"these\",\n \"they\",\n \"this\",\n \"to\",\n \"too\",\n \"us\",\n \"very\",\n \"was\",\n \"we\",\n \"were\",\n \"what\",\n \"when\",\n \"which\",\n \"who\",\n \"whom\",\n \"why\",\n \"will\",\n \"with\",\n \"would\",\n \"you\",\n \"your\",\n ]),\n};\n\nexport class StopWordFilter extends TokenFilter {\n private readonly _language: string;\n private readonly _customWords: Set<string>;\n private readonly _words: Set<string>;\n\n constructor(language = \"english\", customWords?: Set<string> | null) {\n super();\n this._language = language;\n this._customWords = customWords ?? new Set();\n const base = STOP_WORDS[language] ?? new Set<string>();\n this._words = new Set([...base, ...this._customWords]);\n }\n\n filter(tokens: string[]): string[] {\n return tokens.filter((t) => !this._words.has(t));\n }\n\n toDict(): Record<string, unknown> {\n const d: Record<string, unknown> = { type: \"stop\", language: this._language };\n if (this._customWords.size > 0) {\n d[\"custom_words\"] = [...this._customWords].sort();\n }\n return d;\n }\n\n static _fromDict(d: Record<string, unknown>): StopWordFilter {\n const custom = d[\"custom_words\"] ? new Set(d[\"custom_words\"] as string[]) : null;\n return new StopWordFilter(\n (d[\"language\"] as string | undefined) ?? \"english\",\n custom,\n );\n }\n}\n\n// -- PorterStemFilter ---------------------------------------------------------\n\nfunction isConsonant(w: string, i: number): boolean {\n const ch = w[i]!;\n if (ch === \"a\" || ch === \"e\" || ch === \"i\" || ch === \"o\" || ch === \"u\") {\n return false;\n }\n if (ch === \"y\") {\n return i === 0 || !isConsonant(w, i - 1);\n }\n return true;\n}\n\nfunction measure(w: string, j: number): number {\n let n = 0;\n let i = 0;\n // Skip initial consonants\n while (i <= j && isConsonant(w, i)) i++;\n while (i <= j) {\n // Count vowels\n while (i <= j && !isConsonant(w, i)) i++;\n n++;\n // Count consonants\n while (i <= j && isConsonant(w, i)) i++;\n }\n return n;\n}\n\nfunction vowelInStem(w: string, j: number): boolean {\n for (let i = 0; i <= j; i++) {\n if (!isConsonant(w, i)) return true;\n }\n return false;\n}\n\nfunction doubleConsonant(w: string, j: number): boolean {\n if (j < 1) return false;\n return w[j] === w[j - 1] && isConsonant(w, j);\n}\n\nfunction cvc(w: string, i: number): boolean {\n if (i < 2) return false;\n if (!isConsonant(w, i - 2) || isConsonant(w, i - 1) || !isConsonant(w, i)) {\n return false;\n }\n const ch = w[i]!;\n return ch !== \"w\" && ch !== \"x\" && ch !== \"y\";\n}\n\nfunction porterStem(word: string): string {\n if (word.length <= 2) return word;\n\n let w = word;\n\n // Step 1a\n if (w.endsWith(\"sses\")) {\n w = w.slice(0, -2);\n } else if (w.endsWith(\"ies\")) {\n w = w.slice(0, -2);\n } else if (!w.endsWith(\"ss\") && w.endsWith(\"s\")) {\n w = w.slice(0, -1);\n }\n\n // Step 1b\n if (w.endsWith(\"eed\")) {\n const stem = w.slice(0, -3);\n if (measure(w, stem.length - 1) > 0) {\n w = w.slice(0, -1); // remove \"d\" -> \"ee\"\n }\n } else {\n let found = false;\n let stemLen = 0;\n if (w.endsWith(\"ed\")) {\n stemLen = w.length - 2;\n found = vowelInStem(w, stemLen - 1);\n } else if (w.endsWith(\"ing\")) {\n stemLen = w.length - 3;\n found = vowelInStem(w, stemLen - 1);\n }\n if (found) {\n w = w.slice(0, stemLen);\n if (w.endsWith(\"at\") || w.endsWith(\"bl\") || w.endsWith(\"iz\")) {\n w = w + \"e\";\n } else if (\n doubleConsonant(w, w.length - 1) &&\n w[w.length - 1] !== \"l\" &&\n w[w.length - 1] !== \"s\" &&\n w[w.length - 1] !== \"z\"\n ) {\n w = w.slice(0, -1);\n } else if (measure(w, w.length - 1) === 1 && cvc(w, w.length - 1)) {\n w = w + \"e\";\n }\n }\n }\n\n // Step 1c\n if (w.endsWith(\"y\") && vowelInStem(w, w.length - 2)) {\n w = w.slice(0, -1) + \"i\";\n }\n\n // Step 2\n const step2: [string, string][] = [\n [\"ational\", \"ate\"],\n [\"tional\", \"tion\"],\n [\"enci\", \"ence\"],\n [\"anci\", \"ance\"],\n [\"izer\", \"ize\"],\n [\"abli\", \"able\"],\n [\"alli\", \"al\"],\n [\"entli\", \"ent\"],\n [\"eli\", \"e\"],\n [\"ousli\", \"ous\"],\n [\"ization\", \"ize\"],\n [\"ation\", \"ate\"],\n [\"ator\", \"ate\"],\n [\"alism\", \"al\"],\n [\"iveness\", \"ive\"],\n [\"fulness\", \"ful\"],\n [\"ousness\", \"ous\"],\n [\"aliti\", \"al\"],\n [\"iviti\", \"ive\"],\n [\"biliti\", \"ble\"],\n ];\n for (const [suffix, replacement] of step2) {\n if (w.endsWith(suffix)) {\n const stem = w.slice(0, -suffix.length);\n if (measure(w, stem.length - 1) > 0) {\n w = stem + replacement;\n }\n break;\n }\n }\n\n // Step 3\n const step3: [string, string][] = [\n [\"icate\", \"ic\"],\n [\"ative\", \"\"],\n [\"alize\", \"al\"],\n [\"iciti\", \"ic\"],\n [\"ical\", \"ic\"],\n [\"ful\", \"\"],\n [\"ness\", \"\"],\n ];\n for (const [suffix, replacement] of step3) {\n if (w.endsWith(suffix)) {\n const stem = w.slice(0, -suffix.length);\n if (measure(w, stem.length - 1) > 0) {\n w = stem + replacement;\n }\n break;\n }\n }\n\n // Step 4\n const step4suffixes = [\n \"al\",\n \"ance\",\n \"ence\",\n \"er\",\n \"ic\",\n \"able\",\n \"ible\",\n \"ant\",\n \"ement\",\n \"ment\",\n \"ent\",\n \"ion\",\n \"ou\",\n \"ism\",\n \"ate\",\n \"iti\",\n \"ous\",\n \"ive\",\n \"ize\",\n ];\n for (const suffix of step4suffixes) {\n if (w.endsWith(suffix)) {\n const stem = w.slice(0, -suffix.length);\n if (measure(w, stem.length - 1) > 1) {\n if (suffix === \"ion\") {\n const lastChar = stem[stem.length - 1];\n if (lastChar === \"s\" || lastChar === \"t\") {\n w = stem;\n }\n } else {\n w = stem;\n }\n }\n break;\n }\n }\n\n // Step 5a\n if (w.endsWith(\"e\")) {\n const stem = w.slice(0, -1);\n const m = measure(w, stem.length - 1);\n if (m > 1 || (m === 1 && !cvc(w, stem.length - 1))) {\n w = stem;\n }\n }\n\n // Step 5b\n if (\n measure(w, w.length - 1) > 1 &&\n doubleConsonant(w, w.length - 1) &&\n w[w.length - 1] === \"l\"\n ) {\n w = w.slice(0, -1);\n }\n\n return w;\n}\n\nexport class PorterStemFilter extends TokenFilter {\n filter(tokens: string[]): string[] {\n return tokens.map((t) => porterStem(t));\n }\n\n toDict(): Record<string, unknown> {\n return { type: \"porter_stem\" };\n }\n\n static _fromDict(_d: Record<string, unknown>): PorterStemFilter {\n return new PorterStemFilter();\n }\n}\n\n// -- ASCIIFoldingFilter -------------------------------------------------------\n\nfunction isASCII(s: string): boolean {\n for (let i = 0; i < s.length; i++) {\n if (s.charCodeAt(i) > 127) return false;\n }\n return true;\n}\n\nfunction foldChar(ch: string): string {\n if (ch.charCodeAt(0) <= 127) return ch;\n // NFKD normalize then strip non-ASCII\n const normalized = ch.normalize(\"NFKD\");\n let result = \"\";\n for (let i = 0; i < normalized.length; i++) {\n if (normalized.charCodeAt(i) <= 127) {\n result += normalized.charAt(i);\n }\n }\n return result.length > 0 ? result : ch;\n}\n\nexport class ASCIIFoldingFilter extends TokenFilter {\n filter(tokens: string[]): string[] {\n return tokens.map((t) => ASCIIFoldingFilter._fold(t));\n }\n\n private static _fold(token: string): string {\n if (isASCII(token)) return token;\n let result = \"\";\n for (let i = 0; i < token.length; i++) {\n result += foldChar(token[i]!);\n }\n return result;\n }\n\n toDict(): Record<string, unknown> {\n return { type: \"ascii_folding\" };\n }\n\n static _fromDict(_d: Record<string, unknown>): ASCIIFoldingFilter {\n return new ASCIIFoldingFilter();\n }\n}\n\n// -- parseSynonymText ---------------------------------------------------------\n\n/**\n * Parse a Solr/Elasticsearch-format synonym definition string.\n *\n * Supported formats (one rule per line):\n * Explicit mapping: car => automobile, vehicle\n * Equivalent synonyms: car, automobile, vehicle\n *\n * Lines starting with '#' are comments. Blank lines are skipped.\n */\nexport function parseSynonymText(text: string): Record<string, string[]> {\n const synonyms: Record<string, string[]> = {};\n for (const rawLine of text.split(\"\\n\")) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n\n if (line.includes(\"=>\")) {\n const [lhs, rhs] = line.split(\"=>\", 2);\n const key = lhs!.trim();\n const values = rhs!\n .split(\",\")\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n if (key && values.length > 0) {\n const existing = synonyms[key] ?? [];\n existing.push(...values);\n synonyms[key] = existing;\n }\n } else {\n const terms = line\n .split(\",\")\n .map((t) => t.trim())\n .filter((t) => t.length > 0);\n if (terms.length < 2) continue;\n for (const term of terms) {\n const others = terms.filter((t) => t !== term);\n const existing = synonyms[term] ?? [];\n existing.push(...others);\n synonyms[term] = existing;\n }\n }\n }\n\n // Deduplicate values while preserving order\n for (const key of Object.keys(synonyms)) {\n const seen = new Set<string>();\n const deduped: string[] = [];\n for (const v of synonyms[key]!) {\n if (!seen.has(v)) {\n seen.add(v);\n deduped.push(v);\n }\n }\n synonyms[key] = deduped;\n }\n\n return synonyms;\n}\n\n// -- SynonymFilter ------------------------------------------------------------\n\nexport class SynonymFilter extends TokenFilter {\n private readonly _synonyms: Record<string, string[]>;\n\n constructor(synonyms: Record<string, string[]>) {\n super();\n this._synonyms = synonyms;\n }\n\n filter(tokens: string[]): string[] {\n const result: string[] = [];\n for (const token of tokens) {\n result.push(token);\n const syns = this._synonyms[token];\n if (syns) {\n result.push(...syns);\n }\n }\n return result;\n }\n\n toDict(): Record<string, unknown> {\n return { type: \"synonym\", synonyms: this._synonyms };\n }\n\n static _fromDict(d: Record<string, unknown>): SynonymFilter {\n return new SynonymFilter(d[\"synonyms\"] as Record<string, string[]>);\n }\n}\n\n// -- NGramFilter --------------------------------------------------------------\n\nexport class NGramFilter extends TokenFilter {\n private readonly _minGram: number;\n private readonly _maxGram: number;\n private readonly _keepShort: boolean;\n\n constructor(minGram = 2, maxGram = 3, keepShort = false) {\n super();\n if (minGram < 1) throw new Error(\"minGram must be >= 1\");\n if (maxGram < minGram) throw new Error(\"maxGram must be >= minGram\");\n this._minGram = minGram;\n this._maxGram = maxGram;\n this._keepShort = keepShort;\n }\n\n filter(tokens: string[]): string[] {\n const result: string[] = [];\n for (const token of tokens) {\n if (token.length < this._minGram) {\n if (this._keepShort) result.push(token);\n continue;\n }\n for (let n = this._minGram; n <= this._maxGram; n++) {\n for (let i = 0; i <= token.length - n; i++) {\n result.push(token.substring(i, i + n));\n }\n }\n }\n return result;\n }\n\n toDict(): Record<string, unknown> {\n const d: Record<string, unknown> = {\n type: \"ngram\",\n min_gram: this._minGram,\n max_gram: this._maxGram,\n };\n if (this._keepShort) d[\"keep_short\"] = true;\n return d;\n }\n\n static _fromDict(d: Record<string, unknown>): NGramFilter {\n return new NGramFilter(\n d[\"min_gram\"] as number,\n d[\"max_gram\"] as number,\n (d[\"keep_short\"] as boolean | undefined) ?? false,\n );\n }\n}\n\n// -- EdgeNGramFilter ----------------------------------------------------------\n\nexport class EdgeNGramFilter extends TokenFilter {\n private readonly _minGram: number;\n private readonly _maxGram: number;\n\n constructor(minGram = 1, maxGram = 20) {\n super();\n this._minGram = minGram;\n this._maxGram = maxGram;\n }\n\n filter(tokens: string[]): string[] {\n const result: string[] = [];\n for (const token of tokens) {\n const upper = Math.min(this._maxGram, token.length);\n for (let n = this._minGram; n <= upper; n++) {\n result.push(token.substring(0, n));\n }\n }\n return result;\n }\n\n toDict(): Record<string, unknown> {\n return {\n type: \"edge_ngram\",\n min_gram: this._minGram,\n max_gram: this._maxGram,\n };\n }\n\n static _fromDict(d: Record<string, unknown>): EdgeNGramFilter {\n return new EdgeNGramFilter(d[\"min_gram\"] as number, d[\"max_gram\"] as number);\n }\n}\n\n// -- LengthFilter -------------------------------------------------------------\n\nexport class LengthFilter extends TokenFilter {\n private readonly _minLength: number;\n private readonly _maxLength: number;\n\n constructor(minLength = 0, maxLength = 0) {\n super();\n this._minLength = minLength;\n this._maxLength = maxLength;\n }\n\n filter(tokens: string[]): string[] {\n return tokens.filter((t) => {\n if (t.length < this._minLength) return false;\n if (this._maxLength > 0 && t.length > this._maxLength) return false;\n return true;\n });\n }\n\n toDict(): Record<string, unknown> {\n return {\n type: \"length\",\n min_length: this._minLength,\n max_length: this._maxLength,\n };\n }\n\n static _fromDict(d: Record<string, unknown>): LengthFilter {\n return new LengthFilter(d[\"min_length\"] as number, d[\"max_length\"] as number);\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- tokenizers\n// 1:1 port of uqa/analysis/tokenizer.py\n\nexport abstract class Tokenizer {\n abstract tokenize(text: string): string[];\n abstract toDict(): Record<string, unknown>;\n\n static fromDict(d: Record<string, unknown>): Tokenizer {\n const type = d[\"type\"] as string;\n switch (type) {\n case \"whitespace\":\n return WhitespaceTokenizer._fromDict(d);\n case \"standard\":\n return StandardTokenizer._fromDict(d);\n case \"letter\":\n return LetterTokenizer._fromDict(d);\n case \"ngram\":\n return NGramTokenizer._fromDict(d);\n case \"pattern\":\n return PatternTokenizer._fromDict(d);\n case \"keyword\":\n return KeywordTokenizer._fromDict(d);\n default:\n throw new Error(`Unknown Tokenizer type: ${type}`);\n }\n }\n}\n\n// -- WhitespaceTokenizer ------------------------------------------------------\n\nexport class WhitespaceTokenizer extends Tokenizer {\n tokenize(text: string): string[] {\n return text.split(/\\s+/).filter((t) => t.length > 0);\n }\n\n toDict(): Record<string, unknown> {\n return { type: \"whitespace\" };\n }\n\n static _fromDict(_d: Record<string, unknown>): WhitespaceTokenizer {\n return new WhitespaceTokenizer();\n }\n}\n\n// -- StandardTokenizer --------------------------------------------------------\n\nconst WORD_RE = /\\w+/gu;\n\nexport class StandardTokenizer extends Tokenizer {\n tokenize(text: string): string[] {\n return [...text.matchAll(WORD_RE)].map((m) => m[0]);\n }\n\n toDict(): Record<string, unknown> {\n return { type: \"standard\" };\n }\n\n static _fromDict(_d: Record<string, unknown>): StandardTokenizer {\n return new StandardTokenizer();\n }\n}\n\n// -- LetterTokenizer ----------------------------------------------------------\n\nconst LETTER_RE = /[a-zA-Z]+/g;\n\nexport class LetterTokenizer extends Tokenizer {\n tokenize(text: string): string[] {\n return [...text.matchAll(LETTER_RE)].map((m) => m[0]);\n }\n\n toDict(): Record<string, unknown> {\n return { type: \"letter\" };\n }\n\n static _fromDict(_d: Record<string, unknown>): LetterTokenizer {\n return new LetterTokenizer();\n }\n}\n\n// -- NGramTokenizer -----------------------------------------------------------\n\nexport class NGramTokenizer extends Tokenizer {\n private readonly _minGram: number;\n private readonly _maxGram: number;\n\n constructor(minGram = 1, maxGram = 2) {\n super();\n if (minGram < 1) throw new Error(\"minGram must be >= 1\");\n if (maxGram < minGram) throw new Error(\"maxGram must be >= minGram\");\n this._minGram = minGram;\n this._maxGram = maxGram;\n }\n\n tokenize(text: string): string[] {\n const words = text.split(/\\s+/).filter((w) => w.length > 0);\n const result: string[] = [];\n for (const word of words) {\n for (let n = this._minGram; n <= this._maxGram; n++) {\n for (let i = 0; i <= word.length - n; i++) {\n result.push(word.substring(i, i + n));\n }\n }\n }\n return result;\n }\n\n toDict(): Record<string, unknown> {\n return { type: \"ngram\", min_gram: this._minGram, max_gram: this._maxGram };\n }\n\n static _fromDict(d: Record<string, unknown>): NGramTokenizer {\n return new NGramTokenizer(d[\"min_gram\"] as number, d[\"max_gram\"] as number);\n }\n}\n\n// -- PatternTokenizer ---------------------------------------------------------\n\nexport class PatternTokenizer extends Tokenizer {\n private readonly _pattern: string;\n private readonly _re: RegExp;\n\n constructor(pattern = \"\\\\W+\") {\n super();\n this._pattern = pattern;\n this._re = new RegExp(pattern);\n }\n\n tokenize(text: string): string[] {\n return text.split(this._re).filter((t) => t.length > 0);\n }\n\n toDict(): Record<string, unknown> {\n return { type: \"pattern\", pattern: this._pattern };\n }\n\n static _fromDict(d: Record<string, unknown>): PatternTokenizer {\n return new PatternTokenizer(d[\"pattern\"] as string);\n }\n}\n\n// -- KeywordTokenizer ---------------------------------------------------------\n\nexport class KeywordTokenizer extends Tokenizer {\n tokenize(text: string): string[] {\n return text.length > 0 ? [text] : [];\n }\n\n toDict(): Record<string, unknown> {\n return { type: \"keyword\" };\n }\n\n static _fromDict(_d: Record<string, unknown>): KeywordTokenizer {\n return new KeywordTokenizer();\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Analyzer pipeline\n// 1:1 port of uqa/analysis/analyzer.py\n\nimport type { CharFilter } from \"./char-filter.js\";\nimport { CharFilter as CharFilterBase } from \"./char-filter.js\";\nimport type { TokenFilter } from \"./token-filter.js\";\nimport {\n ASCIIFoldingFilter,\n LowerCaseFilter,\n NGramFilter,\n PorterStemFilter,\n StopWordFilter,\n TokenFilter as TokenFilterBase,\n} from \"./token-filter.js\";\nimport type { Tokenizer } from \"./tokenizer.js\";\nimport {\n KeywordTokenizer,\n StandardTokenizer,\n Tokenizer as TokenizerBase,\n WhitespaceTokenizer,\n} from \"./tokenizer.js\";\n\nexport class Analyzer {\n private readonly _tokenizer: Tokenizer;\n private readonly _tokenFilters: TokenFilter[];\n private readonly _charFilters: CharFilter[];\n\n constructor(\n tokenizer?: Tokenizer | null,\n tokenFilters?: TokenFilter[] | null,\n charFilters?: CharFilter[] | null,\n ) {\n this._tokenizer = tokenizer ?? new WhitespaceTokenizer();\n this._tokenFilters = tokenFilters ?? [];\n this._charFilters = charFilters ?? [];\n }\n\n get tokenizer(): Tokenizer {\n return this._tokenizer;\n }\n\n get tokenFilters(): TokenFilter[] {\n return this._tokenFilters;\n }\n\n get charFilters(): CharFilter[] {\n return this._charFilters;\n }\n\n analyze(text: string): string[] {\n // Pipeline: char_filters -> tokenizer -> token_filters\n let processed = text;\n for (const cf of this._charFilters) {\n processed = cf.filter(processed);\n }\n let tokens = this._tokenizer.tokenize(processed);\n for (const tf of this._tokenFilters) {\n tokens = tf.filter(tokens);\n }\n return tokens;\n }\n\n toDict(): Record<string, unknown> {\n return {\n tokenizer: this._tokenizer.toDict(),\n token_filters: this._tokenFilters.map((f) => f.toDict()),\n char_filters: this._charFilters.map((f) => f.toDict()),\n };\n }\n\n toJSON(): string {\n return JSON.stringify(this.toDict());\n }\n\n static fromDict(d: Record<string, unknown>): Analyzer {\n const tokenizer = TokenizerBase.fromDict(d[\"tokenizer\"] as Record<string, unknown>);\n const tokenFilters = (d[\"token_filters\"] as Record<string, unknown>[]).map((f) =>\n TokenFilterBase.fromDict(f),\n );\n const charFilters = d[\"char_filters\"]\n ? (d[\"char_filters\"] as Record<string, unknown>[]).map((f) =>\n CharFilterBase.fromDict(f),\n )\n : [];\n return new Analyzer(tokenizer, tokenFilters, charFilters);\n }\n\n static fromJSON(s: string): Analyzer {\n return Analyzer.fromDict(JSON.parse(s) as Record<string, unknown>);\n }\n}\n\n// -- Factory functions --------------------------------------------------------\n\nexport function whitespaceAnalyzer(): Analyzer {\n return new Analyzer(new WhitespaceTokenizer(), [new LowerCaseFilter()]);\n}\n\nexport function standardAnalyzer(language = \"english\"): Analyzer {\n return new Analyzer(new StandardTokenizer(), [\n new LowerCaseFilter(),\n new ASCIIFoldingFilter(),\n new StopWordFilter(language),\n new PorterStemFilter(),\n ]);\n}\n\nexport function standardCJKAnalyzer(language = \"english\"): Analyzer {\n return new Analyzer(new StandardTokenizer(), [\n new LowerCaseFilter(),\n new ASCIIFoldingFilter(),\n new StopWordFilter(language),\n new PorterStemFilter(),\n new NGramFilter(2, 3, true),\n ]);\n}\n\nexport function keywordAnalyzer(): Analyzer {\n return new Analyzer(new KeywordTokenizer(), []);\n}\n\nexport const DEFAULT_ANALYZER = standardAnalyzer();\n\n// -- Analyzer registry --------------------------------------------------------\n\nconst BUILTIN_ANALYZERS: Record<string, Analyzer> = {\n whitespace: whitespaceAnalyzer(),\n standard: standardAnalyzer(),\n standard_cjk: standardCJKAnalyzer(),\n keyword: keywordAnalyzer(),\n};\n\nconst customAnalyzers = new Map<string, Analyzer>();\n\nexport function registerAnalyzer(name: string, analyzer: Analyzer): void {\n if (name in BUILTIN_ANALYZERS) {\n throw new Error(`Cannot override built-in analyzer: ${name}`);\n }\n customAnalyzers.set(name, analyzer);\n}\n\nexport function getAnalyzer(name: string): Analyzer {\n const custom = customAnalyzers.get(name);\n if (custom) return custom;\n const builtin = BUILTIN_ANALYZERS[name];\n if (builtin) return builtin;\n throw new Error(`Unknown analyzer: ${name}`);\n}\n\nexport function dropAnalyzer(name: string): void {\n if (name in BUILTIN_ANALYZERS) {\n throw new Error(`Cannot drop built-in analyzer: ${name}`);\n }\n if (!customAnalyzers.has(name)) {\n throw new Error(`Analyzer not found: ${name}`);\n }\n customAnalyzers.delete(name);\n}\n\nexport function listAnalyzers(): string[] {\n return [...Object.keys(BUILTIN_ANALYZERS), ...customAnalyzers.keys()].sort();\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- DocumentStore abstract interface\n// 1:1 port of uqa/storage/abc/document_store.py\n//\n// A document store maps DocId keys to dict values and supports\n// field-level access, bulk retrieval, and hierarchical path evaluation.\n// Concrete implementations include in-memory and SQLite-backed stores.\n\nimport type { DocId, FieldName, PathExpr } from \"../../core/types.js\";\n\n/**\n * Abstract interface for document storage backends.\n *\n * A document store maps DocId keys to dict values and supports\n * field-level access, bulk retrieval, and hierarchical path evaluation.\n * Concrete implementations include in-memory and SQLite-backed stores.\n */\nexport abstract class DocumentStore {\n /** Insert or replace a document keyed by docId. */\n abstract put(docId: DocId, document: Record<string, unknown>): void;\n\n /** Return the document as a dict, or null if absent. */\n abstract get(docId: DocId): Record<string, unknown> | null;\n\n /** Delete a document. No error if docId does not exist. */\n abstract delete(docId: DocId): void;\n\n /** Remove all documents. */\n abstract clear(): void;\n\n /** Return a single field value, or null/undefined if absent. */\n abstract getField(docId: DocId, field: FieldName): unknown;\n\n /** Return field values for multiple docIds in a single call. */\n abstract getFieldsBulk(docIds: DocId[], field: FieldName): Map<DocId, unknown>;\n\n /** Return true if any document has the given field equal to value. */\n abstract hasValue(field: FieldName, value: unknown): boolean;\n\n /** Evaluate a hierarchical path expression against a document. */\n abstract evalPath(docId: DocId, path: PathExpr): unknown;\n\n /** Return the set of all stored document IDs. */\n abstract get docIds(): Set<DocId>;\n\n /** Return the number of stored documents. */\n abstract get length(): number;\n\n /** Return the maximum document ID in the store, or -1 if empty. */\n abstract maxDocId(): number;\n\n /** Bulk insert or replace multiple documents. */\n abstract putBulk(docs: Array<[DocId, Record<string, unknown>]>): void;\n\n /** Bulk delete multiple documents. */\n abstract deleteBulk(docIds: DocId[]): void;\n\n /**\n * Yield all (docId, document) pairs in ID order.\n *\n * The default implementation fetches each document individually.\n * SQLite-backed stores override this with a single query.\n */\n *iterAll(): IterableIterator<[DocId, Record<string, unknown>]> {\n const sortedIds = [...this.docIds].sort((a, b) => a - b);\n for (const docId of sortedIds) {\n const doc = this.get(docId);\n if (doc !== null) {\n yield [docId, doc];\n }\n }\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- MemoryDocumentStore\n// 1:1 port of uqa/storage/document_store.py\n\nimport type { DocId, FieldName, PathExpr } from \"../core/types.js\";\nimport { DocumentStore } from \"./abc/document-store.js\";\n\n// Simple path evaluation (full HierarchicalDocument in Phase 13)\nfunction evalPathOnDoc(doc: Record<string, unknown>, path: PathExpr): unknown {\n let current: unknown = doc;\n for (const component of path) {\n if (current === null || current === undefined) return undefined;\n if (typeof component === \"number\") {\n if (!Array.isArray(current)) return undefined;\n current = (current as unknown[])[component];\n } else {\n // Implicit array wildcard: if current is array and component is string,\n // map over array elements extracting named field from each dict\n if (Array.isArray(current)) {\n current = (current as unknown[]).map(\n (item) => (item as Record<string, unknown>)[component],\n );\n } else if (typeof current === \"object\") {\n current = (current as Record<string, unknown>)[component];\n } else {\n return undefined;\n }\n }\n }\n return current;\n}\n\nexport class MemoryDocumentStore extends DocumentStore {\n private _documents: Map<DocId, Record<string, unknown>>;\n\n constructor() {\n super();\n this._documents = new Map();\n }\n\n put(docId: DocId, document: Record<string, unknown>): void {\n this._documents.set(docId, document);\n }\n\n get(docId: DocId): Record<string, unknown> | null {\n return this._documents.get(docId) ?? null;\n }\n\n delete(docId: DocId): void {\n this._documents.delete(docId);\n }\n\n clear(): void {\n this._documents.clear();\n }\n\n getField(docId: DocId, field: FieldName): unknown {\n const doc = this._documents.get(docId);\n if (doc === undefined) return undefined;\n return doc[field];\n }\n\n getFieldsBulk(docIds: DocId[], field: FieldName): Map<DocId, unknown> {\n const result = new Map<DocId, unknown>();\n for (const docId of docIds) {\n const doc = this._documents.get(docId);\n result.set(docId, doc !== undefined ? doc[field] : undefined);\n }\n return result;\n }\n\n hasValue(field: FieldName, value: unknown): boolean {\n for (const doc of this._documents.values()) {\n if (doc[field] === value) return true;\n }\n return false;\n }\n\n evalPath(docId: DocId, path: PathExpr): unknown {\n const doc = this._documents.get(docId);\n if (doc === undefined) return undefined;\n return evalPathOnDoc(doc, path);\n }\n\n get docIds(): Set<DocId> {\n return new Set(this._documents.keys());\n }\n\n get length(): number {\n return this._documents.size;\n }\n\n maxDocId(): number {\n let max = -1;\n for (const id of this._documents.keys()) {\n if (id > max) max = id;\n }\n return max;\n }\n\n putBulk(docs: Array<[DocId, Record<string, unknown>]>): void {\n for (const [docId, document] of docs) {\n this._documents.set(docId, document);\n }\n }\n\n deleteBulk(docIds: DocId[]): void {\n for (const docId of docIds) {\n this._documents.delete(docId);\n }\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- InvertedIndex abstract interface\n// 1:1 port of uqa/storage/abc/inverted_index.py\n//\n// An inverted index maps (field, term) pairs to posting lists and\n// maintains per-document token lengths and corpus statistics for scoring.\n// Concrete implementations include in-memory and SQLite-backed stores.\n\nimport type { DocId, FieldName, IndexStats } from \"../../core/types.js\";\nimport type { PostingEntry } from \"../../core/types.js\";\nimport type { PostingList } from \"../../core/posting-list.js\";\n\n/**\n * Minimal analyzer interface -- full implementation in analysis module.\n * Analyzers tokenize text into a list of terms for indexing and search.\n */\nexport interface AnalyzerLike {\n analyze(text: string): string[];\n}\n\n/**\n * Metadata returned from indexing a document.\n *\n * Used by the persistence layer to store posting entries and per-field\n * token lengths without duplicating tokenization logic.\n */\nexport interface IndexedTerms {\n /** Per-field token counts after analysis. */\n readonly fieldLengths: Record<string, number>;\n /**\n * Posting data keyed by \"${field}\\0${term}\" -> positions.\n * Each entry maps a (field, term) pair to the list of token positions\n * where the term occurred in the document.\n */\n readonly postings: Map<string, readonly number[]>;\n}\n\n/**\n * Abstract interface for inverted index backends.\n *\n * An inverted index maps (field, term) pairs to posting lists and\n * maintains per-document token lengths and corpus statistics for scoring.\n * Concrete implementations include in-memory and SQLite-backed stores.\n */\nexport abstract class InvertedIndex {\n // -- Indexing ---------------------------------------------------------------\n\n /**\n * Index a document by tokenizing each field.\n *\n * Returns an IndexedTerms with per-field lengths and posting data\n * so the caller can persist them without re-tokenizing.\n */\n abstract addDocument(docId: DocId, fields: Record<FieldName, string>): IndexedTerms;\n\n /** Add a single posting entry directly (for catalog restore). */\n abstract addPosting(field: string, term: string, entry: PostingEntry): void;\n\n /** Set per-field token lengths for a document (for catalog restore). */\n abstract setDocLength(docId: DocId, lengths: Record<FieldName, number>): void;\n\n /** Set the indexed document count (for catalog restore). */\n abstract setDocCount(count: number): void;\n\n /** Accumulate total token length for a field (for catalog restore). */\n abstract addTotalLength(field: FieldName, length: number): void;\n\n /** Remove all entries for a document from the index. */\n abstract removeDocument(docId: DocId): void;\n\n /** Remove all indexed data. */\n abstract clear(): void;\n\n // -- Querying ---------------------------------------------------------------\n\n /** Return the posting list for a specific (field, term) pair. */\n abstract getPostingList(field: string, term: string): PostingList;\n\n /** Return the posting list matching term across any field. */\n abstract getPostingListAnyField(term: string): PostingList;\n\n /** Return the document frequency for a (field, term) pair. */\n abstract docFreq(field: string, term: string): number;\n\n /** Return the document frequency across all fields. */\n abstract docFreqAnyField(term: string): number;\n\n /** Return the token count for docId in field. */\n abstract getDocLength(docId: DocId, field: FieldName): number;\n\n /** Return doc lengths for multiple docIds in a single call. */\n abstract getDocLengthsBulk(docIds: DocId[], field: FieldName): Map<DocId, number>;\n\n /** Return the total document length across all fields. */\n abstract getTotalDocLength(docId: DocId): number;\n\n /** Return term frequency for a specific doc in a specific field. */\n abstract getTermFreq(docId: DocId, field: string, term: string): number;\n\n /** Return term frequencies for multiple docIds in a single call. */\n abstract getTermFreqsBulk(\n docIds: DocId[],\n field: string,\n term: string,\n ): Map<DocId, number>;\n\n /** Return total term frequency for a doc across all fields. */\n abstract getTotalTermFreq(docId: DocId, term: string): number;\n\n // -- Analyzers --------------------------------------------------------------\n\n /** Return the default analyzer. */\n abstract get analyzer(): AnalyzerLike;\n\n /** Return the per-field index-time analyzer overrides. */\n abstract get fieldAnalyzers(): Record<string, AnalyzerLike>;\n\n /**\n * Set a per-field analyzer override.\n *\n * phase controls which phase the analyzer applies to:\n * \"index\" for indexing only, \"search\" for search only,\n * or \"both\" (default) for both phases.\n */\n abstract setFieldAnalyzer(\n field: string,\n analyzer: AnalyzerLike,\n phase?: \"index\" | \"search\" | \"both\",\n ): void;\n\n /** Return the index-time analyzer for a specific field. */\n abstract getFieldAnalyzer(field: string): AnalyzerLike;\n\n /**\n * Return the search-time analyzer for a specific field.\n * Falls back to the index-time analyzer, then the default analyzer.\n */\n abstract getSearchAnalyzer(field: string): AnalyzerLike;\n\n // -- Bulk operations -------------------------------------------------------\n\n /** Add multiple documents in a single batch. */\n abstract addDocuments(docs: Array<[DocId, Record<FieldName, string>]>): void;\n\n /** Remove multiple documents in a single batch. */\n abstract removeDocuments(docIds: DocId[]): void;\n\n // -- Term enumeration ------------------------------------------------------\n\n /** Return all distinct terms indexed under a specific field. */\n abstract terms(field: string): Iterable<string>;\n\n /** Return all (field, term) pairs in the index. */\n abstract allTerms(): Iterable<[string, string]>;\n\n /** Return all field names that have been indexed. */\n abstract fieldNames(): Iterable<string>;\n\n // -- Existence checks ------------------------------------------------------\n\n /** Return true if the given (field, term) pair has any postings. */\n abstract hasTerm(field: string, term: string): boolean;\n\n /** Return true if the given document ID is indexed. */\n abstract hasDoc(docId: DocId): boolean;\n\n // -- Document length statistics -------------------------------------------\n\n /** Return the average document length for a field. */\n abstract avgDocLength(field: FieldName): number;\n\n /** Return the total number of indexed documents. */\n abstract totalDocCount(): number;\n\n /** Return the total token length across all documents for a field. */\n abstract totalFieldLength(field: FieldName): number;\n\n // -- Position access -------------------------------------------------------\n\n /** Return the token positions for a term in a specific document and field. */\n abstract getPositions(docId: DocId, field: string, term: string): readonly number[];\n\n // -- Statistics -------------------------------------------------------------\n\n /** Return corpus-level statistics for scoring. */\n abstract get stats(): IndexStats;\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- MemoryInvertedIndex\n// 1:1 port of uqa/storage/inverted_index.py\n\nimport type { DocId, FieldName, PostingEntry } from \"../core/types.js\";\nimport { IndexStats, createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { AnalyzerLike, IndexedTerms } from \"./abc/inverted-index.js\";\nimport { InvertedIndex } from \"./abc/inverted-index.js\";\n\n// Default analyzer: simple whitespace + lowercase split\nconst DEFAULT_ANALYZER: AnalyzerLike = {\n analyze(text: string): string[] {\n return text\n .toLowerCase()\n .split(/\\s+/)\n .filter((t) => t.length > 0);\n },\n};\n\nexport class MemoryInvertedIndex extends InvertedIndex {\n private _analyzer: AnalyzerLike;\n private _indexFieldAnalyzers: Map<string, AnalyzerLike>;\n private _searchFieldAnalyzers: Map<string, AnalyzerLike>;\n // (field, term) -> (docId -> PostingEntry)\n private _index: Map<string, Map<DocId, PostingEntry>>;\n // docId -> set of keys in _index\n private _docTerms: Map<DocId, Set<string>>;\n // docId -> { field -> length }\n private _docLengths: Map<DocId, Map<FieldName, number>>;\n private _docCount: number;\n private _totalLength: Map<FieldName, number>;\n private _cachedStats: IndexStats | null;\n // term -> list of keys (field\\0term format)\n private _termToKeys: Map<string, string[]>;\n\n constructor(\n analyzer?: AnalyzerLike | null,\n fieldAnalyzers?: Record<string, AnalyzerLike> | null,\n ) {\n super();\n this._analyzer = analyzer ?? DEFAULT_ANALYZER;\n this._indexFieldAnalyzers = new Map();\n this._searchFieldAnalyzers = new Map();\n if (fieldAnalyzers) {\n for (const [field, a] of Object.entries(fieldAnalyzers)) {\n this._indexFieldAnalyzers.set(field, a);\n }\n }\n this._index = new Map();\n this._docTerms = new Map();\n this._docLengths = new Map();\n this._docCount = 0;\n this._totalLength = new Map();\n this._cachedStats = null;\n this._termToKeys = new Map();\n }\n\n private _key(field: string, term: string): string {\n return `${field}\\0${term}`;\n }\n\n private _parseKey(key: string): [string, string] {\n const idx = key.indexOf(\"\\0\");\n return [key.substring(0, idx), key.substring(idx + 1)];\n }\n\n // -- Analyzer methods -------------------------------------------------------\n\n get analyzer(): AnalyzerLike {\n return this._analyzer;\n }\n\n get fieldAnalyzers(): Record<string, AnalyzerLike> {\n const result: Record<string, AnalyzerLike> = {};\n for (const [k, v] of this._indexFieldAnalyzers) {\n result[k] = v;\n }\n return result;\n }\n\n setFieldAnalyzer(\n field: string,\n analyzer: AnalyzerLike,\n phase: \"index\" | \"search\" | \"both\" = \"both\",\n ): void {\n if (phase === \"index\" || phase === \"both\") {\n this._indexFieldAnalyzers.set(field, analyzer);\n }\n if (phase === \"search\" || phase === \"both\") {\n this._searchFieldAnalyzers.set(field, analyzer);\n }\n }\n\n getFieldAnalyzer(field: string): AnalyzerLike {\n return this._indexFieldAnalyzers.get(field) ?? this._analyzer;\n }\n\n getSearchAnalyzer(field: string): AnalyzerLike {\n return (\n this._searchFieldAnalyzers.get(field) ??\n this._indexFieldAnalyzers.get(field) ??\n this._analyzer\n );\n }\n\n // -- Indexing ----------------------------------------------------------------\n\n addDocument(docId: DocId, fields: Record<FieldName, string>): IndexedTerms {\n this._cachedStats = null;\n this._docCount++;\n this._docLengths.set(docId, new Map());\n\n let docTermSet = this._docTerms.get(docId);\n if (!docTermSet) {\n docTermSet = new Set();\n this._docTerms.set(docId, docTermSet);\n }\n\n const resultFieldLengths: Record<string, number> = {};\n const resultPostings = new Map<string, readonly number[]>();\n\n for (const [fieldName, text] of Object.entries(fields)) {\n const fieldAnalyzer = this.getFieldAnalyzer(fieldName);\n const tokens = fieldAnalyzer.analyze(text);\n\n const lengths = this._docLengths.get(docId)!;\n lengths.set(fieldName, tokens.length);\n resultFieldLengths[fieldName] = tokens.length;\n\n const prev = this._totalLength.get(fieldName) ?? 0;\n this._totalLength.set(fieldName, prev + tokens.length);\n\n // Build term -> positions map\n const termPositions = new Map<string, number[]>();\n for (let pos = 0; pos < tokens.length; pos++) {\n const token = tokens[pos]!;\n let positions = termPositions.get(token);\n if (!positions) {\n positions = [];\n termPositions.set(token, positions);\n }\n positions.push(pos);\n }\n\n for (const [term, positions] of termPositions) {\n const key = this._key(fieldName, term);\n\n let inner = this._index.get(key);\n if (!inner) {\n inner = new Map();\n this._index.set(key, inner);\n let termKeys = this._termToKeys.get(term);\n if (!termKeys) {\n termKeys = [];\n this._termToKeys.set(term, termKeys);\n }\n termKeys.push(key);\n }\n\n const entry: PostingEntry = {\n docId,\n payload: createPayload({ positions, score: 0.0 }),\n };\n inner.set(docId, entry);\n docTermSet.add(key);\n\n resultPostings.set(key, positions);\n }\n }\n\n return { fieldLengths: resultFieldLengths, postings: resultPostings };\n }\n\n addPosting(field: string, term: string, entry: PostingEntry): void {\n this._cachedStats = null;\n const key = this._key(field, term);\n\n let inner = this._index.get(key);\n if (!inner) {\n inner = new Map();\n this._index.set(key, inner);\n let termKeys = this._termToKeys.get(term);\n if (!termKeys) {\n termKeys = [];\n this._termToKeys.set(term, termKeys);\n }\n termKeys.push(key);\n }\n\n inner.set(entry.docId, entry);\n\n let docTermSet = this._docTerms.get(entry.docId);\n if (!docTermSet) {\n docTermSet = new Set();\n this._docTerms.set(entry.docId, docTermSet);\n }\n docTermSet.add(key);\n }\n\n setDocLength(docId: DocId, lengths: Record<FieldName, number>): void {\n const m = new Map<FieldName, number>();\n for (const [k, v] of Object.entries(lengths)) {\n m.set(k, v);\n }\n this._docLengths.set(docId, m);\n }\n\n setDocCount(count: number): void {\n this._cachedStats = null;\n this._docCount = count;\n }\n\n addTotalLength(field: FieldName, length: number): void {\n this._cachedStats = null;\n const prev = this._totalLength.get(field) ?? 0;\n this._totalLength.set(field, prev + length);\n }\n\n removeDocument(docId: DocId): void {\n this._cachedStats = null;\n const keys = this._docTerms.get(docId);\n if (!keys) return;\n\n for (const key of keys) {\n const inner = this._index.get(key);\n if (inner) {\n inner.delete(docId);\n if (inner.size === 0) {\n this._index.delete(key);\n const [, term] = this._parseKey(key);\n const termKeys = this._termToKeys.get(term);\n if (termKeys) {\n const idx = termKeys.indexOf(key);\n if (idx !== -1) termKeys.splice(idx, 1);\n if (termKeys.length === 0) this._termToKeys.delete(term);\n }\n }\n }\n }\n\n this._docTerms.delete(docId);\n\n const lengths = this._docLengths.get(docId);\n if (lengths) {\n for (const [fld, length] of lengths) {\n const prev = this._totalLength.get(fld) ?? 0;\n this._totalLength.set(fld, prev - length);\n }\n this._docLengths.delete(docId);\n this._docCount--;\n }\n }\n\n clear(): void {\n this._index.clear();\n this._docTerms.clear();\n this._docLengths.clear();\n this._termToKeys.clear();\n this._cachedStats = null;\n this._docCount = 0;\n this._totalLength.clear();\n }\n\n // -- Querying ---------------------------------------------------------------\n\n getPostingList(field: string, term: string): PostingList {\n const inner = this._index.get(this._key(field, term));\n if (!inner) return new PostingList();\n const entries = [...inner.values()].sort((a, b) => a.docId - b.docId);\n return PostingList.fromSorted(entries);\n }\n\n getPostingListAnyField(term: string): PostingList {\n const keys = this._termToKeys.get(term);\n if (!keys || keys.length === 0) return new PostingList();\n\n const seen = new Set<DocId>();\n const allEntries: PostingEntry[] = [];\n for (const key of keys) {\n const inner = this._index.get(key);\n if (!inner) continue;\n for (const [docId, entry] of inner) {\n if (!seen.has(docId)) {\n seen.add(docId);\n allEntries.push(entry);\n }\n }\n }\n allEntries.sort((a, b) => a.docId - b.docId);\n return PostingList.fromSorted(allEntries);\n }\n\n docFreq(field: string, term: string): number {\n const inner = this._index.get(this._key(field, term));\n return inner ? inner.size : 0;\n }\n\n docFreqAnyField(term: string): number {\n const keys = this._termToKeys.get(term);\n if (!keys || keys.length === 0) return 0;\n const docIds = new Set<DocId>();\n for (const key of keys) {\n const inner = this._index.get(key);\n if (inner) {\n for (const docId of inner.keys()) {\n docIds.add(docId);\n }\n }\n }\n return docIds.size;\n }\n\n getDocLength(docId: DocId, field: FieldName): number {\n const lengths = this._docLengths.get(docId);\n if (!lengths) return 0;\n return lengths.get(field) ?? 0;\n }\n\n getDocLengthsBulk(docIds: DocId[], field: FieldName): Map<DocId, number> {\n const result = new Map<DocId, number>();\n for (const docId of docIds) {\n result.set(docId, this.getDocLength(docId, field));\n }\n return result;\n }\n\n getTotalDocLength(docId: DocId): number {\n const lengths = this._docLengths.get(docId);\n if (!lengths) return 0;\n let total = 0;\n for (const v of lengths.values()) {\n total += v;\n }\n return total;\n }\n\n getTermFreq(docId: DocId, field: string, term: string): number {\n const inner = this._index.get(this._key(field, term));\n if (!inner) return 0;\n const entry = inner.get(docId);\n if (!entry) return 0;\n return entry.payload.positions.length;\n }\n\n getTermFreqsBulk(docIds: DocId[], field: string, term: string): Map<DocId, number> {\n const inner = this._index.get(this._key(field, term));\n const result = new Map<DocId, number>();\n for (const docId of docIds) {\n if (inner) {\n const entry = inner.get(docId);\n result.set(docId, entry ? entry.payload.positions.length : 0);\n } else {\n result.set(docId, 0);\n }\n }\n return result;\n }\n\n getTotalTermFreq(docId: DocId, term: string): number {\n const keys = this._termToKeys.get(term);\n if (!keys) return 0;\n let total = 0;\n for (const key of keys) {\n const inner = this._index.get(key);\n if (inner) {\n const entry = inner.get(docId);\n if (entry) {\n total += entry.payload.positions.length;\n }\n }\n }\n return total;\n }\n\n // -- Bulk operations -------------------------------------------------------\n\n addDocuments(docs: Array<[DocId, Record<FieldName, string>]>): void {\n for (const [docId, fields] of docs) {\n this.addDocument(docId, fields);\n }\n }\n\n removeDocuments(docIds: DocId[]): void {\n for (const docId of docIds) {\n this.removeDocument(docId);\n }\n }\n\n // -- Term enumeration ------------------------------------------------------\n\n *terms(field: string): Generator<string> {\n const prefix = this._key(field, \"\");\n for (const key of this._index.keys()) {\n if (key.startsWith(prefix)) {\n const [, term] = this._parseKey(key);\n yield term;\n }\n }\n }\n\n *allTerms(): Generator<[string, string]> {\n for (const key of this._index.keys()) {\n yield this._parseKey(key);\n }\n }\n\n *fieldNames(): Generator<string> {\n const fields = new Set<string>();\n for (const key of this._index.keys()) {\n const [field] = this._parseKey(key);\n if (!fields.has(field)) {\n fields.add(field);\n yield field;\n }\n }\n }\n\n // -- Existence checks ------------------------------------------------------\n\n hasTerm(field: string, term: string): boolean {\n return this._index.has(this._key(field, term));\n }\n\n hasDoc(docId: DocId): boolean {\n return this._docTerms.has(docId);\n }\n\n // -- Document length statistics -------------------------------------------\n\n avgDocLength(field: FieldName): number {\n if (this._docCount === 0) return 0;\n const total = this._totalLength.get(field) ?? 0;\n return total / this._docCount;\n }\n\n totalDocCount(): number {\n return this._docCount;\n }\n\n totalFieldLength(field: FieldName): number {\n return this._totalLength.get(field) ?? 0;\n }\n\n // -- Position access -------------------------------------------------------\n\n getPositions(docId: DocId, field: string, term: string): readonly number[] {\n const inner = this._index.get(this._key(field, term));\n if (!inner) return [];\n const entry = inner.get(docId);\n if (!entry) return [];\n return entry.payload.positions;\n }\n\n // -- Statistics -------------------------------------------------------------\n\n get stats(): IndexStats {\n if (this._cachedStats !== null) return this._cachedStats;\n\n let totalLen = 0;\n for (const v of this._totalLength.values()) {\n totalLen += v;\n }\n const avgDocLength = this._docCount > 0 ? totalLen / this._docCount : 0.0;\n\n const s = new IndexStats(this._docCount, avgDocLength);\n\n for (const [key, inner] of this._index) {\n const [field, term] = this._parseKey(key);\n s.setDocFreq(field, term, inner.size);\n }\n\n this._cachedStats = s;\n return s;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- linear algebra utilities (replaces numpy)\n// All operations use Float64Array. No mutation of input arrays.\n\nexport type Shape2D = readonly [number, number];\n\nexport interface MatrixResult {\n readonly data: Float64Array;\n readonly shape: Shape2D;\n}\n\n// -- Scalar results ----------------------------------------------------------\n\nexport function dot(a: Float64Array, b: Float64Array): number {\n if (a.length !== b.length) {\n throw new Error(\n `dot: length mismatch (${String(a.length)} vs ${String(b.length)})`,\n );\n }\n let s = 0;\n for (let i = 0; i < a.length; i++) {\n s += a[i]! * b[i]!;\n }\n return s;\n}\n\nexport function norm(v: Float64Array): number {\n return Math.sqrt(dot(v, v));\n}\n\nexport function cosine(a: Float64Array, b: Float64Array): number {\n const na = norm(a);\n const nb = norm(b);\n if (na === 0 || nb === 0) return 0;\n return dot(a, b) / (na * nb);\n}\n\nexport function sum(a: Float64Array): number {\n let s = 0;\n for (let i = 0; i < a.length; i++) {\n s += a[i]!;\n }\n return s;\n}\n\nexport function mean(a: Float64Array): number {\n if (a.length === 0) {\n throw new Error(\"mean: empty array\");\n }\n return sum(a) / a.length;\n}\n\nexport function sigmoid(x: number): number {\n return 1 / (1 + Math.exp(-x));\n}\n\nexport function argmax(a: Float64Array): number {\n if (a.length === 0) return 0;\n let best = 0;\n let bestVal = a[0]!;\n for (let i = 1; i < a.length; i++) {\n if (a[i]! > bestVal) {\n bestVal = a[i]!;\n best = i;\n }\n }\n return best;\n}\n\n// -- Vector -> Vector --------------------------------------------------------\n\nfunction assertSameLength(op: string, a: Float64Array, b: Float64Array): void {\n if (a.length !== b.length) {\n throw new Error(\n `${op}: length mismatch (${String(a.length)} vs ${String(b.length)})`,\n );\n }\n}\n\nexport function add(a: Float64Array, b: Float64Array): Float64Array {\n assertSameLength(\"add\", a, b);\n const out = new Float64Array(a.length);\n for (let i = 0; i < a.length; i++) {\n out[i] = a[i]! + b[i]!;\n }\n return out;\n}\n\nexport function sub(a: Float64Array, b: Float64Array): Float64Array {\n assertSameLength(\"sub\", a, b);\n const out = new Float64Array(a.length);\n for (let i = 0; i < a.length; i++) {\n out[i] = a[i]! - b[i]!;\n }\n return out;\n}\n\nexport function mul(a: Float64Array, b: Float64Array): Float64Array {\n assertSameLength(\"mul\", a, b);\n const out = new Float64Array(a.length);\n for (let i = 0; i < a.length; i++) {\n out[i] = a[i]! * b[i]!;\n }\n return out;\n}\n\nexport function div(a: Float64Array, b: Float64Array): Float64Array {\n assertSameLength(\"div\", a, b);\n const out = new Float64Array(a.length);\n for (let i = 0; i < a.length; i++) {\n out[i] = a[i]! / b[i]!;\n }\n return out;\n}\n\nexport function scale(a: Float64Array, scalar: number): Float64Array {\n const out = new Float64Array(a.length);\n for (let i = 0; i < a.length; i++) {\n out[i] = a[i]! * scalar;\n }\n return out;\n}\n\nexport function exp(a: Float64Array): Float64Array {\n const out = new Float64Array(a.length);\n for (let i = 0; i < a.length; i++) {\n out[i] = Math.exp(a[i]!);\n }\n return out;\n}\n\nexport function log(a: Float64Array): Float64Array {\n const out = new Float64Array(a.length);\n for (let i = 0; i < a.length; i++) {\n out[i] = Math.log(a[i]!);\n }\n return out;\n}\n\nexport function softmax(a: Float64Array): Float64Array {\n if (a.length === 0) return new Float64Array(0);\n // Subtract max for numerical stability\n let mx = a[0]!;\n for (let i = 1; i < a.length; i++) {\n if (a[i]! > mx) mx = a[i]!;\n }\n const out = new Float64Array(a.length);\n let total = 0;\n for (let i = 0; i < a.length; i++) {\n out[i] = Math.exp(a[i]! - mx);\n total += out[i]!;\n }\n for (let i = 0; i < out.length; i++) {\n out[i] = out[i]! / total;\n }\n return out;\n}\n\nexport function clip(a: Float64Array, lo: number, hi: number): Float64Array {\n const out = new Float64Array(a.length);\n for (let i = 0; i < a.length; i++) {\n out[i] = Math.max(lo, Math.min(hi, a[i]!));\n }\n return out;\n}\n\n// -- Index operations --------------------------------------------------------\n\nexport function argsort(a: Float64Array): number[] {\n const indices = Array.from({ length: a.length }, (_, i) => i);\n indices.sort((x, y) => a[x]! - a[y]!);\n return indices;\n}\n\n// -- Constructors ------------------------------------------------------------\n\nexport function ones(n: number): Float64Array {\n const out = new Float64Array(n);\n out.fill(1.0);\n return out;\n}\n\nexport function zeros(n: number): Float64Array {\n return new Float64Array(n);\n}\n\n// -- Matrix operations -------------------------------------------------------\n\nexport function matmul(\n a: Float64Array,\n shapeA: Shape2D,\n b: Float64Array,\n shapeB: Shape2D,\n): MatrixResult {\n const [rowsA, colsA] = shapeA;\n const [rowsB, colsB] = shapeB;\n if (colsA !== rowsB) {\n throw new Error(\n `matmul: inner dimension mismatch (${String(colsA)} vs ${String(rowsB)})`,\n );\n }\n if (a.length !== rowsA * colsA) {\n throw new Error(\n `matmul: array a length (${String(a.length)}) does not match shape [${String(rowsA)}, ${String(colsA)}]`,\n );\n }\n if (b.length !== rowsB * colsB) {\n throw new Error(\n `matmul: array b length (${String(b.length)}) does not match shape [${String(rowsB)}, ${String(colsB)}]`,\n );\n }\n const out = new Float64Array(rowsA * colsB);\n for (let i = 0; i < rowsA; i++) {\n for (let k = 0; k < colsA; k++) {\n const aik = a[i * colsA + k]!;\n for (let j = 0; j < colsB; j++) {\n out[i * colsB + j] = out[i * colsB + j]! + aik * b[k * colsB + j]!;\n }\n }\n }\n return { data: out, shape: [rowsA, colsB] };\n}\n\nexport function transpose(a: Float64Array, rows: number, cols: number): Float64Array {\n if (a.length !== rows * cols) {\n throw new Error(\n `transpose: array length (${String(a.length)}) does not match shape [${String(rows)}, ${String(cols)}]`,\n );\n }\n const out = new Float64Array(a.length);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n out[j * rows + i] = a[i * cols + j]!;\n }\n }\n return out;\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- VectorIndex abstract + flat brute-force implementation\n// 1:1 port of uqa/storage/vector_index.py\n\nimport type { DocId } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport { cosine } from \"../math/linalg.js\";\n\nexport abstract class VectorIndex {\n abstract readonly dimensions: number;\n abstract add(docId: DocId, vector: Float64Array): void;\n abstract delete(docId: DocId): void;\n abstract clear(): void;\n abstract searchKnn(query: Float64Array, k: number): PostingList;\n abstract searchThreshold(query: Float64Array, threshold: number): PostingList;\n abstract count(): number;\n}\n\n// Flat brute-force implementation (no HNSW/IVF -- those come in ivf-index.ts)\nexport class FlatVectorIndex extends VectorIndex {\n readonly dimensions: number;\n private _vectors: Map<DocId, Float64Array>;\n\n constructor(dimensions: number) {\n super();\n this.dimensions = dimensions;\n this._vectors = new Map();\n }\n\n add(docId: DocId, vector: Float64Array): void {\n if (vector.length !== this.dimensions) {\n throw new Error(\n `Vector dimension mismatch: expected ${String(this.dimensions)}, got ${String(vector.length)}`,\n );\n }\n this._vectors.set(docId, vector);\n }\n\n delete(docId: DocId): void {\n this._vectors.delete(docId);\n }\n\n clear(): void {\n this._vectors.clear();\n }\n\n searchKnn(query: Float64Array, k: number): PostingList {\n if (this._vectors.size === 0) return new PostingList();\n\n // Compute similarities for all vectors\n const scored: { docId: DocId; score: number }[] = [];\n for (const [docId, vec] of this._vectors) {\n const sim = cosine(query, vec);\n scored.push({ docId, score: sim });\n }\n\n // Sort descending by score, take top k\n scored.sort((a, b) => b.score - a.score);\n const topK = scored.slice(0, k);\n\n const entries = topK.map((s) => ({\n docId: s.docId,\n payload: createPayload({ score: s.score }),\n }));\n\n return new PostingList(entries);\n }\n\n searchThreshold(query: Float64Array, threshold: number): PostingList {\n const entries: {\n docId: DocId;\n payload: {\n positions: readonly number[];\n score: number;\n fields: Readonly<Record<string, unknown>>;\n };\n }[] = [];\n\n for (const [docId, vec] of this._vectors) {\n const sim = cosine(query, vec);\n if (sim >= threshold) {\n entries.push({\n docId,\n payload: createPayload({ score: sim }),\n });\n }\n }\n\n return new PostingList(entries);\n }\n\n count(): number {\n return this._vectors.size;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- GraphStore abstract interface\n// 1:1 port of uqa/storage/abc/graph_store.py\n//\n// A graph store manages named graphs with vertices and edges, supporting\n// graph lifecycle, mutations, queries, adjacency access, and statistics.\n// Concrete implementations include in-memory and SQLite-backed stores.\n\nimport type { Edge, Vertex } from \"../../core/types.js\";\n\n/**\n * Abstract interface for graph storage backends.\n *\n * A graph store manages named graphs with vertices and edges, supporting\n * graph lifecycle, mutations, queries, adjacency access, and statistics.\n * Concrete implementations include in-memory and SQLite-backed stores.\n */\nexport abstract class GraphStore {\n // -- Graph lifecycle --------------------------------------------------------\n\n /** Create a new named graph. */\n abstract createGraph(name: string): void;\n\n /** Drop a named graph and its data. */\n abstract dropGraph(name: string): void;\n\n /** Return sorted list of graph names. */\n abstract graphNames(): string[];\n\n /** Return true if graph exists. */\n abstract hasGraph(name: string): boolean;\n\n // -- Graph algebra ----------------------------------------------------------\n\n /** Create target graph as union of g1 and g2. */\n abstract unionGraphs(g1: string, g2: string, target: string): void;\n\n /** Create target graph as intersection of g1 and g2. */\n abstract intersectGraphs(g1: string, g2: string, target: string): void;\n\n /** Create target graph as g1 - g2. */\n abstract differenceGraphs(g1: string, g2: string, target: string): void;\n\n /** Copy source graph to target graph. */\n abstract copyGraph(source: string, target: string): void;\n\n // -- Mutation ---------------------------------------------------------------\n\n /** Add a vertex to a named graph. */\n abstract addVertex(vertex: Vertex, graph: string): void;\n\n /** Add an edge to a named graph. */\n abstract addEdge(edge: Edge, graph: string): void;\n\n /** Remove a vertex from a named graph. */\n abstract removeVertex(vertexId: number, graph: string): void;\n\n /** Remove an edge from a named graph. */\n abstract removeEdge(edgeId: number, graph: string): void;\n\n // -- Query ------------------------------------------------------------------\n\n /** Return neighbor vertex IDs. */\n abstract neighbors(\n vertexId: number,\n graph: string,\n label?: string | null,\n direction?: \"out\" | \"in\",\n ): number[];\n\n /** Return vertices with a given label in a graph. */\n abstract verticesByLabel(label: string, graph: string): Vertex[];\n\n /** Return all vertices in a graph. */\n abstract verticesInGraph(graph: string): Vertex[];\n\n /** Return all edges in a graph. */\n abstract edgesInGraph(graph: string): Edge[];\n\n /** Return set of graph names a vertex belongs to. */\n abstract vertexGraphs(vertexId: number): Set<string>;\n\n // -- Graph-scoped adjacency -------------------------------------------------\n\n /** Return outgoing edge IDs for vertex in a specific graph. */\n abstract outEdgeIds(vertexId: number, graph: string): Set<number>;\n\n /** Return incoming edge IDs for vertex in a specific graph. */\n abstract inEdgeIds(vertexId: number, graph: string): Set<number>;\n\n /** Return edge IDs with a given label in a specific graph. */\n abstract edgeIdsByLabel(label: string, graph: string): Set<number>;\n\n /** Return all vertex IDs in a specific graph. */\n abstract vertexIdsInGraph(graph: string): Set<number>;\n\n // -- Statistics -------------------------------------------------------------\n\n /** Out-degree distribution for vertices in graph. */\n abstract degreeDistribution(graph: string): Map<number, number>;\n\n /** Average out-degree for edges with given label in graph. */\n abstract labelDegree(label: string, graph: string): number;\n\n /** Count of vertices per vertex label in graph. */\n abstract vertexLabelCounts(graph: string): Map<string, number>;\n\n // -- Bulk mutation ----------------------------------------------------------\n\n /** Add multiple vertices to a named graph in a single batch. */\n abstract addVertices(vertices: Vertex[], graph: string): void;\n\n /** Add multiple edges to a named graph in a single batch. */\n abstract addEdges(edges: Edge[], graph: string): void;\n\n // -- Property access -------------------------------------------------------\n\n /** Return a property value from a vertex. */\n abstract vertexProperty(vertexId: number, key: string): unknown;\n\n /** Set a property value on a vertex. */\n abstract setVertexProperty(vertexId: number, key: string, value: unknown): void;\n\n /** Return a property value from an edge. */\n abstract edgeProperty(edgeId: number, key: string): unknown;\n\n /** Set a property value on an edge. */\n abstract setEdgeProperty(edgeId: number, key: string, value: unknown): void;\n\n // -- Label queries ---------------------------------------------------------\n\n /** Return edges with a given label in a specific graph. */\n abstract edgesByLabel(label: string, graph: string): Edge[];\n\n /** Return the set of all vertex labels in a graph. */\n abstract vertexLabels(graph: string): Set<string>;\n\n /** Return the set of all edge labels in a graph. */\n abstract edgeLabels(graph: string): Set<string>;\n\n // -- Degree queries --------------------------------------------------------\n\n /** Return the out-degree of a vertex in a graph. */\n abstract outDegree(vertexId: number, graph: string): number;\n\n /** Return the in-degree of a vertex in a graph. */\n abstract inDegree(vertexId: number, graph: string): number;\n\n // -- Edge-centric queries --------------------------------------------------\n\n /** Return edges between two specific vertices, optionally filtered by label. */\n abstract edgesBetween(\n sourceId: number,\n targetId: number,\n graph: string,\n label?: string | null,\n ): Edge[];\n\n // -- Subgraph extraction ---------------------------------------------------\n\n /** Extract a subgraph containing only the specified vertex IDs. */\n abstract subgraph(vertexIds: Set<number>, graph: string, target: string): void;\n\n // -- Temporal support (optional, returns null/empty for non-temporal stores) -\n\n /** Return the minimum timestamp across all edges in the graph. */\n abstract minTimestamp(graph: string): number | null;\n\n /** Return the maximum timestamp across all edges in the graph. */\n abstract maxTimestamp(graph: string): number | null;\n\n /** Return edges within a time range in the graph. */\n abstract edgesInTimeRange(graph: string, startTime: number, endTime: number): Edge[];\n\n // -- Global accessors -------------------------------------------------------\n\n /** Return vertex by ID, or null if not found. */\n abstract getVertex(vertexId: number): Vertex | null;\n\n /** Return edge by ID, or null if not found. */\n abstract getEdge(edgeId: number): Edge | null;\n\n /** Return and advance the next available vertex ID. */\n abstract nextVertexId(): number;\n\n /** Return and advance the next available edge ID. */\n abstract nextEdgeId(): number;\n\n /** Remove all vertices, edges, and graphs. */\n abstract clear(): void;\n\n /** Return a copy of all vertices. */\n abstract get vertices(): Map<number, Vertex>;\n\n /** Return a copy of all edges. */\n abstract get edges(): Map<number, Edge>;\n\n /** Return the total number of vertices. */\n abstract get vertexCount(): number;\n\n /** Return the total number of edges. */\n abstract get edgeCount(): number;\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- MemoryGraphStore\n// 1:1 port of uqa/graph/store.py\n\nimport type { Edge, Vertex } from \"../core/types.js\";\nimport { GraphStore } from \"../storage/abc/graph-store.js\";\n\n// -- Graph partition (internal) -----------------------------------------------\n\nclass _GraphPartition {\n readonly vertexIds: Set<number> = new Set();\n readonly edgeIds: Set<number> = new Set();\n readonly adjOut: Map<number, Set<number>> = new Map();\n readonly adjIn: Map<number, Set<number>> = new Map();\n readonly labelIndex: Map<string, Set<number>> = new Map();\n readonly vertexLabelIndex: Map<string, Set<number>> = new Map();\n\n addVertex(vertexId: number, label: string): void {\n this.vertexIds.add(vertexId);\n if (!this.adjOut.has(vertexId)) {\n this.adjOut.set(vertexId, new Set());\n }\n if (!this.adjIn.has(vertexId)) {\n this.adjIn.set(vertexId, new Set());\n }\n let labelSet = this.vertexLabelIndex.get(label);\n if (!labelSet) {\n labelSet = new Set();\n this.vertexLabelIndex.set(label, labelSet);\n }\n labelSet.add(vertexId);\n }\n\n removeVertex(vertexId: number, label: string): void {\n this.vertexIds.delete(vertexId);\n this.adjOut.delete(vertexId);\n this.adjIn.delete(vertexId);\n // Remove from all adj lists\n for (const [, outSet] of this.adjOut) {\n outSet.delete(vertexId);\n }\n for (const [, inSet] of this.adjIn) {\n inSet.delete(vertexId);\n }\n const labelSet = this.vertexLabelIndex.get(label);\n if (labelSet) {\n labelSet.delete(vertexId);\n if (labelSet.size === 0) {\n this.vertexLabelIndex.delete(label);\n }\n }\n }\n\n addEdge(edgeId: number, sourceId: number, targetId: number, label: string): void {\n this.edgeIds.add(edgeId);\n let outSet = this.adjOut.get(sourceId);\n if (!outSet) {\n outSet = new Set();\n this.adjOut.set(sourceId, outSet);\n }\n outSet.add(edgeId);\n\n let inSet = this.adjIn.get(targetId);\n if (!inSet) {\n inSet = new Set();\n this.adjIn.set(targetId, inSet);\n }\n inSet.add(edgeId);\n\n let edgeSet = this.labelIndex.get(label);\n if (!edgeSet) {\n edgeSet = new Set();\n this.labelIndex.set(label, edgeSet);\n }\n edgeSet.add(edgeId);\n }\n\n removeEdge(edgeId: number, sourceId: number, targetId: number, label: string): void {\n this.edgeIds.delete(edgeId);\n const outSet = this.adjOut.get(sourceId);\n if (outSet) {\n outSet.delete(edgeId);\n }\n const inSet = this.adjIn.get(targetId);\n if (inSet) {\n inSet.delete(edgeId);\n }\n const edgeSet = this.labelIndex.get(label);\n if (edgeSet) {\n edgeSet.delete(edgeId);\n if (edgeSet.size === 0) {\n this.labelIndex.delete(label);\n }\n }\n }\n\n neighbors(\n vertexId: number,\n edges: Map<number, Edge>,\n label: string | null,\n direction: \"out\" | \"in\",\n ): number[] {\n const result: number[] = [];\n if (direction === \"out\") {\n const outSet = this.adjOut.get(vertexId);\n if (outSet) {\n for (const edgeId of outSet) {\n const edge = edges.get(edgeId);\n if (edge && (label === null || edge.label === label)) {\n result.push(edge.targetId);\n }\n }\n }\n } else {\n const inSet = this.adjIn.get(vertexId);\n if (inSet) {\n for (const edgeId of inSet) {\n const edge = edges.get(edgeId);\n if (edge && (label === null || edge.label === label)) {\n result.push(edge.sourceId);\n }\n }\n }\n }\n return result;\n }\n\n verticesByLabel(label: string): Set<number> {\n return this.vertexLabelIndex.get(label) ?? new Set();\n }\n}\n\n// -- MemoryGraphStore ---------------------------------------------------------\n\nexport class MemoryGraphStore extends GraphStore {\n private _vertices: Map<number, Vertex> = new Map();\n private _edges: Map<number, Edge> = new Map();\n private _graphs: Map<string, _GraphPartition> = new Map();\n private _vertexMembership: Map<number, Set<string>> = new Map();\n private _edgeMembership: Map<number, Set<string>> = new Map();\n private _nextVertexId: number = 0;\n private _nextEdgeId: number = 0;\n\n // -- Graph lifecycle --------------------------------------------------------\n\n createGraph(name: string): void {\n if (!this._graphs.has(name)) {\n this._graphs.set(name, new _GraphPartition());\n }\n }\n\n dropGraph(name: string): void {\n const partition = this._graphs.get(name);\n if (!partition) return;\n\n // Clean up membership\n for (const vid of partition.vertexIds) {\n const membership = this._vertexMembership.get(vid);\n if (membership) {\n membership.delete(name);\n if (membership.size === 0) {\n this._vertexMembership.delete(vid);\n }\n }\n }\n for (const eid of partition.edgeIds) {\n const membership = this._edgeMembership.get(eid);\n if (membership) {\n membership.delete(name);\n if (membership.size === 0) {\n this._edgeMembership.delete(eid);\n }\n }\n }\n\n this._graphs.delete(name);\n }\n\n graphNames(): string[] {\n return [...this._graphs.keys()];\n }\n\n hasGraph(name: string): boolean {\n return this._graphs.has(name);\n }\n\n // -- Graph algebra ----------------------------------------------------------\n\n unionGraphs(g1: string, g2: string, target: string): void {\n this.createGraph(target);\n const src1 = this._graphs.get(g1);\n const src2 = this._graphs.get(g2);\n\n if (src1) {\n for (const vid of src1.vertexIds) {\n const vertex = this._vertices.get(vid);\n if (vertex) this.addVertex(vertex, target);\n }\n for (const eid of src1.edgeIds) {\n const edge = this._edges.get(eid);\n if (edge) this.addEdge(edge, target);\n }\n }\n if (src2) {\n for (const vid of src2.vertexIds) {\n const vertex = this._vertices.get(vid);\n if (vertex) this.addVertex(vertex, target);\n }\n for (const eid of src2.edgeIds) {\n const edge = this._edges.get(eid);\n if (edge) this.addEdge(edge, target);\n }\n }\n }\n\n intersectGraphs(g1: string, g2: string, target: string): void {\n this.createGraph(target);\n const src1 = this._graphs.get(g1);\n const src2 = this._graphs.get(g2);\n if (!src1 || !src2) return;\n\n for (const vid of src1.vertexIds) {\n if (src2.vertexIds.has(vid)) {\n const vertex = this._vertices.get(vid);\n if (vertex) this.addVertex(vertex, target);\n }\n }\n for (const eid of src1.edgeIds) {\n if (src2.edgeIds.has(eid)) {\n const edge = this._edges.get(eid);\n if (edge) this.addEdge(edge, target);\n }\n }\n }\n\n differenceGraphs(g1: string, g2: string, target: string): void {\n this.createGraph(target);\n const src1 = this._graphs.get(g1);\n const src2 = this._graphs.get(g2);\n if (!src1) return;\n\n const excludeV = src2 ? src2.vertexIds : new Set<number>();\n const excludeE = src2 ? src2.edgeIds : new Set<number>();\n\n for (const vid of src1.vertexIds) {\n if (!excludeV.has(vid)) {\n const vertex = this._vertices.get(vid);\n if (vertex) this.addVertex(vertex, target);\n }\n }\n for (const eid of src1.edgeIds) {\n if (!excludeE.has(eid)) {\n const edge = this._edges.get(eid);\n if (edge) this.addEdge(edge, target);\n }\n }\n }\n\n copyGraph(source: string, target: string): void {\n this.createGraph(target);\n const src = this._graphs.get(source);\n if (!src) return;\n\n for (const vid of src.vertexIds) {\n const vertex = this._vertices.get(vid);\n if (vertex) this.addVertex(vertex, target);\n }\n for (const eid of src.edgeIds) {\n const edge = this._edges.get(eid);\n if (edge) this.addEdge(edge, target);\n }\n }\n\n // -- Mutation ---------------------------------------------------------------\n\n addVertex(vertex: Vertex, graph: string): void {\n this._vertices.set(vertex.vertexId, vertex);\n if (vertex.vertexId >= this._nextVertexId) {\n this._nextVertexId = vertex.vertexId + 1;\n }\n\n const partition = this._graphs.get(graph);\n if (partition) {\n partition.addVertex(vertex.vertexId, vertex.label);\n }\n\n let membership = this._vertexMembership.get(vertex.vertexId);\n if (!membership) {\n membership = new Set();\n this._vertexMembership.set(vertex.vertexId, membership);\n }\n membership.add(graph);\n }\n\n addEdge(edge: Edge, graph: string): void {\n this._edges.set(edge.edgeId, edge);\n if (edge.edgeId >= this._nextEdgeId) {\n this._nextEdgeId = edge.edgeId + 1;\n }\n\n const partition = this._graphs.get(graph);\n if (partition) {\n partition.addEdge(edge.edgeId, edge.sourceId, edge.targetId, edge.label);\n }\n\n let membership = this._edgeMembership.get(edge.edgeId);\n if (!membership) {\n membership = new Set();\n this._edgeMembership.set(edge.edgeId, membership);\n }\n membership.add(graph);\n }\n\n removeVertex(vertexId: number, graph: string): void {\n const vertex = this._vertices.get(vertexId);\n if (!vertex) return;\n\n const partition = this._graphs.get(graph);\n if (partition) {\n // Remove edges incident to this vertex in this graph\n const edgesToRemove: number[] = [];\n const outSet = partition.adjOut.get(vertexId);\n if (outSet) {\n for (const eid of outSet) edgesToRemove.push(eid);\n }\n const inSet = partition.adjIn.get(vertexId);\n if (inSet) {\n for (const eid of inSet) edgesToRemove.push(eid);\n }\n for (const eid of edgesToRemove) {\n this.removeEdge(eid, graph);\n }\n partition.removeVertex(vertexId, vertex.label);\n }\n\n const membership = this._vertexMembership.get(vertexId);\n if (membership) {\n membership.delete(graph);\n if (membership.size === 0) {\n this._vertexMembership.delete(vertexId);\n this._vertices.delete(vertexId);\n }\n }\n }\n\n removeEdge(edgeId: number, graph: string): void {\n const edge = this._edges.get(edgeId);\n if (!edge) return;\n\n const partition = this._graphs.get(graph);\n if (partition) {\n partition.removeEdge(edgeId, edge.sourceId, edge.targetId, edge.label);\n }\n\n const membership = this._edgeMembership.get(edgeId);\n if (membership) {\n membership.delete(graph);\n if (membership.size === 0) {\n this._edgeMembership.delete(edgeId);\n this._edges.delete(edgeId);\n }\n }\n }\n\n // -- Query ------------------------------------------------------------------\n\n neighbors(\n vertexId: number,\n graph: string,\n label?: string | null,\n direction?: \"out\" | \"in\",\n ): number[] {\n const partition = this._graphs.get(graph);\n if (!partition) return [];\n return partition.neighbors(\n vertexId,\n this._edges,\n label ?? null,\n direction ?? \"out\",\n );\n }\n\n verticesByLabel(label: string, graph: string): Vertex[] {\n const partition = this._graphs.get(graph);\n if (!partition) return [];\n const ids = partition.verticesByLabel(label);\n const result: Vertex[] = [];\n for (const vid of ids) {\n const v = this._vertices.get(vid);\n if (v) result.push(v);\n }\n return result;\n }\n\n verticesInGraph(graph: string): Vertex[] {\n const partition = this._graphs.get(graph);\n if (!partition) return [];\n const result: Vertex[] = [];\n for (const vid of partition.vertexIds) {\n const v = this._vertices.get(vid);\n if (v) result.push(v);\n }\n return result;\n }\n\n edgesInGraph(graph: string): Edge[] {\n const partition = this._graphs.get(graph);\n if (!partition) return [];\n const result: Edge[] = [];\n for (const eid of partition.edgeIds) {\n const e = this._edges.get(eid);\n if (e) result.push(e);\n }\n return result;\n }\n\n vertexGraphs(vertexId: number): Set<string> {\n return this._vertexMembership.get(vertexId) ?? new Set();\n }\n\n // -- Graph-scoped adjacency -------------------------------------------------\n\n outEdgeIds(vertexId: number, graph: string): Set<number> {\n const partition = this._graphs.get(graph);\n if (!partition) return new Set();\n return partition.adjOut.get(vertexId) ?? new Set();\n }\n\n inEdgeIds(vertexId: number, graph: string): Set<number> {\n const partition = this._graphs.get(graph);\n if (!partition) return new Set();\n return partition.adjIn.get(vertexId) ?? new Set();\n }\n\n edgeIdsByLabel(label: string, graph: string): Set<number> {\n const partition = this._graphs.get(graph);\n if (!partition) return new Set();\n return partition.labelIndex.get(label) ?? new Set();\n }\n\n vertexIdsInGraph(graph: string): Set<number> {\n const partition = this._graphs.get(graph);\n if (!partition) return new Set();\n return new Set(partition.vertexIds);\n }\n\n // -- Statistics -------------------------------------------------------------\n\n degreeDistribution(graph: string): Map<number, number> {\n const partition = this._graphs.get(graph);\n if (!partition) return new Map();\n const dist = new Map<number, number>();\n for (const vid of partition.vertexIds) {\n const outSet = partition.adjOut.get(vid);\n const inSet = partition.adjIn.get(vid);\n const degree = (outSet ? outSet.size : 0) + (inSet ? inSet.size : 0);\n dist.set(degree, (dist.get(degree) ?? 0) + 1);\n }\n return dist;\n }\n\n labelDegree(label: string, graph: string): number {\n const partition = this._graphs.get(graph);\n if (!partition) return 0;\n const edgeSet = partition.labelIndex.get(label);\n return edgeSet ? edgeSet.size : 0;\n }\n\n vertexLabelCounts(graph: string): Map<string, number> {\n const partition = this._graphs.get(graph);\n if (!partition) return new Map();\n const counts = new Map<string, number>();\n for (const [label, ids] of partition.vertexLabelIndex) {\n counts.set(label, ids.size);\n }\n return counts;\n }\n\n // -- Global accessors -------------------------------------------------------\n\n getVertex(vertexId: number): Vertex | null {\n return this._vertices.get(vertexId) ?? null;\n }\n\n getEdge(edgeId: number): Edge | null {\n return this._edges.get(edgeId) ?? null;\n }\n\n nextVertexId(): number {\n return this._nextVertexId++;\n }\n\n nextEdgeId(): number {\n return this._nextEdgeId++;\n }\n\n clear(): void {\n this._vertices.clear();\n this._edges.clear();\n this._graphs.clear();\n this._vertexMembership.clear();\n this._edgeMembership.clear();\n this._nextVertexId = 0;\n this._nextEdgeId = 0;\n }\n\n get vertices(): Map<number, Vertex> {\n return this._vertices;\n }\n\n get edges(): Map<number, Edge> {\n return this._edges;\n }\n\n get vertexCount(): number {\n return this._vertices.size;\n }\n\n get edgeCount(): number {\n return this._edges.size;\n }\n\n // -- Bulk mutation ----------------------------------------------------------\n\n addVertices(vertices: Vertex[], graph: string): void {\n for (const v of vertices) {\n this.addVertex(v, graph);\n }\n }\n\n addEdges(edges: Edge[], graph: string): void {\n for (const e of edges) {\n this.addEdge(e, graph);\n }\n }\n\n // -- Property access -------------------------------------------------------\n\n vertexProperty(vertexId: number, key: string): unknown {\n const v = this._vertices.get(vertexId);\n if (v === undefined) return undefined;\n return v.properties[key];\n }\n\n setVertexProperty(vertexId: number, key: string, value: unknown): void {\n const v = this._vertices.get(vertexId);\n if (v === undefined) throw new Error(`Vertex ${String(vertexId)} not found`);\n (v.properties as Record<string, unknown>)[key] = value;\n }\n\n edgeProperty(edgeId: number, key: string): unknown {\n const e = this._edges.get(edgeId);\n if (e === undefined) return undefined;\n return e.properties[key];\n }\n\n setEdgeProperty(edgeId: number, key: string, value: unknown): void {\n const e = this._edges.get(edgeId);\n if (e === undefined) throw new Error(`Edge ${String(edgeId)} not found`);\n (e.properties as Record<string, unknown>)[key] = value;\n }\n\n // -- Label queries ---------------------------------------------------------\n\n edgesByLabel(label: string, graph: string): Edge[] {\n const result: Edge[] = [];\n const graphSet = this._graphs.get(graph);\n if (!graphSet) return result;\n for (const [eid, e] of this._edges) {\n if (e.label === label) {\n const membership = this._edgeMembership.get(eid);\n if (membership && membership.has(graph)) {\n result.push(e);\n }\n }\n }\n return result;\n }\n\n vertexLabels(graph: string): Set<string> {\n const labels = new Set<string>();\n for (const v of this.verticesInGraph(graph)) {\n if (v.label) labels.add(v.label);\n }\n return labels;\n }\n\n edgeLabels(graph: string): Set<string> {\n const labels = new Set<string>();\n for (const e of this.edgesInGraph(graph)) {\n labels.add(e.label);\n }\n return labels;\n }\n\n // -- Degree queries --------------------------------------------------------\n\n outDegree(vertexId: number, graph: string): number {\n return this.outEdgeIds(vertexId, graph).size;\n }\n\n inDegree(vertexId: number, graph: string): number {\n return this.inEdgeIds(vertexId, graph).size;\n }\n\n // -- Edge-centric queries --------------------------------------------------\n\n edgesBetween(\n sourceId: number,\n targetId: number,\n graph: string,\n label?: string | null,\n ): Edge[] {\n const result: Edge[] = [];\n const outEdges = this.outEdgeIds(sourceId, graph);\n for (const eid of outEdges) {\n const edge = this._edges.get(eid);\n if (edge && edge.targetId === targetId) {\n if (label === null || label === undefined || edge.label === label) {\n result.push(edge);\n }\n }\n }\n return result;\n }\n\n // -- Subgraph extraction ---------------------------------------------------\n\n subgraph(vertexIds: Set<number>, graph: string, target: string): void {\n if (!this._graphs.has(target)) {\n this.createGraph(target);\n }\n for (const vid of vertexIds) {\n const v = this._vertices.get(vid);\n if (v) {\n this.addVertex(v, target);\n }\n }\n for (const [eid, e] of this._edges) {\n const membership = this._edgeMembership.get(eid);\n if (membership && membership.has(graph)) {\n if (vertexIds.has(e.sourceId) && vertexIds.has(e.targetId)) {\n this.addEdge(e, target);\n }\n }\n }\n }\n\n // -- Temporal support -------------------------------------------------------\n\n minTimestamp(graph: string): number | null {\n let min: number | null = null;\n for (const e of this.edgesInGraph(graph)) {\n const ts = e.properties[\"timestamp\"];\n if (typeof ts === \"number\") {\n if (min === null || ts < min) min = ts;\n }\n }\n return min;\n }\n\n maxTimestamp(graph: string): number | null {\n let max: number | null = null;\n for (const e of this.edgesInGraph(graph)) {\n const ts = e.properties[\"timestamp\"];\n if (typeof ts === \"number\") {\n if (max === null || ts > max) max = ts;\n }\n }\n return max;\n }\n\n edgesInTimeRange(graph: string, startTime: number, endTime: number): Edge[] {\n const result: Edge[] = [];\n for (const e of this.edgesInGraph(graph)) {\n const ts = e.properties[\"timestamp\"];\n if (typeof ts === \"number\" && ts >= startTime && ts <= endTime) {\n result.push(e);\n }\n }\n return result;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- BM25 scorer\n// 1:1 port of uqa/scoring/bm25.py\n\nimport type { IndexStats } from \"../core/types.js\";\n\nexport interface BM25Params {\n readonly k1: number;\n readonly b: number;\n readonly boost: number;\n}\n\nexport function createBM25Params(opts?: Partial<BM25Params>): BM25Params {\n return {\n k1: opts?.k1 ?? 1.2,\n b: opts?.b ?? 0.75,\n boost: opts?.boost ?? 1.0,\n };\n}\n\nexport class BM25Scorer {\n private readonly _params: BM25Params;\n private readonly _totalDocs: number;\n private readonly _avgDocLength: number;\n\n constructor(params: BM25Params, indexStats: IndexStats) {\n this._params = params;\n this._totalDocs = indexStats.totalDocs;\n this._avgDocLength = indexStats.avgDocLength;\n }\n\n get params(): BM25Params {\n return this._params;\n }\n\n idf(docFreq: number): number {\n const n = this._totalDocs;\n return Math.log((n - docFreq + 0.5) / (docFreq + 0.5) + 1);\n }\n\n score(termFreq: number, docLength: number, docFreq: number): number {\n return this.scoreWithIdf(termFreq, docLength, this.idf(docFreq));\n }\n\n scoreWithIdf(termFreq: number, docLength: number, idfVal: number): number {\n const { k1, b, boost } = this._params;\n const w = boost * idfVal;\n const avgdl = this._avgDocLength > 0 ? this._avgDocLength : 1;\n const invNorm = 1 / (k1 * (1 - b + (b * docLength) / avgdl));\n return w - w / (1 + termFreq * invNorm);\n }\n\n combineScores(scores: number[]): number {\n let sum = 0;\n for (const s of scores) {\n sum += s;\n }\n return sum;\n }\n\n upperBound(docFreq: number): number {\n return this._params.boost * this.idf(docFreq);\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Bayesian BM25 scorer\n// 1:1 port of uqa/scoring/bayesian_bm25.py\n// Delegates to bayesian-bm25 npm package\n\nimport { BayesianProbabilityTransform, logOddsConjunction } from \"bayesian-bm25\";\nimport type { IndexStats } from \"../core/types.js\";\nimport type { BM25Params } from \"./bm25.js\";\nimport { BM25Scorer, createBM25Params } from \"./bm25.js\";\n\nexport interface BayesianBM25Params {\n readonly bm25: BM25Params;\n readonly alpha: number;\n readonly beta: number;\n readonly baseRate: number;\n}\n\nexport function createBayesianBM25Params(\n opts?: Partial<BayesianBM25Params>,\n): BayesianBM25Params {\n return {\n bm25: opts?.bm25 ?? createBM25Params(),\n alpha: opts?.alpha ?? 1.0,\n beta: opts?.beta ?? 0.0,\n baseRate: opts?.baseRate ?? 0.5,\n };\n}\n\nexport class BayesianBM25Scorer {\n private readonly _bm25: BM25Scorer;\n private readonly _transform: BayesianProbabilityTransform;\n\n constructor(params: BayesianBM25Params, indexStats: IndexStats) {\n this._bm25 = new BM25Scorer(params.bm25, indexStats);\n this._transform = new BayesianProbabilityTransform(\n params.alpha,\n params.beta,\n params.baseRate === 0.5 ? null : params.baseRate,\n );\n }\n\n get bm25(): BM25Scorer {\n return this._bm25;\n }\n\n idf(docFreq: number): number {\n return this._bm25.idf(docFreq);\n }\n\n score(termFreq: number, docLength: number, docFreq: number): number {\n return this.scoreWithIdf(termFreq, docLength, this._bm25.idf(docFreq));\n }\n\n scoreWithIdf(termFreq: number, docLength: number, idfVal: number): number {\n const raw = this._bm25.scoreWithIdf(termFreq, docLength, idfVal);\n const avgdl = this._bm25.params.k1 > 0 ? docLength : 1;\n const docLenRatio = avgdl > 0 ? docLength / avgdl : 1.0;\n return this._transform.scoreToProbability(raw, termFreq, docLenRatio);\n }\n\n combineScores(scores: number[]): number {\n if (scores.length === 0) return 0.5;\n if (scores.length === 1) return scores[0]!;\n return logOddsConjunction(scores, 0.0);\n }\n\n upperBound(docFreq: number): number {\n const bm25Ub = this._bm25.upperBound(docFreq);\n return this._transform.wandUpperBound(bm25Ub);\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Operator base classes\n// 1:1 port of uqa/operators/base.py\n\nimport type { IndexStats } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { DocumentStore } from \"../storage/abc/document-store.js\";\nimport type { InvertedIndex } from \"../storage/abc/inverted-index.js\";\nimport type { VectorIndex } from \"../storage/vector-index.js\";\nimport type { SpatialIndex } from \"../storage/spatial-index.js\";\nimport type { BlockMaxIndex } from \"../storage/block-max-index.js\";\nimport type { IndexManager } from \"../storage/index-manager.js\";\n\nexport interface ExecutionContext {\n documentStore?: DocumentStore | null;\n invertedIndex?: InvertedIndex | null;\n vectorIndexes?: Record<string, VectorIndex>;\n spatialIndexes?: Record<string, SpatialIndex>;\n graphStore?: unknown;\n pathIndex?: unknown;\n blockMaxIndex?: BlockMaxIndex | null;\n indexManager?: IndexManager | null;\n parallelExecutor?: unknown;\n subgraphIndex?: unknown;\n}\n\nexport abstract class Operator {\n abstract execute(context: ExecutionContext): PostingList;\n\n compose(other: Operator): ComposedOperator {\n return new ComposedOperator([this, other]);\n }\n\n costEstimate(stats: IndexStats): number {\n return stats.totalDocs;\n }\n}\n\nexport class ComposedOperator extends Operator {\n readonly operators: Operator[];\n\n constructor(operators: Operator[]) {\n super();\n this.operators = operators;\n }\n\n execute(context: ExecutionContext): PostingList {\n let result: PostingList | null = null;\n for (const op of this.operators) {\n result = op.execute(context);\n }\n // Return last result, or empty if no operators\n if (result === null) {\n return new PostingList();\n }\n return result;\n }\n\n costEstimate(stats: IndexStats): number {\n let sum = 0;\n for (const op of this.operators) {\n sum += op.costEstimate(stats);\n }\n return sum;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- SpatialIndex\n// 1:1 port of uqa/storage/spatial_index.py\n// Browser version: in-memory brute force with haversine distance\n// (Python version uses SQLite R*Tree; we use Map + bounding box filter)\n\nimport type { DocId } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\n\nconst EARTH_RADIUS_M = 6_371_000.0; // WGS-84 mean radius\nconst METERS_PER_DEG_LAT = 111_320.0;\n\nfunction toRadians(deg: number): number {\n return (deg * Math.PI) / 180;\n}\n\nfunction toDegrees(rad: number): number {\n return (rad * 180) / Math.PI;\n}\n\nexport function haversineDistance(\n lat1: number,\n lon1: number,\n lat2: number,\n lon2: number,\n): number {\n const lat1Rad = toRadians(lat1);\n const lat2Rad = toRadians(lat2);\n const dlat = toRadians(lat2 - lat1);\n const dlon = toRadians(lon2 - lon1);\n const a =\n Math.sin(dlat / 2) ** 2 +\n Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.sin(dlon / 2) ** 2;\n return 2 * EARTH_RADIUS_M * Math.asin(Math.sqrt(a));\n}\n\ninterface Point {\n readonly x: number; // longitude\n readonly y: number; // latitude\n}\n\nexport class SpatialIndex {\n private readonly _tableName: string;\n private readonly _fieldName: string;\n private _points: Map<DocId, Point>;\n\n constructor(tableName: string, fieldName: string) {\n this._tableName = tableName;\n this._fieldName = fieldName;\n this._points = new Map();\n }\n\n get tableName(): string {\n return this._tableName;\n }\n\n get fieldName(): string {\n return this._fieldName;\n }\n\n add(docId: DocId, x: number, y: number): void {\n this._points.set(docId, { x, y });\n }\n\n delete(docId: DocId): void {\n this._points.delete(docId);\n }\n\n clear(): void {\n this._points.clear();\n }\n\n searchWithin(cx: number, cy: number, distanceM: number): PostingList {\n if (distanceM <= 0) return new PostingList();\n\n // Bounding box filter (coarse)\n const deltaLat = distanceM / METERS_PER_DEG_LAT;\n const angularDist = distanceM / EARTH_RADIUS_M;\n const cosLat = Math.cos(toRadians(cy));\n\n let deltaLon: number;\n if (cosLat < 1e-10 || angularDist >= Math.PI) {\n deltaLon = 180.0;\n } else {\n const sinRatio = Math.sin(angularDist) / cosLat;\n if (sinRatio >= 1.0) {\n deltaLon = 180.0;\n } else {\n deltaLon = toDegrees(Math.asin(sinRatio));\n }\n }\n\n const minX = cx - deltaLon;\n const maxX = cx + deltaLon;\n const minY = cy - deltaLat;\n const maxY = cy + deltaLat;\n\n // Fine filter with haversine\n const entries: {\n docId: DocId;\n payload: {\n positions: readonly number[];\n score: number;\n fields: Readonly<Record<string, unknown>>;\n };\n }[] = [];\n\n for (const [docId, pt] of this._points) {\n // Bounding box check\n if (pt.x < minX || pt.x > maxX || pt.y < minY || pt.y > maxY) continue;\n // Haversine check\n const dist = haversineDistance(cy, cx, pt.y, pt.x);\n if (dist <= distanceM) {\n const score = 1.0 - dist / distanceM;\n entries.push({ docId, payload: createPayload({ score }) });\n }\n }\n\n entries.sort((a, b) => a.docId - b.docId);\n return PostingList.fromSorted(entries);\n }\n\n count(): number {\n return this._points.size;\n }\n\n close(): void {\n // Release all point data (no private connection to close in browser).\n this._points.clear();\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- primitive operators\n// 1:1 port of uqa/operators/primitive.py\n\nimport type { DocId, IndexStats, Predicate } from \"../core/types.js\";\nimport { createPayload, isNullPredicate } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"./base.js\";\nimport { Operator } from \"./base.js\";\nimport type { Index } from \"../storage/index-abc.js\";\nimport { cosine, norm } from \"../math/linalg.js\";\nimport { haversineDistance } from \"../storage/spatial-index.js\";\n\n// -- Brute-force helpers -----------------------------------------------------\n\nfunction bruteForceknn(\n context: ExecutionContext,\n field: string,\n query: Float64Array,\n k: number,\n): PostingList {\n const docStore = context.documentStore;\n if (!docStore) return new PostingList();\n\n const qnorm = norm(query);\n if (qnorm === 0) return new PostingList();\n\n const scored: { docId: DocId; score: number }[] = [];\n for (const docId of docStore.docIds) {\n const vec = docStore.getField(docId, field);\n if (!vec || !(vec instanceof Float64Array)) continue;\n const vnorm = norm(vec);\n if (vnorm === 0) continue;\n const sim = cosine(query, vec);\n scored.push({ docId, score: sim });\n }\n\n scored.sort((a, b) => b.score - a.score);\n const top = scored.slice(0, k);\n return new PostingList(\n top.map((s) => ({ docId: s.docId, payload: createPayload({ score: s.score }) })),\n );\n}\n\nfunction bruteForceThreshold(\n context: ExecutionContext,\n field: string,\n query: Float64Array,\n threshold: number,\n): PostingList {\n const docStore = context.documentStore;\n if (!docStore) return new PostingList();\n\n const qnorm = norm(query);\n if (qnorm === 0) return new PostingList();\n\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n for (const docId of docStore.docIds) {\n const vec = docStore.getField(docId, field);\n if (!vec || !(vec instanceof Float64Array)) continue;\n const vnorm = norm(vec);\n if (vnorm === 0) continue;\n const sim = cosine(query, vec);\n if (sim >= threshold) {\n entries.push({ docId, payload: createPayload({ score: sim }) });\n }\n }\n return new PostingList(entries);\n}\n\n// -- TermOperator ------------------------------------------------------------\n\nexport class TermOperator extends Operator {\n readonly term: string;\n readonly field: string | null;\n\n constructor(term: string, field?: string | null) {\n super();\n this.term = term;\n this.field = field ?? null;\n }\n\n execute(context: ExecutionContext): PostingList {\n const idx = context.invertedIndex;\n if (!idx) return new PostingList();\n\n const analyzer = this.field ? idx.getSearchAnalyzer(this.field) : idx.analyzer;\n const tokens = analyzer.analyze(this.term);\n if (tokens.length === 0) return new PostingList();\n\n const lists = tokens.map((t) =>\n this.field ? idx.getPostingList(this.field, t) : idx.getPostingListAnyField(t),\n );\n\n let result = lists[0]!;\n for (let i = 1; i < lists.length; i++) {\n result = result.union(lists[i]!);\n }\n return result;\n }\n\n costEstimate(stats: IndexStats): number {\n if (this.field) return stats.docFreq(this.field, this.term);\n return stats.totalDocs;\n }\n}\n\n// -- VectorSimilarityOperator ------------------------------------------------\n\nexport class VectorSimilarityOperator extends Operator {\n readonly queryVector: Float64Array;\n readonly threshold: number;\n readonly field: string;\n\n constructor(queryVector: Float64Array, threshold: number, field = \"embedding\") {\n super();\n this.queryVector = queryVector;\n this.threshold = threshold;\n this.field = field;\n }\n\n execute(context: ExecutionContext): PostingList {\n const vecIdx = context.vectorIndexes?.[this.field];\n if (vecIdx) return vecIdx.searchThreshold(this.queryVector, this.threshold);\n return bruteForceThreshold(context, this.field, this.queryVector, this.threshold);\n }\n\n costEstimate(stats: IndexStats): number {\n return stats.dimensions * Math.log2(stats.totalDocs + 1);\n }\n}\n\n// -- KNNOperator -------------------------------------------------------------\n\nexport class KNNOperator extends Operator {\n readonly queryVector: Float64Array;\n readonly k: number;\n readonly field: string;\n\n constructor(queryVector: Float64Array, k: number, field = \"embedding\") {\n super();\n this.queryVector = queryVector;\n this.k = k;\n this.field = field;\n }\n\n execute(context: ExecutionContext): PostingList {\n const vecIdx = context.vectorIndexes?.[this.field];\n if (vecIdx) return vecIdx.searchKnn(this.queryVector, this.k);\n return bruteForceknn(context, this.field, this.queryVector, this.k);\n }\n\n costEstimate(stats: IndexStats): number {\n return stats.dimensions * Math.log2(stats.totalDocs + 1);\n }\n}\n\n// -- SpatialWithinOperator ---------------------------------------------------\n\nexport class SpatialWithinOperator extends Operator {\n readonly field: string;\n readonly centerX: number;\n readonly centerY: number;\n readonly distance: number;\n\n constructor(field: string, centerX: number, centerY: number, distance: number) {\n super();\n this.field = field;\n this.centerX = centerX;\n this.centerY = centerY;\n this.distance = distance;\n }\n\n execute(context: ExecutionContext): PostingList {\n const spIdx = context.spatialIndexes?.[this.field];\n if (spIdx) return spIdx.searchWithin(this.centerX, this.centerY, this.distance);\n return this._bruteForceScan(context);\n }\n\n private _bruteForceScan(context: ExecutionContext): PostingList {\n const docStore = context.documentStore;\n if (!docStore) return new PostingList();\n\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n const sortedIds = [...docStore.docIds].sort((a, b) => a - b);\n\n for (const docId of sortedIds) {\n const point = docStore.getField(docId, this.field) as\n | [number, number]\n | null\n | undefined;\n if (!point) continue;\n const dist = haversineDistance(this.centerY, this.centerX, point[1], point[0]);\n if (dist <= this.distance) {\n const score = this.distance > 0 ? 1.0 - dist / this.distance : 1.0;\n entries.push({ docId, payload: createPayload({ score }) });\n }\n }\n return PostingList.fromSorted(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return Math.log2(stats.totalDocs + 1);\n }\n}\n\n// -- FilterOperator ----------------------------------------------------------\n\nexport class FilterOperator extends Operator {\n readonly field: string;\n readonly predicate: Predicate;\n readonly source: Operator | null;\n\n constructor(field: string, predicate: Predicate, source?: Operator | null) {\n super();\n this.field = field;\n this.predicate = predicate;\n this.source = source ?? null;\n }\n\n execute(context: ExecutionContext): PostingList {\n const docStore = context.documentStore;\n if (!docStore) return new PostingList();\n\n const isNullAware = isNullPredicate(this.predicate);\n const hasBulk =\n typeof (docStore as unknown as { getFieldsBulk?: unknown }).getFieldsBulk ===\n \"function\";\n\n if (this.source) {\n const sourcePl = this.source.execute(context);\n const sourceEntries = [...sourcePl];\n if (hasBulk && sourceEntries.length > 1) {\n const docIds = sourceEntries.map((e) => e.docId);\n const valueMap = (\n docStore as unknown as {\n getFieldsBulk(ids: DocId[], field: string): Map<DocId, unknown>;\n }\n ).getFieldsBulk(docIds, this.field);\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] =\n [];\n for (const entry of sourceEntries) {\n const value = valueMap.get(entry.docId);\n const matched = isNullAware\n ? this.predicate.evaluate(value)\n : value !== null && value !== undefined && this.predicate.evaluate(value);\n if (matched) entries.push(entry);\n }\n return PostingList.fromSorted(entries);\n }\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n for (const entry of sourceEntries) {\n const value = docStore.getField(entry.docId, this.field);\n const matched = isNullAware\n ? this.predicate.evaluate(value)\n : value !== null && value !== undefined && this.predicate.evaluate(value);\n if (matched) entries.push(entry);\n }\n return PostingList.fromSorted(entries);\n }\n\n const sortedIds = [...docStore.docIds].sort((a, b) => a - b);\n if (hasBulk && sortedIds.length > 1) {\n const valueMap = (\n docStore as unknown as {\n getFieldsBulk(ids: DocId[], field: string): Map<DocId, unknown>;\n }\n ).getFieldsBulk(sortedIds, this.field);\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n for (const docId of sortedIds) {\n const value = valueMap.get(docId);\n const matched = isNullAware\n ? this.predicate.evaluate(value)\n : value !== null && value !== undefined && this.predicate.evaluate(value);\n if (matched) {\n entries.push({ docId, payload: createPayload({ score: 0.0 }) });\n }\n }\n return PostingList.fromSorted(entries);\n }\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n for (const docId of sortedIds) {\n const value = docStore.getField(docId, this.field);\n if (!isNullAware && (value === null || value === undefined)) continue;\n if (this.predicate.evaluate(value)) {\n entries.push({ docId, payload: createPayload({ score: 0.0 }) });\n }\n }\n return PostingList.fromSorted(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return stats.totalDocs;\n }\n}\n\n// -- FacetOperator -----------------------------------------------------------\n\nexport class FacetOperator extends Operator {\n readonly field: string;\n readonly source: Operator | null;\n\n constructor(field: string, source?: Operator | null) {\n super();\n this.field = field;\n this.source = source ?? null;\n }\n\n execute(context: ExecutionContext): PostingList {\n const docStore = context.documentStore;\n if (!docStore) return new PostingList();\n\n let docIds: DocId[];\n if (this.source) {\n const sourcePl = this.source.execute(context);\n docIds = sourcePl.entries.map((e) => e.docId);\n } else {\n docIds = [...docStore.docIds].sort((a, b) => a - b);\n }\n\n const counts = new Map<string, number>();\n for (const docId of docIds) {\n const value = docStore.getField(docId, this.field);\n if (value !== null && value !== undefined) {\n const key = String(value as string | number);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n }\n\n const sorted = [...counts.entries()].sort((a, b) => a[0].localeCompare(b[0]));\n const entries = sorted.map(([value, count], idx) => ({\n docId: idx,\n payload: createPayload({\n score: count,\n fields: {\n _facet_field: this.field,\n _facet_value: value,\n _facet_count: count,\n },\n }),\n }));\n return PostingList.fromSorted(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return stats.totalDocs;\n }\n}\n\n// -- ScoreOperator -----------------------------------------------------------\n\nexport class ScoreOperator extends Operator {\n readonly scorer: {\n score(termFreq: number, docLength: number, docFreq: number): number;\n idf?(docFreq: number): number;\n scoreWithIdf?(termFreq: number, docLength: number, idfVal: number): number;\n combineScores?(scores: number[]): number;\n };\n readonly source: Operator;\n readonly queryTerms: string[];\n readonly field: string | null;\n\n constructor(\n scorer: ScoreOperator[\"scorer\"],\n source: Operator,\n queryTerms: string[],\n field?: string | null,\n ) {\n super();\n this.scorer = scorer;\n this.source = source;\n this.queryTerms = queryTerms;\n this.field = field ?? null;\n }\n\n execute(context: ExecutionContext): PostingList {\n const sourcePl = this.source.execute(context);\n const idx = context.invertedIndex;\n if (!idx) return sourcePl;\n\n const hasIdf =\n typeof this.scorer.idf === \"function\" &&\n typeof this.scorer.scoreWithIdf === \"function\";\n const hasCombine = typeof this.scorer.combineScores === \"function\";\n\n // Pre-compute IDF values\n const idfs: number[] = [];\n if (hasIdf) {\n for (const term of this.queryTerms) {\n const df = this.field\n ? idx.docFreq(this.field, term)\n : idx.docFreqAnyField(term);\n idfs.push(this.scorer.idf!(df));\n }\n }\n\n const entries = sourcePl.entries;\n const docIds = entries.map((e) => e.docId);\n const hasBulk = typeof idx.getDocLengthsBulk === \"function\";\n\n // Bulk prefetch doc lengths\n let dlMap: Map<DocId, number> | null = null;\n if (hasBulk && this.field !== null) {\n dlMap = idx.getDocLengthsBulk(docIds, this.field);\n }\n\n // Bulk prefetch term frequencies per term\n const tfMaps: Map<DocId, number>[] = [];\n if (hasBulk && this.field !== null) {\n for (const term of this.queryTerms) {\n tfMaps.push(idx.getTermFreqsBulk(docIds, this.field, term));\n }\n }\n\n const result: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n\n for (const entry of entries) {\n const perTermScores: number[] = [];\n let dl: number;\n if (dlMap !== null) {\n dl = dlMap.get(entry.docId) ?? 0;\n } else if (this.field !== null) {\n dl = idx.getDocLength(entry.docId, this.field);\n } else {\n dl = idx.getTotalDocLength(entry.docId);\n }\n\n for (let t = 0; t < this.queryTerms.length; t++) {\n const term = this.queryTerms[t]!;\n let tf: number;\n if (tfMaps.length > 0) {\n tf = tfMaps[t]!.get(entry.docId) ?? 0;\n } else if (this.field !== null) {\n tf = idx.getTermFreq(entry.docId, this.field, term);\n } else {\n tf = idx.getTotalTermFreq(entry.docId, term);\n }\n\n if (hasIdf) {\n perTermScores.push(this.scorer.scoreWithIdf!(tf, dl, idfs[t]!));\n } else {\n const df = this.field\n ? idx.docFreq(this.field, term)\n : idx.docFreqAnyField(term);\n perTermScores.push(this.scorer.score(tf, dl, df));\n }\n }\n\n const totalScore = hasCombine\n ? this.scorer.combineScores!(perTermScores)\n : perTermScores.reduce((a, b) => a + b, 0);\n\n result.push({\n docId: entry.docId,\n payload: createPayload({\n positions: entry.payload.positions as number[],\n score: totalScore,\n fields: entry.payload.fields as Record<string, unknown>,\n }),\n });\n }\n\n return PostingList.fromSorted(result);\n }\n}\n\n// -- IndexScanOperator -------------------------------------------------------\n\nexport class IndexScanOperator extends Operator {\n readonly index: Index;\n readonly field: string;\n readonly predicate: Predicate;\n\n constructor(index: Index, field: string, predicate: Predicate) {\n super();\n this.index = index;\n this.field = field;\n this.predicate = predicate;\n }\n\n execute(_context: ExecutionContext): PostingList {\n return this.index.scan(this.predicate);\n }\n\n costEstimate(_stats: IndexStats): number {\n return this.index.scanCost(this.predicate);\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- boolean operators\n// 1:1 port of uqa/operators/boolean.py\n\nimport type { IndexStats } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"./base.js\";\nimport { Operator } from \"./base.js\";\n\nexport class UnionOperator extends Operator {\n readonly operands: Operator[];\n\n constructor(operands: Operator[]) {\n super();\n this.operands = operands;\n }\n\n execute(context: ExecutionContext): PostingList {\n const results = this.operands.map((op) => op.execute(context));\n let acc = new PostingList();\n for (const r of results) {\n acc = acc.union(r);\n }\n return acc;\n }\n\n costEstimate(stats: IndexStats): number {\n let sum = 0;\n for (const op of this.operands) {\n sum += op.costEstimate(stats);\n }\n return sum;\n }\n}\n\nexport class IntersectOperator extends Operator {\n readonly operands: Operator[];\n\n constructor(operands: Operator[]) {\n super();\n this.operands = operands;\n }\n\n execute(context: ExecutionContext): PostingList {\n if (this.operands.length === 0) return new PostingList();\n\n let acc = this.operands[0]!.execute(context);\n for (let i = 1; i < this.operands.length; i++) {\n if (acc.length === 0) return acc;\n acc = acc.intersect(this.operands[i]!.execute(context));\n }\n return acc;\n }\n\n costEstimate(stats: IndexStats): number {\n if (this.operands.length === 0) return 0;\n let min = Infinity;\n for (const op of this.operands) {\n const c = op.costEstimate(stats);\n if (c < min) min = c;\n }\n return min;\n }\n}\n\nexport class ComplementOperator extends Operator {\n readonly operand: Operator;\n\n constructor(operand: Operator) {\n super();\n this.operand = operand;\n }\n\n execute(context: ExecutionContext): PostingList {\n const result = this.operand.execute(context);\n const docStore = context.documentStore;\n if (!docStore) return new PostingList();\n\n const universal = PostingList.fromSorted(\n [...docStore.docIds]\n .sort((a, b) => a - b)\n .map((docId) => ({ docId, payload: createPayload({ score: 0.0 }) })),\n );\n return result.complement(universal);\n }\n\n costEstimate(stats: IndexStats): number {\n return stats.totalDocs;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- calibrated vector operator\n// 1:1 port of uqa/operators/calibrated_vector.py\n//\n// Performs KNN or threshold vector search, then transforms the raw cosine\n// similarities into calibrated relevance probabilities via the likelihood\n// ratio framework. Importance weights come from one of:\n//\n// 1. External BM25 probabilities (cross-modal, Section 4.3)\n// 2. IVF cell-density prior (Strategy 4.6.2)\n// 3. Distance gap detection (Strategy 4.6.1)\n// 4. Uniform weights (fallback)\n\nimport type { DocId, IndexStats, PostingEntry } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"./base.js\";\nimport { Operator } from \"./base.js\";\nimport { TermOperator, ScoreOperator } from \"./primitive.js\";\nimport {\n BayesianBM25Scorer,\n createBayesianBM25Params,\n} from \"../scoring/bayesian-bm25.js\";\n\n/**\n * IVF background stats: distance distribution parameters (mu_G, sigma_G).\n */\nexport interface IVFBackgroundStats {\n mu: number;\n sigma: number;\n}\n\n/**\n * Minimal interface for VectorProbabilityTransform calibration.\n * Full implementation is delegated to the bayesian-bm25 package.\n */\nexport interface VectorProbabilityTransformLike {\n calibrate(\n distances: number[],\n opts?: {\n weights?: number[] | null;\n method?: string;\n bandwidthFactor?: number;\n densityPrior?: number[] | null;\n },\n ): number[];\n}\n\n/**\n * Compute IVF density prior weight for a single cell.\n *\n * w(c) = (pop(c) / avg_pop)^gamma\n *\n * High-population cells produce a higher prior because they\n * represent denser regions of the embedding space.\n */\nexport function ivfDensityPrior(cellPop: number, avgPop: number, gamma = 1.0): number {\n if (avgPop <= 0) return 1.0;\n return Math.pow(cellPop / avgPop, gamma);\n}\n\n/**\n * Fit a VectorProbabilityTransform from background distance samples.\n *\n * Returns a transform object that can calibrate new distances into\n * probabilities. This is a simplified JS implementation.\n */\nexport function fitBackgroundTransform(\n bgDistances: number[],\n baseRate = 0.5,\n): VectorProbabilityTransformLike {\n // Compute background statistics\n const n = bgDistances.length;\n if (n === 0) {\n return {\n calibrate(distances: number[]): number[] {\n return distances.map(() => baseRate);\n },\n };\n }\n\n let sum = 0;\n for (let i = 0; i < n; i++) {\n sum += bgDistances[i]!;\n }\n const mu = sum / n;\n\n let sumSq = 0;\n for (let i = 0; i < n; i++) {\n const d = bgDistances[i]! - mu;\n sumSq += d * d;\n }\n const sigma = Math.max(Math.sqrt(sumSq / n), 1e-10);\n\n return {\n calibrate(\n distances: number[],\n opts?: {\n weights?: number[] | null;\n method?: string;\n bandwidthFactor?: number;\n densityPrior?: number[] | null;\n },\n ): number[] {\n const bwFactor = opts?.bandwidthFactor ?? 1.0;\n const densityPrior = opts?.densityPrior ?? null;\n\n // Silverman bandwidth: h = 1.06 * sigma * n^{-1/5}\n const h = 1.06 * sigma * Math.pow(n, -0.2) * bwFactor;\n\n return distances.map((dist, i) => {\n // Gaussian kernel density at dist relative to background\n const z = (dist - mu) / Math.max(h, 1e-10);\n const bgDensity = Math.exp(-0.5 * z * z) / (Math.sqrt(2 * Math.PI) * h);\n\n // Likelihood ratio approximation\n // f_R estimated from the observed distances (self-density)\n const fR = bgDensity * 2.0; // proxy: closer distances should have higher f_R\n\n // Apply density prior if available\n let prior = baseRate;\n if (densityPrior !== null && i < densityPrior.length) {\n prior = Math.min(Math.max(densityPrior[i]! * baseRate, 0.01), 0.99);\n }\n\n // Bayesian update: P(R|d) = f_R * prior / (f_R * prior + f_G * (1-prior))\n const numerator = fR * prior;\n const denominator = numerator + bgDensity * (1 - prior);\n if (denominator <= 0) return prior;\n return Math.min(Math.max(numerator / denominator, 0.001), 0.999);\n });\n },\n };\n}\n\n/**\n * Cross-modal BM25 importance weights (Section 4.3).\n *\n * Uses the Bayesian BM25 scoring pipeline to produce calibrated posterior\n * probabilities P(R=1|s) for each document.\n */\nfunction bm25Weights(\n results: PostingEntry[],\n context: ExecutionContext,\n bm25Query: string | null,\n bm25Field: string | null,\n): number[] {\n const n = results.length;\n const weights = new Array<number>(n).fill(0.01);\n\n const invIdx = context.invertedIndex;\n if (invIdx === null || invIdx === undefined || bm25Query === null) {\n return weights;\n }\n\n const field = bm25Field ?? \"\";\n const scorer = new BayesianBM25Scorer(createBayesianBM25Params(), invIdx.stats);\n const terms = bm25Query\n .toLowerCase()\n .split(/\\s+/)\n .filter((t) => t.length > 0);\n if (terms.length === 0) return weights;\n\n const termOp = new TermOperator(bm25Query, field || null);\n const scoreOp = new ScoreOperator(scorer, termOp, terms, field || null);\n const scoredPl = scoreOp.execute(context);\n\n const bm25Map = new Map<number, number>();\n for (const entry of scoredPl) {\n bm25Map.set(entry.docId, entry.payload.score);\n }\n\n for (let i = 0; i < results.length; i++) {\n const w = bm25Map.get(results[i]!.docId) ?? 0.01;\n weights[i] = Math.min(Math.max(w, 0.01), 0.99);\n }\n\n return weights;\n}\n\nexport class CalibratedVectorOperator extends Operator {\n readonly queryVector: Float64Array;\n readonly k: number;\n readonly field: string;\n readonly estimationMethod: string;\n readonly baseRate: number;\n readonly weightSource: string;\n readonly bm25Query: string | null;\n readonly bm25Field: string | null;\n readonly densityGamma: number;\n readonly bandwidthScale: number;\n\n constructor(\n queryVector: Float64Array,\n k: number,\n field = \"embedding\",\n estimationMethod = \"kde\",\n baseRate = 0.5,\n weightSource = \"density_prior\",\n bm25Query?: string | null,\n bm25Field?: string | null,\n densityGamma = 1.0,\n bandwidthScale = 1.0,\n ) {\n super();\n this.queryVector = queryVector;\n this.k = k;\n this.field = field;\n this.estimationMethod = estimationMethod;\n this.baseRate = baseRate;\n this.weightSource = weightSource;\n this.bm25Query = bm25Query ?? null;\n this.bm25Field = bm25Field ?? null;\n this.densityGamma = densityGamma;\n this.bandwidthScale = bandwidthScale;\n }\n\n execute(context: ExecutionContext): PostingList {\n const vecIdx = context.vectorIndexes?.[this.field];\n if (vecIdx === undefined) {\n return new PostingList();\n }\n\n // 1. Retrieve raw top-K results.\n const rawResults = vecIdx.searchKnn(this.queryVector, this.k);\n if (rawResults.length === 0) {\n return rawResults;\n }\n\n // 2. Extract entries, similarities, and convert to distances.\n const rawEntries: PostingEntry[] = [];\n const docIds: DocId[] = [];\n const similarities: number[] = [];\n for (const entry of rawResults) {\n rawEntries.push(entry);\n docIds.push(entry.docId);\n similarities.push(entry.payload.score);\n }\n const distances = similarities.map((s) => 1.0 - s);\n\n // 3. Obtain background distances for f_G estimation.\n type IVFLike = {\n probedDistances?(query: Float64Array): number[] | null;\n backgroundSamples?: number[] | null;\n cellPopulations?(): Map<number, number>;\n totalVectors?: number;\n nlist?: number;\n };\n let ivf: IVFLike | null = null;\n let bgDistances: number[] | null = null;\n\n const vecIdxAny = vecIdx as unknown as IVFLike;\n if (typeof vecIdxAny.probedDistances === \"function\") {\n ivf = vecIdxAny;\n const probed = vecIdxAny.probedDistances(this.queryVector);\n if (probed !== null && probed.length > 0) {\n bgDistances = Array.isArray(probed) ? probed : Array.from(probed);\n }\n }\n\n if (\n (bgDistances === null || bgDistances.length === 0) &&\n vecIdxAny.backgroundSamples !== null &&\n vecIdxAny.backgroundSamples !== undefined\n ) {\n ivf = vecIdxAny;\n const samples = vecIdxAny.backgroundSamples;\n if (samples.length > 0) {\n bgDistances = Array.isArray(samples) ? samples : Array.from(samples);\n }\n }\n\n if (bgDistances === null || bgDistances.length === 0) {\n // Cannot calibrate without background -- return raw results\n return rawResults;\n }\n\n // 4. Build VectorProbabilityTransform from background distances.\n const vpt = fitBackgroundTransform(bgDistances, this.baseRate);\n\n // 5. Compute importance weights and determine calibration method.\n const { weights, densityPrior, method } = this._resolveWeightsAndMethod(\n rawEntries,\n ivf,\n distances,\n context,\n );\n\n // 6. Calibrate via VectorProbabilityTransform.\n const calibrated = vpt.calibrate(distances, {\n weights,\n method,\n bandwidthFactor: this.bandwidthScale,\n densityPrior,\n });\n\n // 7. Build output posting list with calibrated probabilities.\n const entries = docIds.map((docId, i) => ({\n docId,\n payload: createPayload({\n score: calibrated[i]!,\n fields: {\n _raw_similarity: similarities[i],\n ...rawEntries[i]!.payload.fields,\n },\n }),\n }));\n\n return new PostingList(entries);\n }\n\n private _resolveWeightsAndMethod(\n results: PostingEntry[],\n ivf: {\n cellPopulations?(): Map<number, number>;\n totalVectors?: number;\n nlist?: number;\n } | null,\n distances: number[],\n context: ExecutionContext,\n ): {\n weights: number[] | null;\n densityPrior: number[] | null;\n method: string;\n } {\n if (this.weightSource === \"bayesian_bm25\") {\n const w = bm25Weights(results, context, this.bm25Query, this.bm25Field);\n return { weights: w, densityPrior: null, method: this.estimationMethod };\n }\n\n if (\n this.weightSource === \"density_prior\" &&\n ivf !== null &&\n typeof ivf.cellPopulations === \"function\"\n ) {\n const cellPops = ivf.cellPopulations();\n const avgPop = (ivf.totalVectors ?? 0) / Math.max(ivf.nlist ?? 1, 1);\n const prior = results.map((entry) => {\n const centroidId =\n (entry.payload.fields[\"_centroid_id\"] as number | undefined) ?? -1;\n const pop = cellPops.get(centroidId) ?? 1;\n return ivfDensityPrior(pop, avgPop, this.densityGamma);\n });\n return { weights: null, densityPrior: prior, method: this.estimationMethod };\n }\n\n if (this.weightSource === \"distance_gap\") {\n // Let VPT auto-routing handle gap detection\n return { weights: null, densityPrior: null, method: \"auto\" };\n }\n\n // \"uniform\" or unknown -- let VPT decide with no external signal\n return { weights: null, densityPrior: null, method: this.estimationMethod };\n }\n\n costEstimate(stats: IndexStats): number {\n return stats.dimensions * Math.log2(stats.totalDocs + 1);\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Fusion WAND scorer\n// 1:1 port of uqa/scoring/fusion_wand.py\n\nimport { logOddsConjunction } from \"bayesian-bm25\";\nimport type { DocId } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport { BoundTightnessAnalyzer } from \"./wand.js\";\n\nfunction sigmoidStable(x: number): number {\n if (x >= 0) return 1.0 / (1.0 + Math.exp(-x));\n const ex = Math.exp(x);\n return ex / (1.0 + ex);\n}\n\nfunction logit(p: number): number {\n const clamped = Math.max(1e-10, Math.min(1.0 - 1e-10, p));\n return Math.log(clamped / (1.0 - clamped));\n}\n\n// Coverage-based default (from operators/hybrid -- inlined to avoid circular dep)\nfunction coverageBasedDefault(countInMap: number, numDocs: number): number {\n if (numDocs <= 0) return 0.5;\n const coverage = countInMap / numDocs;\n return sigmoidStable(logit(0.5) - 0.5 * coverage);\n}\n\nexport class FusionWANDScorer {\n protected readonly _signalPostingLists: PostingList[];\n protected readonly _signalUpperBounds: number[];\n protected readonly _alpha: number;\n protected readonly _k: number;\n protected readonly _gating: string | null;\n\n constructor(\n signalPostingLists: PostingList[],\n signalUpperBounds: number[],\n alpha = 0.5,\n k = 10,\n gating?: string | null,\n ) {\n this._signalPostingLists = signalPostingLists;\n this._signalUpperBounds = signalUpperBounds;\n this._alpha = alpha;\n this._k = k;\n this._gating = gating ?? null;\n }\n\n private _computeFusedUpperBound(activeUbs: number[]): number {\n return logOddsConjunction(\n activeUbs,\n this._alpha,\n undefined,\n this._gating ?? \"none\",\n );\n }\n\n scoreTopK(): PostingList {\n const nSignals = this._signalPostingLists.length;\n\n // Build score maps per signal\n const scoreMaps: Map<DocId, number>[] = [];\n const allDocIds = new Set<DocId>();\n let numDocs = 0;\n\n for (let s = 0; s < nSignals; s++) {\n const m = new Map<DocId, number>();\n for (const entry of this._signalPostingLists[s]!) {\n m.set(entry.docId, entry.payload.score);\n allDocIds.add(entry.docId);\n }\n scoreMaps.push(m);\n numDocs = Math.max(numDocs, m.size);\n }\n\n // Compute coverage-based defaults per signal\n const defaults = scoreMaps.map((m) => coverageBasedDefault(m.size, numDocs));\n\n // Min-heap for top-k\n const heap: [number, DocId][] = [];\n let threshold = 0;\n\n for (const docId of allDocIds) {\n // Quick upper bound check\n const activeUbs: number[] = [];\n for (let s = 0; s < nSignals; s++) {\n if (scoreMaps[s]!.has(docId)) {\n activeUbs.push(this._signalUpperBounds[s]!);\n } else {\n activeUbs.push(defaults[s]!);\n }\n }\n const fusedUb = this._computeFusedUpperBound(activeUbs);\n if (heap.length >= this._k && fusedUb <= threshold) continue;\n\n // Score document\n const probs: number[] = [];\n for (let s = 0; s < nSignals; s++) {\n probs.push(scoreMaps[s]!.get(docId) ?? defaults[s]!);\n }\n const fused = logOddsConjunction(\n probs,\n this._alpha,\n undefined,\n this._gating ?? \"none\",\n );\n\n if (heap.length < this._k) {\n heap.push([fused, docId]);\n heapifyUp(heap, heap.length - 1);\n if (heap.length === this._k) threshold = heap[0]![0];\n } else if (fused > threshold) {\n heap[0] = [fused, docId];\n heapifyDown(heap);\n threshold = heap[0][0];\n }\n }\n\n const result = heap.map(([score, docId]) => ({\n docId,\n payload: createPayload({ score }),\n }));\n return new PostingList(result);\n }\n}\n\n// -- TightenedFusionWANDScorer ------------------------------------------------\n\nexport class TightenedFusionWANDScorer extends FusionWANDScorer {\n /* @internal */ readonly _tighteningFactor: number;\n /* @internal */ readonly _originalBounds: number[];\n readonly boundAnalyzer: BoundTightnessAnalyzer;\n\n constructor(\n signalPostingLists: PostingList[],\n signalUpperBounds: number[],\n alpha = 0.5,\n k = 10,\n gating?: string | null,\n tighteningFactor = 0.9,\n ) {\n const tightened = signalUpperBounds.map((ub) => ub * tighteningFactor);\n super(signalPostingLists, tightened, alpha, k, gating);\n this._tighteningFactor = tighteningFactor;\n this._originalBounds = signalUpperBounds;\n this.boundAnalyzer = new BoundTightnessAnalyzer();\n }\n}\n\n// -- Min-heap utilities -------------------------------------------------------\n\nfunction heapifyUp(heap: [number, DocId][], i: number): void {\n while (i > 0) {\n const parent = (i - 1) >>> 1;\n if (heap[parent]![0] <= heap[i]![0]) break;\n [heap[parent], heap[i]] = [heap[i]!, heap[parent]!];\n i = parent;\n }\n}\n\nfunction heapifyDown(heap: [number, DocId][]): void {\n const n = heap.length;\n let i = 0;\n for (;;) {\n let smallest = i;\n const left = 2 * i + 1;\n const right = 2 * i + 2;\n if (left < n && heap[left]![0] < heap[smallest]![0]) smallest = left;\n if (right < n && heap[right]![0] < heap[smallest]![0]) smallest = right;\n if (smallest === i) break;\n [heap[i], heap[smallest]] = [heap[smallest]!, heap[i]!];\n i = smallest;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- hybrid operators\n// 1:1 port of uqa/operators/hybrid.py\n\nimport { logOddsConjunction, probAnd, probOr } from \"bayesian-bm25\";\nimport type { DocId, IndexStats } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"./base.js\";\nimport { Operator } from \"./base.js\";\nimport { TermOperator, VectorSimilarityOperator } from \"./primitive.js\";\nimport { FusionWANDScorer } from \"../scoring/fusion-wand.js\";\n\n// -- Coverage-based default (exported for fusion-wand) -----------------------\n\nexport function coverageBasedDefault(\n nHits: number,\n nTotal: number,\n floor = 0.01,\n): number {\n if (nTotal <= 0) return 0.5;\n const r = nHits / nTotal;\n return 0.5 * (1 - r) + floor * r;\n}\n\n// -- HybridTextVectorOperator ------------------------------------------------\n\nexport class HybridTextVectorOperator extends Operator {\n private readonly _termOp: TermOperator;\n private readonly _vectorOp: VectorSimilarityOperator;\n\n constructor(term: string, queryVector: Float64Array, threshold: number) {\n super();\n this._termOp = new TermOperator(term);\n this._vectorOp = new VectorSimilarityOperator(queryVector, threshold);\n }\n\n execute(context: ExecutionContext): PostingList {\n const textResult = this._termOp.execute(context);\n const vecResult = this._vectorOp.execute(context);\n return textResult.intersect(vecResult);\n }\n\n costEstimate(stats: IndexStats): number {\n return Math.min(\n this._termOp.costEstimate(stats),\n this._vectorOp.costEstimate(stats),\n );\n }\n}\n\n// -- SemanticFilterOperator --------------------------------------------------\n\nexport class SemanticFilterOperator extends Operator {\n readonly source: Operator;\n private readonly _vectorOp: VectorSimilarityOperator;\n\n constructor(source: Operator, queryVector: Float64Array, threshold: number) {\n super();\n this.source = source;\n this._vectorOp = new VectorSimilarityOperator(queryVector, threshold);\n }\n\n execute(context: ExecutionContext): PostingList {\n const sourceResult = this.source.execute(context);\n const vecResult = this._vectorOp.execute(context);\n return sourceResult.intersect(vecResult);\n }\n\n costEstimate(stats: IndexStats): number {\n return Math.min(\n this.source.costEstimate(stats),\n this._vectorOp.costEstimate(stats),\n );\n }\n}\n\n// -- LogOddsFusionOperator ---------------------------------------------------\n\nexport class LogOddsFusionOperator extends Operator {\n readonly signals: Operator[];\n readonly alpha: number;\n readonly topK: number | null;\n readonly gating: string | null;\n readonly gatingBeta: number | null;\n\n constructor(\n signals: Operator[],\n alpha = 0.5,\n topK?: number | null,\n gating?: string | null,\n gatingBeta?: number | null,\n ) {\n super();\n this.signals = signals;\n this.alpha = alpha;\n this.topK = topK ?? null;\n this.gating = gating ?? null;\n this.gatingBeta = gatingBeta ?? null;\n }\n\n execute(context: ExecutionContext): PostingList {\n const signalResults = this.signals.map((s) => s.execute(context));\n\n if (this.topK !== null) {\n const upperBounds = signalResults.map((pl) => {\n let max = 0;\n for (const e of pl) {\n if (e.payload.score > max) max = e.payload.score;\n }\n return Math.max(max, 0.5);\n });\n const fwand = new FusionWANDScorer(\n signalResults,\n upperBounds,\n this.alpha,\n this.topK,\n this.gating,\n );\n return fwand.scoreTopK();\n }\n\n // Build score maps\n const scoreMaps: Map<DocId, number>[] = [];\n const allDocIds = new Set<DocId>();\n for (const pl of signalResults) {\n const m = new Map<DocId, number>();\n for (const e of pl) {\n m.set(e.docId, e.payload.score);\n allDocIds.add(e.docId);\n }\n scoreMaps.push(m);\n }\n\n const sortedIds = [...allDocIds].sort((a, b) => a - b);\n const numDocs = sortedIds.length;\n const numSignals = scoreMaps.length;\n\n if (numDocs === 0) {\n return new PostingList();\n }\n\n // Compute per-signal default probability based on coverage ratio.\n const defaults = scoreMaps.map((m) => coverageBasedDefault(m.size, numDocs));\n\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n const alpha = this.alpha;\n for (const docId of sortedIds) {\n const probs: number[] = [];\n for (let j = 0; j < numSignals; j++) {\n probs.push(scoreMaps[j]!.get(docId) ?? defaults[j]!);\n }\n let fused: number;\n if (numSignals === 1) {\n fused = probs[0]!;\n } else {\n fused = logOddsConjunction(\n probs,\n alpha,\n undefined,\n this.gating ?? \"none\",\n this.gatingBeta ?? undefined,\n );\n }\n entries.push({ docId, payload: createPayload({ score: fused }) });\n }\n\n return PostingList.fromSorted(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n let sum = 0;\n for (const s of this.signals) sum += s.costEstimate(stats);\n return sum;\n }\n}\n\n// -- ProbBoolFusionOperator --------------------------------------------------\n\nexport class ProbBoolFusionOperator extends Operator {\n readonly signals: Operator[];\n readonly mode: \"and\" | \"or\";\n\n constructor(signals: Operator[], mode: \"and\" | \"or\" = \"and\") {\n super();\n this.signals = signals;\n this.mode = mode;\n }\n\n execute(context: ExecutionContext): PostingList {\n const signalResults = this.signals.map((s) => s.execute(context));\n const scoreMaps: Map<DocId, number>[] = [];\n const allDocIds = new Set<DocId>();\n for (const pl of signalResults) {\n const m = new Map<DocId, number>();\n for (const e of pl) {\n m.set(e.docId, e.payload.score);\n allDocIds.add(e.docId);\n }\n scoreMaps.push(m);\n }\n\n const sortedIds = [...allDocIds].sort((a, b) => a - b);\n const numDocs = sortedIds.length;\n const defaults = scoreMaps.map((m) => coverageBasedDefault(m.size, numDocs));\n\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n for (const docId of sortedIds) {\n const probs: number[] = [];\n for (let s = 0; s < scoreMaps.length; s++) {\n probs.push(scoreMaps[s]!.get(docId) ?? defaults[s]!);\n }\n const fused = this.mode === \"and\" ? probAnd(probs) : probOr(probs);\n entries.push({ docId, payload: createPayload({ score: fused }) });\n }\n\n return PostingList.fromSorted(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n let sum = 0;\n for (const s of this.signals) sum += s.costEstimate(stats);\n return sum;\n }\n}\n\n// -- VectorExclusionOperator -------------------------------------------------\n\nexport class VectorExclusionOperator extends Operator {\n readonly positive: Operator;\n private readonly _negativeOp: VectorSimilarityOperator;\n\n constructor(\n positive: Operator,\n negativeVector: Float64Array,\n negativeThreshold: number,\n field = \"embedding\",\n ) {\n super();\n this.positive = positive;\n this._negativeOp = new VectorSimilarityOperator(\n negativeVector,\n negativeThreshold,\n field,\n );\n }\n\n execute(context: ExecutionContext): PostingList {\n const posResult = this.positive.execute(context);\n const negResult = this._negativeOp.execute(context);\n const negativeIds = new Set<DocId>();\n for (const entry of negResult) {\n negativeIds.add(entry.docId);\n }\n const entries = [...posResult].filter((e) => !negativeIds.has(e.docId));\n return PostingList.fromSorted(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return this.positive.costEstimate(stats) + this._negativeOp.costEstimate(stats);\n }\n}\n\n// -- FacetVectorOperator -----------------------------------------------------\n\nexport class FacetVectorOperator extends Operator {\n readonly facetField: string;\n private readonly _vectorOp: VectorSimilarityOperator;\n readonly source: Operator | null;\n\n constructor(\n facetField: string,\n queryVector: Float64Array,\n threshold: number,\n source?: Operator | null,\n ) {\n super();\n this.facetField = facetField;\n this._vectorOp = new VectorSimilarityOperator(queryVector, threshold);\n this.source = source ?? null;\n }\n\n execute(context: ExecutionContext): PostingList {\n const vectorPl = this._vectorOp.execute(context);\n const vectorIds = new Set<DocId>();\n for (const entry of vectorPl) {\n vectorIds.add(entry.docId);\n }\n\n let candidateIds: DocId[];\n if (this.source !== null) {\n const sourcePl = this.source.execute(context);\n candidateIds = [...sourcePl]\n .filter((e) => vectorIds.has(e.docId))\n .map((e) => e.docId);\n } else {\n candidateIds = [...vectorIds].sort((a, b) => a - b);\n }\n\n const docStore = context.documentStore;\n if (!docStore) return new PostingList();\n\n const counts = new Map<string, number>();\n for (const docId of candidateIds) {\n const value = docStore.getField(docId, this.facetField);\n if (value !== null && value !== undefined) {\n const key = String(value as string | number);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n }\n\n const sorted = [...counts.entries()].sort((a, b) => a[0].localeCompare(b[0]));\n return PostingList.fromSorted(\n sorted.map(([value, count], idx) => ({\n docId: idx,\n payload: createPayload({\n score: count,\n fields: {\n _facet_field: this.facetField,\n _facet_value: value,\n _facet_count: count,\n },\n }),\n })),\n );\n }\n\n costEstimate(stats: IndexStats): number {\n let cost = this._vectorOp.costEstimate(stats);\n if (this.source !== null) {\n cost += this.source.costEstimate(stats);\n }\n return cost;\n }\n}\n\n// -- ProbNotOperator ---------------------------------------------------------\n\nexport class ProbNotOperator extends Operator {\n readonly signal: Operator;\n readonly defaultProb: number;\n\n constructor(signal: Operator, defaultProb = 0.01) {\n super();\n this.signal = signal;\n this.defaultProb = defaultProb;\n }\n\n execute(context: ExecutionContext): PostingList {\n const signalPl = this.signal.execute(context);\n const docStore = context.documentStore;\n\n const signalMap = new Map<DocId, number>();\n for (const e of signalPl) {\n signalMap.set(e.docId, e.payload.score);\n }\n\n const allDocIds = new Set<DocId>(signalMap.keys());\n if (docStore) {\n for (const docId of docStore.docIds) {\n allDocIds.add(docId);\n }\n }\n\n const sorted = [...allDocIds].sort((a, b) => a - b);\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n for (const docId of sorted) {\n const p = signalMap.get(docId) ?? this.defaultProb;\n const notP = 1.0 - p;\n entries.push({ docId, payload: createPayload({ score: notP }) });\n }\n\n return PostingList.fromSorted(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return this.signal.costEstimate(stats);\n }\n}\n\n// -- AdaptiveLogOddsFusionOperator -------------------------------------------\n\n/**\n * Signal quality metrics for adaptive fusion.\n */\nexport interface SignalQuality {\n coverageRatio: number;\n scoreVariance: number;\n calibrationError: number;\n}\n\nexport class AdaptiveLogOddsFusionOperator extends Operator {\n readonly signals: Operator[];\n readonly baseAlpha: number;\n readonly gating: string | null;\n\n constructor(signals: Operator[], baseAlpha = 0.5, gating?: string | null) {\n super();\n this.signals = signals;\n this.baseAlpha = baseAlpha;\n this.gating = gating ?? null;\n }\n\n execute(context: ExecutionContext): PostingList {\n const postingLists = this.signals.map((s) => s.execute(context));\n\n const allDocIds = new Set<DocId>();\n const scoreMaps: Map<DocId, number>[] = [];\n for (const pl of postingLists) {\n const smap = new Map<DocId, number>();\n for (const entry of pl) {\n smap.set(entry.docId, entry.payload.score);\n allDocIds.add(entry.docId);\n }\n scoreMaps.push(smap);\n }\n\n const sortedIds = [...allDocIds].sort((a, b) => a - b);\n const numDocs = sortedIds.length;\n\n if (numDocs === 0) {\n return new PostingList();\n }\n\n // Compute signal quality metrics\n const qualities: SignalQuality[] = [];\n for (const smap of scoreMaps) {\n const coverage = numDocs > 0 ? smap.size / numDocs : 0.0;\n const scores = [...smap.values()];\n let variance = 0.0;\n if (scores.length > 1) {\n let meanS = 0;\n for (const s of scores) meanS += s;\n meanS /= scores.length;\n let sumSq = 0;\n for (const s of scores) sumSq += (s - meanS) * (s - meanS);\n variance = sumSq / scores.length;\n }\n // Calibration error: |mean_score - 0.5| as proxy\n let meanScore = 0.5;\n if (scores.length > 0) {\n let sum = 0;\n for (const s of scores) sum += s;\n meanScore = sum / scores.length;\n }\n const calError = Math.abs(meanScore - 0.5);\n qualities.push({\n coverageRatio: coverage,\n scoreVariance: variance,\n calibrationError: calError,\n });\n }\n\n const defaults = scoreMaps.map((m) => coverageBasedDefault(m.size, numDocs));\n\n // Adaptive fusion: weight each signal's alpha by its quality\n // Higher coverage + lower calibration error = higher confidence\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n for (const docId of sortedIds) {\n const probs: number[] = [];\n for (let j = 0; j < scoreMaps.length; j++) {\n probs.push(scoreMaps[j]!.get(docId) ?? defaults[j]!);\n }\n\n // Compute adaptive per-signal alphas\n const adaptiveAlphas: number[] = [];\n for (const q of qualities) {\n // Scale alpha by coverage and inverse calibration error\n const qualityWeight = q.coverageRatio * (1.0 - q.calibrationError);\n adaptiveAlphas.push(this.baseAlpha * (0.5 + qualityWeight));\n }\n\n // Use the average adaptive alpha for the fusion\n let avgAlpha = this.baseAlpha;\n if (adaptiveAlphas.length > 0) {\n let sum = 0;\n for (const a of adaptiveAlphas) sum += a;\n avgAlpha = sum / adaptiveAlphas.length;\n }\n\n const fused = logOddsConjunction(\n probs,\n avgAlpha,\n undefined,\n this.gating ?? \"none\",\n );\n entries.push({ docId, payload: createPayload({ score: fused }) });\n }\n\n return PostingList.fromSorted(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n let sum = 0;\n for (const s of this.signals) sum += s.costEstimate(stats);\n return sum;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Full-Text Search query parser and compiler\n// 1:1 port of uqa/sql/fts_query.py\n//\n// Grammar:\n// query = or_expr\n// or_expr = and_expr ( 'OR' and_expr )*\n// and_expr = unary ( ('AND' | <implicit>) unary )*\n// unary = 'NOT' unary | primary\n// primary = '(' or_expr ')'\n// | TERM ':' PHRASE -- field:\"phrase\"\n// | TERM ':' VECTOR -- field:[0.1, 0.2]\n// | TERM ':' TERM -- field:term\n// | PHRASE -- \"phrase\"\n// | TERM -- bare term\n\nimport type { Operator, ExecutionContext } from \"../operators/base.js\";\nimport {\n UnionOperator,\n IntersectOperator,\n ComplementOperator,\n} from \"../operators/boolean.js\";\nimport { TermOperator, ScoreOperator } from \"../operators/primitive.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport {\n BayesianBM25Scorer,\n createBayesianBM25Params,\n} from \"../scoring/bayesian-bm25.js\";\nimport { CalibratedVectorOperator } from \"../operators/calibrated-vector.js\";\nimport { LogOddsFusionOperator } from \"../operators/hybrid.js\";\n\n// -- Token types ----------------------------------------------------------------\n\nexport type FTSTokenType =\n | \"TERM\"\n | \"PHRASE\"\n | \"VECTOR\"\n | \"AND\"\n | \"OR\"\n | \"NOT\"\n | \"LPAREN\"\n | \"RPAREN\"\n | \"COLON\"\n | \"EOF\";\n\nexport interface FTSToken {\n readonly type: FTSTokenType;\n readonly value: string;\n readonly pos: number;\n}\n\n// -- Tokenizer ------------------------------------------------------------------\n\nfunction isWhitespace(ch: string): boolean {\n return ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\";\n}\n\nfunction isWordChar(ch: string): boolean {\n return (\n !isWhitespace(ch) &&\n ch !== \"(\" &&\n ch !== \")\" &&\n ch !== \":\" &&\n ch !== '\"' &&\n ch !== \"[\" &&\n ch !== \"]\"\n );\n}\n\nconst KEYWORD_MAP: Readonly<Record<string, FTSTokenType>> = {\n and: \"AND\",\n or: \"OR\",\n not: \"NOT\",\n};\n\nexport function tokenizeFts(source: string): FTSToken[] {\n const tokens: FTSToken[] = [];\n let i = 0;\n const n = source.length;\n\n while (i < n) {\n const ch = source[i]!;\n\n // Skip whitespace\n if (isWhitespace(ch)) {\n i++;\n continue;\n }\n\n // Single-character tokens\n if (ch === \"(\") {\n tokens.push({ type: \"LPAREN\", value: \"(\", pos: i });\n i++;\n continue;\n }\n if (ch === \")\") {\n tokens.push({ type: \"RPAREN\", value: \")\", pos: i });\n i++;\n continue;\n }\n if (ch === \":\") {\n tokens.push({ type: \"COLON\", value: \":\", pos: i });\n i++;\n continue;\n }\n\n // Quoted phrase\n if (ch === '\"') {\n const start = i;\n i++;\n let phrase = \"\";\n while (i < n && source[i] !== '\"') {\n phrase += source[i]!;\n i++;\n }\n if (i >= n) {\n throw new Error(\n `Unterminated quoted phrase starting at position ${String(start)}`,\n );\n }\n tokens.push({ type: \"PHRASE\", value: phrase, pos: start });\n i++; // skip closing quote\n continue;\n }\n\n // Vector literal [...]\n if (ch === \"[\") {\n const start = i;\n i++;\n let content = \"\";\n while (i < n && source[i] !== \"]\") {\n content += source[i]!;\n i++;\n }\n if (i >= n) {\n throw new Error(\n `Unterminated vector literal starting at position ${String(start)}`,\n );\n }\n tokens.push({ type: \"VECTOR\", value: content.trim(), pos: start });\n i++; // skip closing bracket\n continue;\n }\n\n // Bare word (term or keyword)\n if (isWordChar(ch)) {\n const start = i;\n let word = \"\";\n while (i < n && isWordChar(source[i]!)) {\n word += source[i]!;\n i++;\n }\n const kw = KEYWORD_MAP[word.toLowerCase()];\n if (kw !== undefined) {\n tokens.push({ type: kw, value: word, pos: start });\n } else {\n tokens.push({ type: \"TERM\", value: word, pos: start });\n }\n continue;\n }\n\n throw new Error(`Unexpected character '${ch}' at position ${String(i)}`);\n }\n\n tokens.push({ type: \"EOF\", value: \"\", pos: n });\n return tokens;\n}\n\n// -- AST nodes ------------------------------------------------------------------\n\nexport interface TermNode {\n readonly type: \"term\";\n readonly field: string | null;\n readonly term: string;\n}\n\nexport interface PhraseNode {\n readonly type: \"phrase\";\n readonly field: string | null;\n readonly phrase: string;\n}\n\nexport interface VectorNode {\n readonly type: \"vector\";\n readonly field: string | null;\n readonly values: readonly number[];\n}\n\nexport interface AndNode {\n readonly type: \"and\";\n readonly left: FTSNode;\n readonly right: FTSNode;\n}\n\nexport interface OrNode {\n readonly type: \"or\";\n readonly left: FTSNode;\n readonly right: FTSNode;\n}\n\nexport interface NotNode {\n readonly type: \"not\";\n readonly operand: FTSNode;\n}\n\nexport type FTSNode = TermNode | PhraseNode | VectorNode | AndNode | OrNode | NotNode;\n\n// -- Parser ---------------------------------------------------------------------\n\nexport class FTSParser {\n private _tokens: FTSToken[];\n private _pos: number;\n\n constructor(tokens: FTSToken[]) {\n this._tokens = tokens;\n this._pos = 0;\n }\n\n parse(): FTSNode {\n if (this._peek().type === \"EOF\") {\n throw new Error(\"Empty query\");\n }\n const node = this._orExpr();\n if (this._peek().type !== \"EOF\") {\n const tok = this._peek();\n throw new Error(`Unexpected token '${tok.value}' at position ${String(tok.pos)}`);\n }\n return node;\n }\n\n private _peek(): FTSToken {\n return this._tokens[this._pos] ?? { type: \"EOF\" as const, value: \"\", pos: -1 };\n }\n\n private _advance(): FTSToken {\n const tok = this._peek();\n if (tok.type !== \"EOF\") {\n this._pos++;\n }\n return tok;\n }\n\n private _expect(type: FTSTokenType): FTSToken {\n const tok = this._advance();\n if (tok.type !== type) {\n throw new Error(\n `Expected ${type}, got ${tok.type} ('${tok.value}') at position ${String(tok.pos)}`,\n );\n }\n return tok;\n }\n\n private _orExpr(): FTSNode {\n let left = this._andExpr();\n while (this._peek().type === \"OR\") {\n this._advance(); // consume OR\n const right = this._andExpr();\n left = { type: \"or\", left, right };\n }\n return left;\n }\n\n private _andExpr(): FTSNode {\n let left = this._unary();\n for (;;) {\n const tok = this._peek();\n if (tok.type === \"AND\") {\n this._advance(); // consume AND\n const right = this._unary();\n left = { type: \"and\", left, right };\n } else if (\n tok.type === \"TERM\" ||\n tok.type === \"PHRASE\" ||\n tok.type === \"VECTOR\" ||\n tok.type === \"LPAREN\" ||\n tok.type === \"NOT\"\n ) {\n // Implicit AND\n const right = this._unary();\n left = { type: \"and\", left, right };\n } else {\n break;\n }\n }\n return left;\n }\n\n private _unary(): FTSNode {\n if (this._peek().type === \"NOT\") {\n this._advance(); // consume NOT\n const operand = this._unary();\n return { type: \"not\", operand };\n }\n return this._primary();\n }\n\n private _primary(): FTSNode {\n const tok = this._peek();\n\n if (tok.type === \"LPAREN\") {\n this._advance(); // consume (\n const node = this._orExpr();\n this._expect(\"RPAREN\");\n return node;\n }\n\n if (tok.type === \"PHRASE\") {\n this._advance();\n return { type: \"phrase\", field: null, phrase: tok.value };\n }\n\n if (tok.type === \"VECTOR\") {\n this._advance();\n return { type: \"vector\", field: null, values: parseVectorValues(tok.value) };\n }\n\n if (tok.type === \"TERM\") {\n this._advance();\n // Lookahead for field:value\n if (this._peek().type === \"COLON\") {\n this._advance(); // consume :\n const nextTok = this._peek();\n if (nextTok.type === \"PHRASE\") {\n this._advance();\n return { type: \"phrase\", field: tok.value, phrase: nextTok.value };\n }\n if (nextTok.type === \"VECTOR\") {\n this._advance();\n return {\n type: \"vector\",\n field: tok.value,\n values: parseVectorValues(nextTok.value),\n };\n }\n if (nextTok.type === \"TERM\") {\n this._advance();\n return { type: \"term\", field: tok.value, term: nextTok.value };\n }\n throw new Error(\n `Expected term, phrase, or vector after ':', got ${nextTok.type} at position ${String(nextTok.pos)}`,\n );\n }\n return { type: \"term\", field: null, term: tok.value };\n }\n\n throw new Error(\n `Unexpected token ${tok.type} ('${tok.value}') at position ${String(tok.pos)}`,\n );\n }\n}\n\nfunction parseVectorValues(raw: string): readonly number[] {\n const content = raw.trim();\n if (content.length === 0) {\n throw new Error(\"Empty vector literal\");\n }\n return content.split(\",\").map((s) => {\n const n = Number(s.trim());\n if (Number.isNaN(n)) {\n throw new Error(`Malformed vector literal: invalid number '${s.trim()}'`);\n }\n return n;\n });\n}\n\n// -- Convenience parse function -----------------------------------------------\n\nexport function parseFtsQuery(source: string): FTSNode {\n const tokens = tokenizeFts(source);\n const parser = new FTSParser(tokens);\n return parser.parse();\n}\n\n// -- AST-to-Operator Compiler -------------------------------------------------\n\ninterface CompilerLike {\n _makeTextSearchOp(\n field: string | null,\n query: string,\n ctx: ExecutionContext,\n opts?: { bayesian?: boolean },\n ): Operator;\n}\n\nexport function compileFtsMatch(\n queryString: string,\n defaultField: string | null,\n ctx: ExecutionContext,\n compiler: CompilerLike,\n): Operator {\n const tokens = tokenizeFts(queryString);\n const ast = new FTSParser(tokens).parse();\n return compileNode(ast, defaultField, ctx, compiler);\n}\n\nfunction compileNode(\n node: FTSNode,\n defaultField: string | null,\n ctx: ExecutionContext,\n compiler: CompilerLike,\n): Operator {\n if (node.type === \"term\") {\n const field = resolveField(node.field, defaultField);\n return compiler._makeTextSearchOp(field, node.term, ctx, { bayesian: true });\n }\n\n if (node.type === \"phrase\") {\n return compilePhrase(node, defaultField, ctx);\n }\n\n if (node.type === \"vector\") {\n return compileVector(node, defaultField);\n }\n\n if (node.type === \"and\") {\n return compileAnd(node, defaultField, ctx, compiler);\n }\n\n if (node.type === \"or\") {\n const left = compileNode(node.left, defaultField, ctx, compiler);\n const right = compileNode(node.right, defaultField, ctx, compiler);\n return new UnionOperator([left, right]);\n }\n\n // node.type === \"not\" (exhaustive)\n const operand = compileNode(node.operand, defaultField, ctx, compiler);\n return new ComplementOperator(operand);\n}\n\nfunction compilePhrase(\n node: PhraseNode,\n defaultField: string | null,\n ctx: ExecutionContext,\n): Operator {\n const field = resolveField(node.field, defaultField);\n const idx = ctx.invertedIndex;\n if (idx === null || idx === undefined) {\n return {\n execute: () => new PostingList(),\n costEstimate: () => 0.0,\n compose: (other: Operator) => other,\n } as unknown as Operator;\n }\n\n const analyzer = field ? idx.getSearchAnalyzer(field) : idx.analyzer;\n const terms = analyzer.analyze(node.phrase);\n if (terms.length === 0) {\n return {\n execute: () => new PostingList(),\n costEstimate: () => 0.0,\n compose: (other: Operator) => other,\n } as unknown as Operator;\n }\n\n const termOps: Operator[] = terms.map((t: string) => new TermOperator(t, field));\n const retrieval = termOps.length === 1 ? termOps[0]! : new IntersectOperator(termOps);\n\n const scorer = new BayesianBM25Scorer(createBayesianBM25Params(), idx.stats);\n return new ScoreOperator(scorer, retrieval, terms, field);\n}\n\nfunction compileVector(node: VectorNode, defaultField: string | null): Operator {\n const field = node.field ?? defaultField ?? \"embedding\";\n const queryVec = new Float64Array(node.values);\n\n return new CalibratedVectorOperator(queryVec, 10000, field);\n}\n\nfunction compileAnd(\n node: AndNode,\n defaultField: string | null,\n ctx: ExecutionContext,\n compiler: CompilerLike,\n): Operator {\n const leftOp = compileNode(node.left, defaultField, ctx, compiler);\n const rightOp = compileNode(node.right, defaultField, ctx, compiler);\n\n if (hasVectorSignal(node.left) !== hasVectorSignal(node.right)) {\n // Mixed text + vector: use log-odds fusion for calibrated combination\n return new LogOddsFusionOperator([leftOp, rightOp]);\n }\n\n // Same-kind AND: use intersection\n return new IntersectOperator([leftOp, rightOp]);\n}\n\nfunction hasVectorSignal(node: FTSNode): boolean {\n if (node.type === \"vector\") return true;\n if (node.type === \"term\" || node.type === \"phrase\") return false;\n if (node.type === \"and\") {\n return hasVectorSignal(node.left) || hasVectorSignal(node.right);\n }\n if (node.type === \"or\") {\n return hasVectorSignal(node.left) || hasVectorSignal(node.right);\n }\n // node.type === \"not\" (exhaustive)\n return hasVectorSignal(node.operand);\n}\n\nfunction resolveField(\n nodeField: string | null,\n defaultField: string | null,\n): string | null {\n const field = nodeField !== null ? nodeField : defaultField;\n if (field === \"_all\") return null;\n return field;\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- SQL expression evaluator\n// 1:1 port of uqa/sql/expr_evaluator.py\n//\n// Evaluates pglast/libpg-query AST nodes (Record<string, unknown> from JSON parse).\n\nimport { tokenizeFts, FTSParser } from \"./fts-query.js\";\nimport type { FTSNode } from \"./fts-query.js\";\n\n// -- FTS match helper -----------------------------------------------------------\n\nfunction ftsMatchNode(text: string, node: FTSNode): boolean {\n switch (node.type) {\n case \"term\":\n return text.includes(node.term.toLowerCase());\n case \"phrase\":\n return text.includes(node.phrase.toLowerCase());\n case \"and\":\n return ftsMatchNode(text, node.left) && ftsMatchNode(text, node.right);\n case \"or\":\n return ftsMatchNode(text, node.left) || ftsMatchNode(text, node.right);\n case \"not\":\n return !ftsMatchNode(text, node.operand);\n case \"vector\":\n return false; // vectors cannot match text\n default:\n return false;\n }\n}\n\nfunction ftsMatch(text: string, query: string): boolean {\n try {\n const tokens = tokenizeFts(query);\n const ast = new FTSParser(tokens).parse();\n return ftsMatchNode(text.toLowerCase(), ast);\n } catch {\n // Fallback to simple term matching if parse fails\n const terms = query\n .toLowerCase()\n .split(/\\s+/)\n .filter((t) => t.length > 0);\n if (terms.length === 0) return false;\n return terms.every((term) => text.toLowerCase().includes(term));\n }\n}\n\n// -- Safe conversion helpers ----------------------------------------------------\n\n/** Convert unknown to string without triggering no-base-to-string. */\nfunction toStr(v: unknown): string {\n if (typeof v === \"string\") return v;\n if (v === null || v === undefined) return \"\";\n if (typeof v === \"number\") return v.toString(10);\n if (typeof v === \"boolean\") return v ? \"true\" : \"false\";\n if (typeof v === \"bigint\") return v.toString(10);\n return JSON.stringify(v);\n}\n\n// -- MD5 implementation (RFC 1321) ----------------------------------------------\n\n/**\n * Pure-JS MD5 hash returning a 32-character lowercase hex string.\n * Implements the standard MD5 algorithm per RFC 1321.\n */\nfunction md5(input: string): string {\n // Pre-computed per-round shift amounts\n const s: number[] = [\n 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14,\n 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11,\n 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,\n ];\n\n // Pre-computed T table: floor(2^32 * abs(sin(i+1))) for i in 0..63\n const K: number[] = [];\n for (let i = 0; i < 64; i++) {\n K.push(Math.floor(Math.abs(Math.sin(i + 1)) * 0x100000000));\n }\n\n // Convert string to UTF-8 bytes\n const encoder = new TextEncoder();\n const msgBytes = encoder.encode(input);\n const bitLen = msgBytes.length * 8;\n\n // Padding: append 0x80, then zeros, then 64-bit little-endian length\n const padLen =\n msgBytes.length % 64 < 56\n ? 56 - (msgBytes.length % 64)\n : 120 - (msgBytes.length % 64);\n const padded = new Uint8Array(msgBytes.length + padLen + 8);\n padded.set(msgBytes);\n padded[msgBytes.length] = 0x80;\n\n // Append original length in bits as 64-bit LE\n const dv = new DataView(padded.buffer);\n dv.setUint32(padded.length - 8, bitLen >>> 0, true);\n dv.setUint32(padded.length - 4, Math.floor(bitLen / 0x100000000), true);\n\n // Initialize hash values\n let a0 = 0x67452301;\n let b0 = 0xefcdab89;\n let c0 = 0x98badcfe;\n let d0 = 0x10325476;\n\n // Process each 64-byte chunk\n for (let offset = 0; offset < padded.length; offset += 64) {\n const M: number[] = [];\n for (let j = 0; j < 16; j++) {\n M.push(dv.getUint32(offset + j * 4, true));\n }\n\n let A = a0;\n let B = b0;\n let C = c0;\n let D = d0;\n\n for (let i = 0; i < 64; i++) {\n let F: number;\n let g: number;\n if (i < 16) {\n F = (B & C) | (~B & D);\n g = i;\n } else if (i < 32) {\n F = (D & B) | (~D & C);\n g = (5 * i + 1) % 16;\n } else if (i < 48) {\n F = B ^ C ^ D;\n g = (3 * i + 5) % 16;\n } else {\n F = C ^ (B | ~D);\n g = (7 * i) % 16;\n }\n F = (F + A + K[i]! + M[g]!) >>> 0;\n A = D;\n D = C;\n C = B;\n B = (B + ((F << s[i]!) | (F >>> (32 - s[i]!)))) >>> 0;\n }\n\n a0 = (a0 + A) >>> 0;\n b0 = (b0 + B) >>> 0;\n c0 = (c0 + C) >>> 0;\n d0 = (d0 + D) >>> 0;\n }\n\n // Convert to hex string (little-endian byte order)\n function toLEHex(n: number): string {\n let hex = \"\";\n for (let i = 0; i < 4; i++) {\n const byte = (n >>> (i * 8)) & 0xff;\n hex += (byte < 16 ? \"0\" : \"\") + byte.toString(16);\n }\n return hex;\n }\n\n return toLEHex(a0) + toLEHex(b0) + toLEHex(c0) + toLEHex(d0);\n}\n\n/** Format a Date as a local-time ISO string (no UTC conversion). */\n/**\n * Parse a date string consistently as local time.\n * ISO strings without timezone suffix (e.g. \"2024-06-15T10:30:00\")\n * are treated as local time rather than UTC.\n */\nfunction parseLocalDate(s: string): Date {\n // If the string already has a timezone indicator, parse normally\n if (s.endsWith(\"Z\") || /[+-]\\d{2}:\\d{2}$/.test(s)) {\n return new Date(s);\n }\n // Match ISO-like format: YYYY-MM-DDTHH:MM:SS[.sss]\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})(?:T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?)?$/.exec(\n s,\n );\n if (m) {\n const year = parseInt(m[1]!, 10);\n const month = parseInt(m[2]!, 10) - 1;\n const day = parseInt(m[3]!, 10);\n const hour = m[4] !== undefined ? parseInt(m[4], 10) : 0;\n const minute = m[5] !== undefined ? parseInt(m[5], 10) : 0;\n const second = m[6] !== undefined ? parseInt(m[6], 10) : 0;\n const ms = m[7] !== undefined ? parseInt(m[7].padEnd(3, \"0\").slice(0, 3), 10) : 0;\n const d = new Date(year, month, day, hour, minute, second, ms);\n return d;\n }\n return new Date(s);\n}\n\nfunction localISOString(d: Date): string {\n const y = String(d.getFullYear()).padStart(4, \"0\");\n const mo = String(d.getMonth() + 1).padStart(2, \"0\");\n const da = String(d.getDate()).padStart(2, \"0\");\n const h = String(d.getHours()).padStart(2, \"0\");\n const mi = String(d.getMinutes()).padStart(2, \"0\");\n const s = String(d.getSeconds()).padStart(2, \"0\");\n const ms = String(d.getMilliseconds()).padStart(3, \"0\");\n return `${y}-${mo}-${da}T${h}:${mi}:${s}.${ms}`;\n}\n\n// -- Scalar function dispatch ---------------------------------------------------\n\nfunction callScalarFunction(name: string, args: unknown[]): unknown {\n switch (name) {\n // String functions\n case \"upper\":\n return args[0] === null ? null : toStr(args[0]).toUpperCase();\n case \"lower\":\n return args[0] === null ? null : toStr(args[0]).toLowerCase();\n case \"length\":\n case \"char_length\":\n case \"character_length\":\n return args[0] === null ? null : toStr(args[0]).length;\n case \"octet_length\":\n return args[0] === null ? null : new TextEncoder().encode(toStr(args[0])).length;\n case \"trim\":\n case \"btrim\":\n if (args[0] === null) return null;\n if (args.length >= 2 && args[1] !== null && args[1] !== undefined) {\n const chars = toStr(args[1]);\n const s = toStr(args[0]);\n let start = 0;\n let end = s.length;\n while (start < end && chars.includes(s[start]!)) start++;\n while (end > start && chars.includes(s[end - 1]!)) end--;\n return s.slice(start, end);\n }\n return toStr(args[0]).trim();\n case \"ltrim\":\n if (args[0] === null) return null;\n if (args.length >= 2 && args[1] !== null && args[1] !== undefined) {\n const chars = toStr(args[1]);\n const s = toStr(args[0]);\n let start = 0;\n while (start < s.length && chars.includes(s[start]!)) start++;\n return s.slice(start);\n }\n return toStr(args[0]).replace(/^\\s+/, \"\");\n case \"rtrim\":\n if (args[0] === null) return null;\n if (args.length >= 2 && args[1] !== null && args[1] !== undefined) {\n const chars = toStr(args[1]);\n const s = toStr(args[0]);\n let end = s.length;\n while (end > 0 && chars.includes(s[end - 1]!)) end--;\n return s.slice(0, end);\n }\n return toStr(args[0]).replace(/\\s+$/, \"\");\n case \"replace\":\n if (args[0] === null) return null;\n return toStr(args[0]).split(toStr(args[1])).join(toStr(args[2]));\n case \"substring\":\n case \"substr\": {\n if (args[0] === null) return null;\n const s = toStr(args[0]);\n // SQL SUBSTRING is 1-based\n const from = Number(args[1]) - 1;\n if (args.length >= 3) {\n const forLen = Number(args[2]);\n return s.slice(from, from + forLen);\n }\n return s.slice(from);\n }\n case \"concat\":\n return args.map((a) => (a === null ? \"\" : toStr(a))).join(\"\");\n case \"concat_ws\": {\n if (args[0] === null || args[0] === undefined) return null;\n const sep = toStr(args[0]);\n return args\n .slice(1)\n .filter((a) => a !== null && a !== undefined)\n .map((a) => toStr(a))\n .join(sep);\n }\n case \"left\":\n if (args[0] === null) return null;\n return toStr(args[0]).slice(0, Number(args[1]));\n case \"right\":\n if (args[0] === null) return null;\n return toStr(args[0]).slice(-Number(args[1]));\n case \"lpad\": {\n if (args[0] === null) return null;\n const s = toStr(args[0]);\n const targetLen = Number(args[1]);\n const pad = args.length >= 3 ? toStr(args[2]) : \" \";\n if (s.length >= targetLen) return s.slice(0, targetLen);\n return (\n pad\n .repeat(Math.ceil((targetLen - s.length) / pad.length))\n .slice(0, targetLen - s.length) + s\n );\n }\n case \"rpad\": {\n if (args[0] === null) return null;\n const s = toStr(args[0]);\n const targetLen = Number(args[1]);\n const pad = args.length >= 3 ? toStr(args[2]) : \" \";\n if (s.length >= targetLen) return s.slice(0, targetLen);\n return (\n s +\n pad\n .repeat(Math.ceil((targetLen - s.length) / pad.length))\n .slice(0, targetLen - s.length)\n );\n }\n case \"repeat\":\n if (args[0] === null) return null;\n return toStr(args[0]).repeat(Number(args[1]));\n case \"reverse\":\n if (args[0] === null) return null;\n return Array.from(toStr(args[0])).reverse().join(\"\");\n case \"position\":\n case \"strpos\": {\n if (args[0] === null || args[1] === null) return null;\n const idx = toStr(args[0]).indexOf(toStr(args[1]));\n return idx === -1 ? 0 : idx + 1; // 1-based, 0 = not found\n }\n case \"initcap\":\n if (args[0] === null) return null;\n return toStr(args[0]).replace(/\\b\\w/g, (c) => c.toUpperCase());\n case \"md5\":\n if (args[0] === null) return null;\n return md5(toStr(args[0]));\n case \"encode\":\n if (args[0] === null) return null;\n if (toStr(args[1]).toLowerCase() === \"base64\") {\n if (typeof btoa === \"function\") {\n return btoa(toStr(args[0]));\n }\n }\n throw new Error(`encode() format not supported: ${toStr(args[1])}`);\n case \"decode\":\n if (args[0] === null) return null;\n if (toStr(args[1]).toLowerCase() === \"base64\") {\n if (typeof atob === \"function\") {\n return atob(toStr(args[0]));\n }\n }\n throw new Error(`decode() format not supported: ${toStr(args[1])}`);\n\n // Math functions\n case \"abs\":\n return args[0] === null ? null : Math.abs(Number(args[0]));\n case \"round\": {\n if (args[0] === null) return null;\n const num = Number(args[0]);\n if (args.length >= 2 && args[1] !== null && args[1] !== undefined) {\n const scale = Number(args[1]);\n const factor = 10 ** scale;\n return Math.round(num * factor) / factor;\n }\n return Math.round(num);\n }\n case \"ceil\":\n case \"ceiling\":\n return args[0] === null ? null : Math.ceil(Number(args[0]));\n case \"floor\":\n return args[0] === null ? null : Math.floor(Number(args[0]));\n case \"trunc\":\n case \"truncate\": {\n if (args[0] === null) return null;\n if (args.length >= 2 && args[1] !== null && args[1] !== undefined) {\n const scale = Number(args[1]);\n const factor = 10 ** scale;\n return Math.trunc(Number(args[0]) * factor) / factor;\n }\n return Math.trunc(Number(args[0]));\n }\n case \"power\":\n case \"pow\":\n if (args[0] === null || args[1] === null) return null;\n return Math.pow(Number(args[0]), Number(args[1]));\n case \"sqrt\":\n return args[0] === null ? null : Math.sqrt(Number(args[0]));\n case \"cbrt\":\n return args[0] === null ? null : Math.cbrt(Number(args[0]));\n case \"exp\":\n return args[0] === null ? null : Math.exp(Number(args[0]));\n case \"ln\":\n if (args[0] === null) return null;\n return Math.log(Number(args[0]));\n case \"log\": {\n if (args[0] === null) return null;\n if (args.length >= 2 && args[1] !== null) {\n // log(base, value)\n return Math.log(Number(args[1])) / Math.log(Number(args[0]));\n }\n // PostgreSQL LOG(x) = log base 10\n return Math.log10(Number(args[0]));\n }\n case \"log10\":\n case \"log2\":\n if (args[0] === null) return null;\n return name === \"log10\"\n ? Math.log10(Number(args[0]))\n : Math.log2(Number(args[0]));\n case \"mod\":\n if (args[0] === null || args[1] === null) return null;\n return Number(args[0]) % Number(args[1]);\n case \"sign\":\n return args[0] === null ? null : Math.sign(Number(args[0]));\n case \"pi\":\n return Math.PI;\n case \"random\":\n return Math.random();\n case \"degrees\":\n return args[0] === null ? null : (Number(args[0]) * 180) / Math.PI;\n case \"radians\":\n return args[0] === null ? null : (Number(args[0]) * Math.PI) / 180;\n case \"sin\":\n return args[0] === null ? null : Math.sin(Number(args[0]));\n case \"cos\":\n return args[0] === null ? null : Math.cos(Number(args[0]));\n case \"tan\":\n return args[0] === null ? null : Math.tan(Number(args[0]));\n case \"asin\":\n return args[0] === null ? null : Math.asin(Number(args[0]));\n case \"acos\":\n return args[0] === null ? null : Math.acos(Number(args[0]));\n case \"atan\":\n return args[0] === null ? null : Math.atan(Number(args[0]));\n case \"atan2\":\n if (args[0] === null || args[1] === null) return null;\n return Math.atan2(Number(args[0]), Number(args[1]));\n case \"div\":\n if (args[0] === null || args[1] === null) return null;\n if (Number(args[1]) === 0) return null;\n return Math.trunc(Number(args[0]) / Number(args[1]));\n case \"gcd\": {\n if (args[0] === null || args[1] === null) return null;\n let ga = Math.abs(Math.trunc(Number(args[0])));\n let gb = Math.abs(Math.trunc(Number(args[1])));\n while (gb) {\n const t = gb;\n gb = ga % gb;\n ga = t;\n }\n return ga;\n }\n case \"lcm\": {\n if (args[0] === null || args[1] === null) return null;\n const la = Math.abs(Math.trunc(Number(args[0])));\n const lb = Math.abs(Math.trunc(Number(args[1])));\n if (la === 0 || lb === 0) return 0;\n let ga2 = la;\n let gb2 = lb;\n while (gb2) {\n const t = gb2;\n gb2 = ga2 % gb2;\n ga2 = t;\n }\n return Math.abs(la * lb) / ga2;\n }\n case \"width_bucket\": {\n if (args.length < 4 || args.some((a) => a === null)) return null;\n const val = Number(args[0]);\n const lo = Number(args[1]);\n const hi = Number(args[2]);\n const nb = Math.trunc(Number(args[3]));\n if (hi === lo || nb <= 0) return null;\n if (val < lo) return 0;\n if (val >= hi) return nb + 1;\n return Math.trunc((val - lo) / ((hi - lo) / nb)) + 1;\n }\n case \"min_scale\": {\n if (args[0] === null) return null;\n const s = String(args[0] as string | number);\n const dotIdx = s.indexOf(\".\");\n if (dotIdx === -1) return 0;\n let end = s.length;\n while (end > dotIdx + 1 && s[end - 1] === \"0\") end--;\n return end - dotIdx - 1;\n }\n case \"trim_scale\": {\n if (args[0] === null) return null;\n const n = Number(args[0]);\n if (Number.isInteger(n)) return n;\n return n;\n }\n\n // Additional string functions\n case \"translate\": {\n if (args[0] === null || args[1] === null || args[2] === null) return null;\n const s = toStr(args[0]);\n const from = toStr(args[1]);\n const to = toStr(args[2]);\n let result = \"\";\n for (const ch of s) {\n const idx = from.indexOf(ch);\n if (idx === -1) result += ch;\n else if (idx < to.length) result += to[idx]!;\n // else: character is deleted (from longer than to)\n }\n return result;\n }\n case \"ascii\":\n if (args[0] === null) return null;\n return toStr(args[0]).length > 0 ? toStr(args[0]).charCodeAt(0) : 0;\n case \"chr\":\n if (args[0] === null) return null;\n return String.fromCharCode(Math.trunc(Number(args[0])));\n case \"starts_with\":\n if (args[0] === null || args[1] === null) return null;\n return toStr(args[0]).startsWith(toStr(args[1]));\n case \"split_part\": {\n if (args[0] === null || args[1] === null || args[2] === null) return null;\n const parts = toStr(args[0]).split(toStr(args[1]));\n const n = Math.trunc(Number(args[2]));\n return n >= 1 && n <= parts.length ? parts[n - 1] : \"\";\n }\n case \"format\": {\n if (args[0] === null) return null;\n let fmt = toStr(args[0]);\n fmt = fmt.replace(/%I/g, \"%s\").replace(/%L/g, \"'%s'\");\n let i = 1;\n return fmt.replace(/%s/g, () => (i < args.length ? toStr(args[i++]) : \"\"));\n }\n case \"overlay\": {\n if (args[0] === null || args[1] === null || args[2] === null) return null;\n const s = toStr(args[0]);\n const repl = toStr(args[1]);\n const pos = Math.trunc(Number(args[2])) - 1;\n const len =\n args.length > 3 && args[3] != null ? Math.trunc(Number(args[3])) : repl.length;\n return s.slice(0, pos) + repl + s.slice(pos + len);\n }\n case \"regexp_match\": {\n if (args[0] === null || args[1] === null) return null;\n const m = toStr(args[0]).match(new RegExp(toStr(args[1])));\n if (m === null) return null;\n const groups = m.slice(1);\n return groups.length > 0 ? groups : [m[0]];\n }\n case \"regexp_matches\": {\n if (args[0] === null || args[1] === null) return null;\n const flagsStr = args.length > 2 && args[2] != null ? toStr(args[2]) : \"\";\n let flags = \"\";\n if (flagsStr.includes(\"i\")) flags += \"i\";\n if (flagsStr.includes(\"g\")) {\n const re = new RegExp(toStr(args[1]), flags + \"g\");\n const results: string[][] = [];\n let match;\n while ((match = re.exec(toStr(args[0]))) !== null) {\n results.push(match.slice(1).length > 0 ? [...match.slice(1)] : [match[0]]);\n }\n return results;\n }\n const m = toStr(args[0]).match(new RegExp(toStr(args[1]), flags));\n if (m === null) return null;\n return [m.slice(1).length > 0 ? [...m.slice(1)] : [m[0]]];\n }\n case \"regexp_replace\": {\n if (args[0] === null || args[1] === null) return null;\n const replacement = args.length > 2 && args[2] != null ? toStr(args[2]) : \"\";\n const flagsStr = args.length > 3 && args[3] != null ? toStr(args[3]) : \"\";\n let flags = \"\";\n if (flagsStr.includes(\"i\")) flags += \"i\";\n if (flagsStr.includes(\"g\")) flags += \"g\";\n else if (!flags.includes(\"g\")) {\n /* default: replace first only */\n }\n return toStr(args[0]).replace(\n new RegExp(toStr(args[1]), flags || undefined),\n replacement,\n );\n }\n case \"regexp_split_to_array\": {\n if (args[0] === null || args[1] === null) return null;\n let flags = \"\";\n if (args.length > 2 && args[2] != null && toStr(args[2]).includes(\"i\"))\n flags = \"i\";\n return toStr(args[0]).split(new RegExp(toStr(args[1]), flags));\n }\n case \"regexp_count\": {\n if (args[0] === null || args[1] === null) return 0;\n let flagStr = \"\";\n if (args.length > 2 && args[2] != null) flagStr = toStr(args[2]);\n const re = new RegExp(toStr(args[1]), \"g\" + (flagStr.includes(\"i\") ? \"i\" : \"\"));\n const matches = toStr(args[0]).match(re);\n return matches !== null ? matches.length : 0;\n }\n case \"string_to_array\": {\n if (args[0] === null) return null;\n const delimiter = args.length > 1 && args[1] != null ? toStr(args[1]) : \",\";\n const nullStr = args.length > 2 && args[2] != null ? toStr(args[2]) : null;\n const parts = toStr(args[0]).split(delimiter);\n if (nullStr !== null) {\n return parts.map((p) => (p === nullStr ? null : p));\n }\n return parts;\n }\n case \"array_to_string\": {\n if (args[0] === null) return null;\n if (!Array.isArray(args[0])) return null;\n const delimiter = args.length > 1 && args[1] != null ? toStr(args[1]) : \",\";\n const nullStr = args.length > 2 && args[2] != null ? toStr(args[2]) : \"\";\n return (args[0] as unknown[])\n .map((v) => (v === null || v === undefined ? nullStr : toStr(v)))\n .join(delimiter);\n }\n case \"array_position\": {\n if (args[0] === null || args[1] === null) return null;\n if (!Array.isArray(args[0])) return null;\n const idx = (args[0] as unknown[]).indexOf(args[1]);\n return idx === -1 ? null : idx + 1; // 1-based\n }\n case \"array_positions\": {\n if (args[0] === null || args[1] === null) return null;\n if (!Array.isArray(args[0])) return null;\n const positions: number[] = [];\n for (let i = 0; i < (args[0] as unknown[]).length; i++) {\n if ((args[0] as unknown[])[i] === args[1]) positions.push(i + 1);\n }\n return positions;\n }\n case \"array_replace\": {\n if (args[0] === null) return null;\n if (!Array.isArray(args[0])) return null;\n return (args[0] as unknown[]).map((v) => (v === args[1] ? args[2] : v));\n }\n case \"array_dims\": {\n if (args[0] === null) return null;\n if (!Array.isArray(args[0])) return null;\n return `[1:${String((args[0] as unknown[]).length)}]`;\n }\n case \"array_fill\": {\n if (args.length < 2 || args[1] === null) return null;\n const fillVal = args[0];\n const dims = Array.isArray(args[1]) ? (args[1] as number[]) : [Number(args[1])];\n const size = dims[0] ?? 0;\n return new Array(size).fill(fillVal);\n }\n case \"generate_series\": {\n if (args.length < 2 || args[0] === null || args[1] === null) return [];\n const start = Number(args[0]);\n const stop = Number(args[1]);\n const step = args.length > 2 && args[2] != null ? Number(args[2]) : 1;\n if (step === 0) return [];\n const result: number[] = [];\n if (step > 0) {\n for (let i = start; i <= stop; i += step) result.push(i);\n } else {\n for (let i = start; i >= stop; i += step) result.push(i);\n }\n return result;\n }\n case \"generate_subscripts\": {\n if (args[0] === null) return [];\n if (!Array.isArray(args[0])) return [];\n const arr = args[0] as unknown[];\n return Array.from({ length: arr.length }, (_, i) => i + 1);\n }\n\n // Hash functions\n case \"hashtext\": {\n if (args[0] === null) return null;\n // Simple FNV-1a 32-bit hash\n let hash = 0x811c9dc5;\n const str = toStr(args[0]);\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n return hash >>> 0;\n }\n\n // String padding/formatting\n case \"quote_ident\":\n if (args[0] === null) return null;\n return `\"${toStr(args[0]).replace(/\"/g, '\"\"')}\"`;\n case \"quote_literal\":\n if (args[0] === null) return \"NULL\";\n return `'${toStr(args[0]).replace(/'/g, \"''\")}'`;\n case \"quote_nullable\":\n if (args[0] === null) return \"NULL\";\n return `'${toStr(args[0]).replace(/'/g, \"''\")}'`;\n case \"string_agg\":\n // string_agg is an aggregate; in scalar context just return\n if (args[0] === null) return null;\n return toStr(args[0]);\n\n // Conversion functions\n case \"to_hex\": {\n if (args[0] === null) return null;\n const n = Math.trunc(Number(args[0]));\n return n >= 0 ? n.toString(16) : (n >>> 0).toString(16);\n }\n case \"to_ascii\":\n if (args[0] === null) return null;\n return toStr(args[0]).replace(/[^\\x00-\\x7F]/g, \"?\");\n\n // Date/time functions\n case \"date_trunc\": {\n if (args[0] === null || args[1] === null) return null;\n const precision = toStr(args[0]).toLowerCase();\n const d = parseLocalDate(toStr(args[1]));\n if (precision === \"year\") {\n d.setFullYear(d.getFullYear(), 0, 1);\n d.setHours(0, 0, 0, 0);\n } else if (precision === \"month\") {\n d.setDate(1);\n d.setHours(0, 0, 0, 0);\n } else if (precision === \"day\") d.setHours(0, 0, 0, 0);\n else if (precision === \"hour\") d.setMinutes(0, 0, 0);\n else if (precision === \"minute\") d.setSeconds(0, 0);\n else if (precision === \"second\") d.setMilliseconds(0);\n return localISOString(d);\n }\n case \"make_timestamp\": {\n if (args.length < 6 || args.some((a) => a === null)) return null;\n const dt = new Date(\n Number(args[0]),\n Number(args[1]) - 1,\n Number(args[2]),\n Number(args[3]),\n Number(args[4]),\n Math.trunc(Number(args[5])),\n );\n return localISOString(dt);\n }\n case \"make_interval\": {\n const years = args.length > 0 && args[0] != null ? Number(args[0]) : 0;\n const months = args.length > 1 && args[1] != null ? Number(args[1]) : 0;\n const weeks = args.length > 2 && args[2] != null ? Number(args[2]) : 0;\n const days = args.length > 3 && args[3] != null ? Number(args[3]) : 0;\n const hours = args.length > 4 && args[4] != null ? Number(args[4]) : 0;\n const mins = args.length > 5 && args[5] != null ? Number(args[5]) : 0;\n const secs = args.length > 6 && args[6] != null ? Number(args[6]) : 0;\n const totalDays = years * 365 + months * 30 + weeks * 7 + days;\n const parts: string[] = [];\n if (years > 0) parts.push(`${String(years)} year${years > 1 ? \"s\" : \"\"}`);\n if (months > 0) parts.push(`${String(months)} mon${months > 1 ? \"s\" : \"\"}`);\n if (totalDays > 0)\n parts.push(`${String(totalDays)} day${totalDays !== 1 ? \"s\" : \"\"}`);\n parts.push(\n `${String(hours).padStart(2, \"0\")}:${String(mins).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`,\n );\n return parts.join(\" \");\n }\n case \"make_date\": {\n if (args.length < 3 || args.some((a) => a === null)) return null;\n const yyyy = String(Number(args[0])).padStart(4, \"0\");\n const mm = String(Number(args[1])).padStart(2, \"0\");\n const dd = String(Number(args[2])).padStart(2, \"0\");\n return `${yyyy}-${mm}-${dd}`;\n }\n case \"clock_timestamp\":\n return new Date().toISOString();\n case \"timeofday\": {\n const now = new Date();\n return now.toUTCString();\n }\n case \"isfinite\":\n if (args[0] === null) return null;\n return ![\"infinity\", \"-infinity\"].includes(toStr(args[0]).trim().toLowerCase());\n case \"overlaps\": {\n if (args.length < 4 || args.some((a) => a === null)) return null;\n const s1 = new Date(toStr(args[0])).getTime();\n const e1 = new Date(toStr(args[1])).getTime();\n const s2 = new Date(toStr(args[2])).getTime();\n const e2 = new Date(toStr(args[3])).getTime();\n return Math.min(s1, e1) < Math.max(s2, e2) && Math.min(s2, e2) < Math.max(s1, e1);\n }\n\n // Type checking\n case \"typeof\":\n case \"pg_typeof\":\n if (args[0] === null) return \"null\";\n if (typeof args[0] === \"number\")\n return Number.isInteger(args[0]) ? \"integer\" : \"real\";\n if (typeof args[0] === \"string\") return \"text\";\n if (typeof args[0] === \"boolean\") return \"boolean\";\n return \"unknown\";\n\n // UUID\n case \"gen_random_uuid\":\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n return (c === \"x\" ? r : (r & 0x3) | 0x8).toString(16);\n });\n\n // Additional array functions\n case \"array_remove\":\n if (args[0] === null) return null;\n if (Array.isArray(args[0]))\n return (args[0] as unknown[]).filter((x) => x !== args[1]);\n return null;\n case \"array_upper\":\n if (args[0] === null) return null;\n if (Array.isArray(args[0])) return args[0].length > 0 ? args[0].length : null;\n return null;\n case \"array_lower\":\n if (args[0] === null) return null;\n if (Array.isArray(args[0])) return args[0].length > 0 ? 1 : null;\n return null;\n case \"cardinality\":\n if (args[0] === null) return null;\n if (Array.isArray(args[0])) return args[0].length;\n return null;\n\n // Additional JSON functions\n case \"json_extract_path\":\n case \"jsonb_extract_path\":\n case \"json_extract_path_text\":\n case \"jsonb_extract_path_text\": {\n if (args[0] === null) return null;\n let obj: unknown = typeof args[0] === \"string\" ? JSON.parse(args[0]) : args[0];\n for (let i = 1; i < args.length; i++) {\n if (args[i] === null || obj === null || obj === undefined) return null;\n if (typeof obj === \"object\" && !Array.isArray(obj)) {\n obj = (obj as Record<string, unknown>)[toStr(args[i])];\n } else if (Array.isArray(obj)) {\n obj = obj[Number(args[i])];\n } else return null;\n }\n if (name.endsWith(\"_text\")) {\n if (obj === null || obj === undefined) return null;\n return typeof obj === \"object\" ? JSON.stringify(obj) : toStr(obj);\n }\n return obj ?? null;\n }\n case \"jsonb_set\":\n case \"jsonb_insert\": {\n if (args.length < 3 || args[0] === null) return null;\n let target: unknown = typeof args[0] === \"string\" ? JSON.parse(args[0]) : args[0];\n target = JSON.parse(JSON.stringify(target)); // deep clone\n const pathStr = toStr(args[1]).replace(/^\\{/, \"\").replace(/\\}$/, \"\");\n const keys = pathStr.split(\",\").map((k) => k.trim());\n const newValue = args[2];\n let cur: unknown = target;\n for (let i = 0; i < keys.length - 1; i++) {\n if (typeof cur === \"object\" && cur !== null && !Array.isArray(cur)) {\n cur = (cur as Record<string, unknown>)[keys[i]!];\n } else if (Array.isArray(cur)) {\n cur = cur[Number(keys[i])];\n } else return target;\n }\n const lastKey = keys[keys.length - 1]!;\n if (typeof cur === \"object\" && cur !== null && !Array.isArray(cur)) {\n (cur as Record<string, unknown>)[lastKey] = newValue;\n } else if (Array.isArray(cur)) {\n cur[Number(lastKey)] = newValue;\n }\n return target;\n }\n case \"json_each\":\n case \"jsonb_each\":\n case \"json_each_text\":\n case \"jsonb_each_text\": {\n if (args[0] === null) return [];\n const obj: unknown = typeof args[0] === \"string\" ? JSON.parse(args[0]) : args[0];\n if (typeof obj !== \"object\" || Array.isArray(obj) || obj === null) return [];\n const asText = name.endsWith(\"_text\");\n return Object.entries(obj as Record<string, unknown>).map(([k, v]) => ({\n key: k,\n value: asText\n ? typeof v === \"object\" && v !== null\n ? JSON.stringify(v)\n : v != null\n ? toStr(v)\n : null\n : v,\n }));\n }\n case \"json_array_elements\":\n case \"jsonb_array_elements\":\n case \"json_array_elements_text\":\n case \"jsonb_array_elements_text\": {\n if (args[0] === null) return [];\n const arr: unknown = typeof args[0] === \"string\" ? JSON.parse(args[0]) : args[0];\n if (!Array.isArray(arr)) return [];\n if (name.endsWith(\"_text\")) {\n return (arr as unknown[]).map((v) =>\n typeof v === \"object\" && v !== null\n ? JSON.stringify(v)\n : v != null\n ? toStr(v)\n : null,\n );\n }\n return arr;\n }\n case \"json_object_keys\":\n case \"jsonb_object_keys\": {\n if (args[0] === null) return null;\n const obj: unknown = typeof args[0] === \"string\" ? JSON.parse(args[0]) : args[0];\n if (typeof obj !== \"object\" || Array.isArray(obj) || obj === null) return null;\n return Object.keys(obj as Record<string, unknown>);\n }\n case \"jsonb_strip_nulls\":\n case \"json_strip_nulls\": {\n if (args[0] === null) return null;\n const obj: unknown = typeof args[0] === \"string\" ? JSON.parse(args[0]) : args[0];\n function stripNulls(v: unknown): unknown {\n if (typeof v === \"object\" && v !== null && !Array.isArray(v)) {\n const result: Record<string, unknown> = {};\n for (const [k, val] of Object.entries(v as Record<string, unknown>)) {\n if (val !== null) result[k] = stripNulls(val);\n }\n return result;\n }\n return v;\n }\n return stripNulls(obj);\n }\n case \"json_build_array\":\n case \"jsonb_build_array\":\n return [...args];\n\n // Spatial functions\n case \"point\":\n if (args.length !== 2) throw new Error(\"POINT() requires exactly 2 arguments\");\n return [Number(args[0]), Number(args[1])];\n case \"st_distance\": {\n if (args.length !== 2 || args[0] === null || args[1] === null) return null;\n const p1 = args[0] as number[];\n const p2 = args[1] as number[];\n if (!Array.isArray(p1) || !Array.isArray(p2)) return null;\n // Haversine distance in meters\n const R = 6371000;\n const lat1 = (p1[1]! * Math.PI) / 180;\n const lat2 = (p2[1]! * Math.PI) / 180;\n const dLat = ((p2[1]! - p1[1]!) * Math.PI) / 180;\n const dLon = ((p2[0]! - p1[0]!) * Math.PI) / 180;\n const a =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon / 2) ** 2;\n return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n }\n case \"st_within\":\n case \"st_dwithin\": {\n if (args.length !== 3 || args[0] === null || args[1] === null) return null;\n const dist = callScalarFunction(\"st_distance\", [args[0], args[1]]) as\n | number\n | null;\n if (dist === null) return null;\n return dist <= Number(args[2]);\n }\n\n // Conditional / null functions\n case \"coalesce\":\n for (const a of args) {\n if (a !== null && a !== undefined) return a;\n }\n return null;\n case \"nullif\":\n if (args[0] === args[1]) return null;\n return args[0];\n case \"greatest\": {\n let best: unknown = null;\n for (const a of args) {\n if (a === null) continue;\n if (best === null || (a as number) > (best as number)) best = a;\n }\n return best;\n }\n case \"least\": {\n let best: unknown = null;\n for (const a of args) {\n if (a === null) continue;\n if (best === null || (a as number) < (best as number)) best = a;\n }\n return best;\n }\n\n // Date/time functions\n case \"current_date\":\n case \"current_timestamp\":\n case \"now\":\n return new Date().toISOString();\n case \"date_part\":\n case \"extract\": {\n if (args[0] === null || args[1] === null) return null;\n const part = toStr(args[0]).toLowerCase();\n const d = parseLocalDate(toStr(args[1]));\n switch (part) {\n case \"year\":\n return d.getFullYear();\n case \"month\":\n return d.getMonth() + 1;\n case \"day\":\n return d.getDate();\n case \"hour\":\n return d.getHours();\n case \"minute\":\n return d.getMinutes();\n case \"second\":\n return d.getSeconds();\n case \"dow\":\n case \"dayofweek\":\n return d.getDay();\n case \"doy\":\n case \"dayofyear\": {\n const start = new Date(d.getFullYear(), 0, 0);\n const diff = d.getTime() - start.getTime();\n return Math.floor(diff / 86400000);\n }\n case \"epoch\":\n return Math.floor(d.getTime() / 1000);\n case \"quarter\":\n return Math.ceil((d.getMonth() + 1) / 3);\n case \"week\": {\n // ISO 8601 week number\n const jan1 = new Date(d.getFullYear(), 0, 1);\n const dayOfYear = Math.floor((d.getTime() - jan1.getTime()) / 86400000) + 1;\n const jan1Dow = jan1.getDay() || 7; // Convert Sunday=0 to 7\n return Math.ceil((dayOfYear + jan1Dow - 1) / 7);\n }\n case \"millisecond\":\n case \"milliseconds\":\n return d.getSeconds() * 1000 + d.getMilliseconds();\n case \"microsecond\":\n case \"microseconds\":\n return d.getSeconds() * 1000000 + d.getMilliseconds() * 1000;\n default:\n throw new Error(`Unknown date part: \"${part}\"`);\n }\n }\n case \"age\": {\n if (args[0] === null) return null;\n const d1 = new Date(toStr(args[0]));\n const d2 =\n args.length >= 2 && args[1] !== null ? new Date(toStr(args[1])) : new Date();\n const diffMs = d2.getTime() - d1.getTime();\n return `${String(Math.floor(diffMs / 86400000))} days`;\n }\n\n case \"date_add\":\n case \"dateadd\": {\n if (args.length < 3 || args.some((a) => a === null)) return null;\n const unit = toStr(args[0]).toLowerCase();\n const amount = Number(args[1]);\n const d = new Date(toStr(args[2]));\n if (unit === \"year\") d.setFullYear(d.getFullYear() + amount);\n else if (unit === \"month\") d.setMonth(d.getMonth() + amount);\n else if (unit === \"day\") d.setDate(d.getDate() + amount);\n else if (unit === \"hour\") d.setHours(d.getHours() + amount);\n else if (unit === \"minute\") d.setMinutes(d.getMinutes() + amount);\n else if (unit === \"second\") d.setSeconds(d.getSeconds() + amount);\n return d.toISOString();\n }\n case \"date_subtract\":\n case \"datesub\": {\n if (args.length < 3 || args.some((a) => a === null)) return null;\n const unit = toStr(args[0]).toLowerCase();\n const amount = Number(args[1]);\n const d = new Date(toStr(args[2]));\n if (unit === \"year\") d.setFullYear(d.getFullYear() - amount);\n else if (unit === \"month\") d.setMonth(d.getMonth() - amount);\n else if (unit === \"day\") d.setDate(d.getDate() - amount);\n else if (unit === \"hour\") d.setHours(d.getHours() - amount);\n else if (unit === \"minute\") d.setMinutes(d.getMinutes() - amount);\n else if (unit === \"second\") d.setSeconds(d.getSeconds() - amount);\n return d.toISOString();\n }\n case \"date_diff\":\n case \"datediff\": {\n if (args.length < 3 || args.some((a) => a === null)) return null;\n const unit = toStr(args[0]).toLowerCase();\n const d1 = new Date(toStr(args[1]));\n const d2 = new Date(toStr(args[2]));\n const diffMs = d2.getTime() - d1.getTime();\n if (unit === \"day\") return Math.trunc(diffMs / 86400000);\n if (unit === \"hour\") return Math.trunc(diffMs / 3600000);\n if (unit === \"minute\") return Math.trunc(diffMs / 60000);\n if (unit === \"second\") return Math.trunc(diffMs / 1000);\n if (unit === \"year\") return d2.getFullYear() - d1.getFullYear();\n if (unit === \"month\")\n return (\n (d2.getFullYear() - d1.getFullYear()) * 12 + (d2.getMonth() - d1.getMonth())\n );\n return Math.trunc(diffMs / 1000);\n }\n case \"justify_days\": {\n // Convert excessive days to months (30 days = 1 month)\n if (args[0] === null) return null;\n return args[0]; // Simplified: intervals are represented as strings\n }\n case \"justify_hours\": {\n // Convert excessive hours to days (24 hours = 1 day)\n if (args[0] === null) return null;\n return args[0];\n }\n case \"justify_interval\": {\n if (args[0] === null) return null;\n return args[0];\n }\n case \"statement_timestamp\":\n case \"transaction_timestamp\":\n return new Date().toISOString();\n\n // Type cast helpers\n case \"to_char\": {\n if (args[0] === null) return null;\n // If format string is provided, apply basic formatting\n if (args.length >= 2 && args[1] != null) {\n const val = args[0];\n const fmt = toStr(args[1]);\n // Basic numeric formatting\n if (typeof val === \"number\") {\n if (fmt.includes(\"FM\")) {\n return String(val);\n }\n if (fmt.includes(\"9\") || fmt.includes(\"0\")) {\n const decimals = (fmt.match(/\\.([09]+)/)?.[1] ?? \"\").length;\n return val.toFixed(decimals);\n }\n }\n // Basic date formatting\n if (typeof val === \"string\" || val instanceof Date) {\n const d = new Date(toStr(val));\n let result = fmt;\n result = result.replace(/YYYY/g, String(d.getFullYear()));\n result = result.replace(/MM/g, String(d.getMonth() + 1).padStart(2, \"0\"));\n result = result.replace(/DD/g, String(d.getDate()).padStart(2, \"0\"));\n result = result.replace(/HH24/g, String(d.getHours()).padStart(2, \"0\"));\n result = result.replace(\n /HH/g,\n String(d.getHours() % 12 || 12).padStart(2, \"0\"),\n );\n result = result.replace(/MI/g, String(d.getMinutes()).padStart(2, \"0\"));\n result = result.replace(/SS/g, String(d.getSeconds()).padStart(2, \"0\"));\n return result;\n }\n }\n return toStr(args[0]);\n }\n case \"to_number\": {\n if (args[0] === null) return null;\n // Strip currency symbols, commas, spaces from input\n const cleaned = toStr(args[0]).replace(/[^0-9eE.+-]/g, \"\");\n return Number(cleaned);\n }\n case \"to_date\":\n case \"to_timestamp\":\n if (args[0] === null) return null;\n return new Date(toStr(args[0])).toISOString();\n\n // Array functions\n case \"array_length\":\n if (args[0] === null) return null;\n if (Array.isArray(args[0])) return args[0].length;\n return null;\n case \"unnest\":\n // unnest is a set-returning function; in scalar context return as-is\n return args[0];\n case \"array_agg\":\n // array_agg is an aggregate; in scalar context just wrap\n return args;\n case \"array_cat\":\n if (args[0] === null || args[1] === null) return null;\n return [...(args[0] as unknown[]), ...(args[1] as unknown[])];\n case \"array_append\":\n if (args[0] === null) return null;\n return [...(args[0] as unknown[]), args[1]];\n case \"array_prepend\":\n if (args[1] === null) return null;\n return [args[0], ...(args[1] as unknown[])];\n\n // JSON functions\n case \"json_build_object\":\n case \"jsonb_build_object\": {\n const obj: Record<string, unknown> = {};\n for (let idx = 0; idx + 1 < args.length; idx += 2) {\n obj[toStr(args[idx])] = args[idx + 1] ?? null;\n }\n return obj;\n }\n case \"json_array_length\":\n case \"jsonb_array_length\":\n if (args[0] === null) return null;\n if (Array.isArray(args[0])) return args[0].length;\n if (typeof args[0] === \"string\") {\n const parsed = JSON.parse(args[0]) as unknown;\n return Array.isArray(parsed) ? parsed.length : null;\n }\n return null;\n case \"json_typeof\":\n case \"jsonb_typeof\":\n if (args[0] === null) return \"null\";\n if (Array.isArray(args[0])) return \"array\";\n if (typeof args[0] === \"object\") return \"object\";\n return typeof args[0];\n case \"row_to_json\":\n return args[0];\n case \"to_json\":\n case \"to_jsonb\":\n return args[0];\n case \"jsonb_pretty\": {\n if (args[0] === null) return null;\n const obj: unknown =\n typeof args[0] === \"string\" ? (JSON.parse(args[0]) as unknown) : args[0];\n return JSON.stringify(obj, null, 2);\n }\n case \"jsonb_agg\":\n case \"json_agg\":\n // Aggregate; in scalar context return as-is\n return args;\n case \"jsonb_object_agg\":\n case \"json_object_agg\":\n // Aggregate; in scalar context return empty object\n if (args.length >= 2) {\n const obj: Record<string, unknown> = {};\n obj[toStr(args[0])] = args[1];\n return obj;\n }\n return {};\n case \"jsonb_concat\": {\n if (args[0] === null || args[1] === null) return null;\n const a: unknown =\n typeof args[0] === \"string\" ? (JSON.parse(args[0]) as unknown) : args[0];\n const b: unknown =\n typeof args[1] === \"string\" ? (JSON.parse(args[1]) as unknown) : args[1];\n if (Array.isArray(a) && Array.isArray(b))\n return [...(a as unknown[]), ...(b as unknown[])];\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n !Array.isArray(a) &&\n !Array.isArray(b)\n ) {\n return { ...(a as Record<string, unknown>), ...(b as Record<string, unknown>) };\n }\n return a;\n }\n case \"jsonb_delete_path\": {\n if (args[0] === null || args[1] === null) return null;\n const obj =\n typeof args[0] === \"string\"\n ? (JSON.parse(args[0]) as unknown)\n : (JSON.parse(JSON.stringify(args[0])) as unknown);\n const path = Array.isArray(args[1])\n ? (args[1] as string[])\n : toStr(args[1])\n .replace(/^\\{/, \"\")\n .replace(/\\}$/, \"\")\n .split(\",\")\n .map((s) => s.trim());\n if (path.length === 0) return obj;\n let cur: unknown = obj;\n for (let i = 0; i < path.length - 1; i++) {\n if (typeof cur === \"object\" && cur !== null && !Array.isArray(cur)) {\n cur = (cur as Record<string, unknown>)[path[i]!];\n } else if (Array.isArray(cur)) {\n cur = (cur as unknown[])[Number(path[i])];\n } else return obj;\n }\n const lastKey = path[path.length - 1]!;\n if (typeof cur === \"object\" && cur !== null && !Array.isArray(cur)) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete (cur as Record<string, unknown>)[lastKey];\n } else if (Array.isArray(cur)) {\n (cur as unknown[]).splice(Number(lastKey), 1);\n }\n return obj;\n }\n\n // Utility / system functions\n case \"current_schema\":\n case \"current_schemas\":\n return \"public\";\n case \"current_database\":\n return \"uqa\";\n case \"current_user\":\n case \"session_user\":\n return \"uqa_user\";\n case \"version\":\n return \"UQA 1.0\";\n case \"has_table_privilege\":\n case \"has_schema_privilege\":\n case \"has_column_privilege\":\n return true;\n case \"txid_current\":\n return 1;\n\n // UQA text search functions: row-level evaluation for WHERE clause\n case \"text_match\":\n case \"bayesian_match\": {\n if (args.length < 2) return false;\n const text = args[0];\n const query = args[1];\n if (text === null || query === null) return false;\n return ftsMatch(\n String(text as string | number),\n String(query as string | number),\n );\n }\n\n default:\n throw new Error(`Unknown SQL function: ${name}`);\n }\n}\n\n// -- Helpers for AST node access ------------------------------------------------\n\nfunction nodeGet(node: Record<string, unknown>, key: string): unknown {\n return node[key] ?? null;\n}\n\nfunction nodeStr(node: Record<string, unknown>, key: string): string {\n const v = node[key];\n return v === undefined || v === null ? \"\" : toStr(v);\n}\n\nfunction asObj(value: unknown): Record<string, unknown> {\n return value as Record<string, unknown>;\n}\n\nfunction asList(value: unknown): Record<string, unknown>[] {\n if (Array.isArray(value)) return value as Record<string, unknown>[];\n return [];\n}\n\n// -- JSON containment helper ----------------------------------------------------\n\nfunction jsonContains(container: unknown, contained: unknown): boolean {\n if (contained === null || contained === undefined) return true;\n if (container === null || container === undefined) return false;\n if (typeof contained !== \"object\") return container === contained;\n if (Array.isArray(contained)) {\n if (!Array.isArray(container)) return false;\n // Every element in contained must be found in container\n for (const item of contained as unknown[]) {\n if (!(container as unknown[]).some((c) => jsonContains(c, item))) return false;\n }\n return true;\n }\n if (typeof container !== \"object\" || Array.isArray(container)) return false;\n // Both are objects\n for (const [key, val] of Object.entries(contained as Record<string, unknown>)) {\n if (!(key in (container as Record<string, unknown>))) return false;\n if (!jsonContains((container as Record<string, unknown>)[key], val)) return false;\n }\n return true;\n}\n\n// -- LIKE matching --------------------------------------------------------------\n\nfunction likeToRegex(pattern: string, caseInsensitive: boolean): RegExp {\n let regex = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i]!;\n if (ch === \"%\") {\n regex += \".*\";\n } else if (ch === \"_\") {\n regex += \".\";\n } else if (ch === \"\\\\\" && i + 1 < pattern.length) {\n i++;\n regex += pattern[i]!.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n } else {\n regex += ch.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n }\n regex += \"$\";\n return new RegExp(regex, caseInsensitive ? \"is\" : \"s\");\n}\n\n// -- SQL type cast helper -------------------------------------------------------\n\nfunction castValue(value: unknown, typeName: string): unknown {\n if (value === null) return null;\n const lower = typeName.toLowerCase();\n\n if (\n lower === \"integer\" ||\n lower === \"int\" ||\n lower === \"int4\" ||\n lower === \"bigint\" ||\n lower === \"int8\" ||\n lower === \"smallint\" ||\n lower === \"int2\"\n ) {\n return Math.trunc(Number(value));\n }\n if (\n lower === \"float\" ||\n lower === \"float4\" ||\n lower === \"float8\" ||\n lower === \"double precision\" ||\n lower === \"real\" ||\n lower === \"numeric\" ||\n lower === \"decimal\"\n ) {\n return Number(value);\n }\n if (\n lower === \"text\" ||\n lower === \"varchar\" ||\n lower === \"char\" ||\n lower === \"character varying\"\n ) {\n return toStr(value);\n }\n if (lower === \"boolean\" || lower === \"bool\") {\n if (typeof value === \"string\") {\n const s = value.toLowerCase();\n return s === \"true\" || s === \"t\" || s === \"1\" || s === \"yes\";\n }\n return Boolean(value);\n }\n if (lower === \"json\" || lower === \"jsonb\") {\n if (typeof value === \"string\") return JSON.parse(value) as unknown;\n return value;\n }\n if (lower === \"date\" || lower === \"timestamp\" || lower === \"timestamptz\") {\n return new Date(toStr(value)).toISOString();\n }\n\n // Unknown cast -- return as-is\n return value;\n}\n\n// -- ExprEvaluator --------------------------------------------------------------\n\n/**\n * Callback type for executing subqueries from within ExprEvaluator.\n * Takes a SelectStmt AST node and an optional outer row (for correlated subqueries)\n * and returns {columns, rows}.\n */\nexport type SubqueryExecutor = (\n stmt: Record<string, unknown>,\n outerRow?: Record<string, unknown>,\n) => { columns: string[]; rows: Record<string, unknown>[] };\n\nexport class ExprEvaluator {\n private _params: unknown[];\n private _sequences: Map<string, { current: number; increment: number }> | null;\n private _outerRow: Record<string, unknown> | null;\n private _subqueryExecutor: SubqueryExecutor | null;\n\n constructor(opts?: {\n params?: unknown[];\n sequences?: Map<string, { current: number; increment: number }>;\n outerRow?: Record<string, unknown>;\n subqueryExecutor?: SubqueryExecutor;\n }) {\n this._params = opts?.params ?? [];\n this._sequences = opts?.sequences ?? null;\n this._outerRow = opts?.outerRow ?? null;\n this._subqueryExecutor = opts?.subqueryExecutor ?? null;\n }\n\n evaluate(node: Record<string, unknown>, row: Record<string, unknown>): unknown {\n // Dispatch on the first key of the node (libpg-query AST convention)\n const keys = Object.keys(node);\n if (keys.length === 0) return null;\n\n // If the node has a single top-level key that wraps the actual node, unwrap it\n const nodeType = keys[0]!;\n const inner = node[nodeType];\n\n switch (nodeType) {\n case \"ColumnRef\":\n return this._evalColumnRef(asObj(inner), row);\n case \"A_Const\":\n return this._evalConst(asObj(inner));\n case \"A_Expr\":\n return this._evalAExpr(asObj(inner), row);\n case \"BoolExpr\":\n return this._evalBoolExpr(asObj(inner), row);\n case \"FuncCall\":\n return this._evalFuncCall(asObj(inner), row);\n case \"NullTest\":\n return this._evalNullTest(asObj(inner), row);\n case \"CaseExpr\":\n return this._evalCaseExpr(asObj(inner), row);\n case \"NamedArgExpr\": {\n // Named argument -- evaluate the inner arg expression\n const naArg = nodeGet(asObj(inner), \"arg\");\n if (naArg !== null && naArg !== undefined) {\n return this.evaluate(naArg as Record<string, unknown>, row);\n }\n return null;\n }\n case \"TypeCast\":\n return this._evalTypeCast(asObj(inner), row);\n case \"ParamRef\":\n return this._evalParamRef(asObj(inner));\n case \"SubLink\":\n return this._evalSubLink(asObj(inner), row);\n case \"CoalesceExpr\":\n return this._evalCoalesceExpr(asObj(inner), row);\n case \"MinMaxExpr\":\n return this._evalMinMaxExpr(asObj(inner), row);\n case \"BooleanTest\":\n return this._evalBooleanTest(asObj(inner), row);\n case \"SQLValueFunction\":\n return this._evalSQLValueFunction(asObj(inner));\n case \"A_ArrayExpr\":\n return asList(nodeGet(asObj(inner), \"elements\")).map((item) =>\n this.evaluate(item, row),\n );\n case \"List\":\n // A List node wraps items in an \"items\" array\n return asList(nodeGet(asObj(inner), \"items\")).map((item) =>\n this.evaluate(item, row),\n );\n case \"String\":\n case \"str\":\n return nodeStr(asObj(inner), \"sval\") || nodeStr(asObj(inner), \"str\");\n case \"Integer\":\n return nodeGet(asObj(inner), \"ival\") ?? 0;\n case \"Float\":\n return Number(nodeStr(asObj(inner), \"fval\") || nodeStr(asObj(inner), \"str\"));\n default:\n // If node itself might be a value wrapper\n if (\"ival\" in node) return node[\"ival\"];\n if (\"fval\" in node) return Number(node[\"fval\"]);\n if (\"sval\" in node) return node[\"sval\"];\n if (\"boolval\" in node) return node[\"boolval\"];\n if (\"bsval\" in node) return node[\"bsval\"];\n // Return the raw node for unknown types\n return node;\n }\n }\n\n // -- ColumnRef ----------------------------------------------------------------\n\n private _evalColumnRef(\n node: Record<string, unknown>,\n row: Record<string, unknown>,\n ): unknown {\n const fields = asList(nodeGet(node, \"fields\"));\n if (fields.length === 0) return null;\n\n // Extract column name(s). fields can be [{String: {sval: \"col\"}}] or\n // [{String: {sval: \"table\"}}, {String: {sval: \"col\"}}]\n const names: string[] = [];\n for (const f of fields) {\n const strNode = nodeGet(f, \"String\") ?? nodeGet(f, \"str\");\n if (strNode !== null && typeof strNode === \"object\") {\n const sval = nodeStr(asObj(strNode), \"sval\") || nodeStr(asObj(strNode), \"str\");\n if (sval) names.push(sval);\n } else if (typeof strNode === \"string\") {\n names.push(strNode);\n } else if (typeof f === \"object\") {\n // Might be a direct sval\n const sval = nodeStr(f, \"sval\") || nodeStr(f, \"str\");\n if (sval) names.push(sval);\n }\n }\n\n // Look up by full qualified name or just column name\n if (names.length === 1) {\n const colName = names[0]!;\n if (colName in row) return row[colName];\n // Check outer row for correlated subquery\n if (this._outerRow !== null && colName in this._outerRow) {\n return this._outerRow[colName];\n }\n // Return null for unknown columns (matches SQL semantics)\n return null;\n }\n\n if (names.length === 2) {\n // table.column -- try \"table.column\" first, then just \"column\"\n const qualified = `${names[0]!}.${names[1]!}`;\n if (qualified in row) return row[qualified];\n // Check outer row for qualified name before falling back to\n // unqualified inner column (correlated subquery resolution)\n if (this._outerRow !== null && qualified in this._outerRow) {\n return this._outerRow[qualified];\n }\n const colName = names[1]!;\n if (colName in row) return row[colName];\n if (this._outerRow !== null && colName in this._outerRow) {\n return this._outerRow[colName];\n }\n return null;\n }\n\n return null;\n }\n\n // -- A_Const ------------------------------------------------------------------\n\n private _evalConst(node: Record<string, unknown>): unknown {\n // libpg-query v17+ uses nested value nodes:\n // {ival: {ival: N}}, {fval: {fval: \"...\"}}, {sval: {sval: \"...\"}},\n // {boolval: {boolval: T/F}}, {isnull: true}\n // Older or simplified form: {ival: N}, {sval: \"...\"}, etc.\n if (nodeGet(node, \"isnull\") === true) return null;\n\n const ival = nodeGet(node, \"ival\");\n if (ival !== null && ival !== undefined) {\n if (typeof ival === \"object\") {\n const inner = nodeGet(asObj(ival), \"ival\");\n if (inner !== null && inner !== undefined) return inner;\n // Protobuf empty object {} represents integer 0\n if (\n typeof ival === \"object\" &&\n Object.keys(ival as Record<string, unknown>).length === 0\n )\n return 0;\n return ival;\n }\n return ival;\n }\n\n const fval = nodeGet(node, \"fval\");\n if (fval !== null && fval !== undefined) {\n if (typeof fval === \"object\") return Number(nodeGet(asObj(fval), \"fval\") ?? fval);\n return Number(fval);\n }\n\n const sval = nodeGet(node, \"sval\");\n if (sval !== null && sval !== undefined) {\n if (typeof sval === \"object\") return nodeGet(asObj(sval), \"sval\") ?? sval;\n return sval;\n }\n\n const boolval = nodeGet(node, \"boolval\");\n if (boolval !== null && boolval !== undefined) {\n if (typeof boolval === \"object\")\n return nodeGet(asObj(boolval), \"boolval\") ?? boolval;\n return boolval;\n }\n\n const bsval = nodeGet(node, \"bsval\");\n if (bsval !== null && bsval !== undefined) {\n if (typeof bsval === \"object\") return nodeGet(asObj(bsval), \"bsval\") ?? bsval;\n return bsval;\n }\n\n // Nested value node (older format): {Integer: {ival: N}}, {String: {sval: ...}}\n const intNode = nodeGet(node, \"Integer\");\n if (intNode !== null && intNode !== undefined) {\n return nodeGet(asObj(intNode), \"ival\") ?? 0;\n }\n const floatNode = nodeGet(node, \"Float\");\n if (floatNode !== null && floatNode !== undefined) {\n return Number(\n nodeStr(asObj(floatNode), \"fval\") || nodeStr(asObj(floatNode), \"str\"),\n );\n }\n const strNode = nodeGet(node, \"String\");\n if (strNode !== null && strNode !== undefined) {\n return nodeStr(asObj(strNode), \"sval\") || nodeStr(asObj(strNode), \"str\");\n }\n const nullNode = nodeGet(node, \"Null\");\n if (nullNode !== null && nullNode !== undefined) return null;\n\n return null;\n }\n\n // -- A_Expr -------------------------------------------------------------------\n\n private _evalAExpr(\n node: Record<string, unknown>,\n row: Record<string, unknown>,\n ): unknown {\n const kindRaw = nodeGet(node, \"kind\");\n let kind: number;\n if (typeof kindRaw === \"number\") {\n kind = kindRaw;\n } else if (typeof kindRaw === \"string\") {\n // libpg-query may emit string enum values like \"AEXPR_NULLIF\"\n const kindMap: Record<string, number> = {\n AEXPR_OP: 0,\n AEXPR_OP_ANY: 1,\n AEXPR_OP_ALL: 2,\n AEXPR_DISTINCT: 3,\n AEXPR_NOT_DISTINCT: 4,\n AEXPR_NULLIF: 5,\n AEXPR_IN: 6,\n AEXPR_LIKE: 7,\n AEXPR_ILIKE: 8,\n AEXPR_SIMILAR: 9,\n AEXPR_BETWEEN: 10,\n AEXPR_NOT_BETWEEN: 11,\n AEXPR_BETWEEN_SYM: 12,\n AEXPR_NOT_BETWEEN_SYM: 13,\n AEXPR_PAREN: 14,\n };\n kind = kindMap[kindRaw] ?? 0;\n } else {\n kind = 0;\n }\n\n // Extract operator name\n const nameList = asList(nodeGet(node, \"name\"));\n let opName = \"\";\n for (const n of nameList) {\n const strNode = nodeGet(n, \"String\") ?? nodeGet(n, \"str\");\n if (strNode !== null && typeof strNode === \"object\") {\n opName = nodeStr(asObj(strNode), \"sval\") || nodeStr(asObj(strNode), \"str\");\n } else if (typeof strNode === \"string\") {\n opName = strNode;\n } else {\n const sv = nodeStr(n, \"sval\") || nodeStr(n, \"str\");\n if (sv) opName = sv;\n }\n }\n\n const lexpr = nodeGet(node, \"lexpr\");\n const rexpr = nodeGet(node, \"rexpr\");\n\n // AEXPR_OP = 0, AEXPR_OP_ANY = 1, AEXPR_OP_ALL = 2,\n // AEXPR_DISTINCT = 3, AEXPR_NOT_DISTINCT = 4,\n // AEXPR_NULLIF = 5, AEXPR_IN = 6, AEXPR_LIKE = 7,\n // AEXPR_ILIKE = 8, AEXPR_SIMILAR = 9, AEXPR_BETWEEN = 10,\n // AEXPR_NOT_BETWEEN = 11, AEXPR_BETWEEN_SYM = 12,\n // AEXPR_NOT_BETWEEN_SYM = 13, AEXPR_PAREN = 14\n\n // BETWEEN: kind = 10\n if (kind === 10 || kind === 11) {\n const val = this.evaluate(asObj(lexpr), row);\n const rexprObj = asObj(rexpr);\n const listNode = nodeGet(rexprObj, \"List\");\n const itemsRaw =\n listNode !== null\n ? nodeGet(asObj(listNode), \"items\")\n : nodeGet(rexprObj, \"items\");\n const rangeItems = asList(itemsRaw ?? rexpr);\n if (rangeItems.length >= 2) {\n const low = this.evaluate(rangeItems[0]!, row);\n const high = this.evaluate(rangeItems[1]!, row);\n if (val === null || low === null || high === null) return null;\n const result =\n (val as number) >= (low as number) && (val as number) <= (high as number);\n return kind === 11 ? !result : result;\n }\n return null;\n }\n\n // LIKE / ILIKE: kind = 7 / 8\n if (kind === 7 || kind === 8) {\n const left = this.evaluate(asObj(lexpr), row);\n const right = this.evaluate(asObj(rexpr), row);\n if (left === null || right === null) return null;\n const re = likeToRegex(toStr(right), kind === 8);\n const result = re.test(toStr(left));\n // If the operator name contains \"!~~\" or \"NOT\", negate\n if (opName === \"!~~\" || opName === \"!~~*\") return !result;\n return result;\n }\n\n // SIMILAR TO: kind = 9\n if (kind === 9) {\n const left = this.evaluate(asObj(lexpr), row);\n const right = this.evaluate(asObj(rexpr), row);\n if (left === null || right === null) return null;\n // SIMILAR TO uses SQL regex syntax: % -> .*, _ -> ., | for alternation\n let pattern = toStr(right);\n pattern = pattern.replace(/%/g, \".*\").replace(/_/g, \".\");\n const re = new RegExp(\"^\" + pattern + \"$\");\n return re.test(toStr(left));\n }\n\n // BETWEEN SYMMETRIC: kind = 12, NOT BETWEEN SYMMETRIC: kind = 13\n if (kind === 12 || kind === 13) {\n const val = this.evaluate(asObj(lexpr), row);\n const rexprObj2 = asObj(rexpr);\n const listNode2 = nodeGet(rexprObj2, \"List\");\n const itemsRaw2 =\n listNode2 !== null\n ? nodeGet(asObj(listNode2), \"items\")\n : nodeGet(rexprObj2, \"items\");\n const rangeItems = asList(itemsRaw2 ?? rexpr);\n if (rangeItems.length >= 2) {\n const a = this.evaluate(rangeItems[0]!, row);\n const b = this.evaluate(rangeItems[1]!, row);\n if (val === null || a === null || b === null) return null;\n const low = (a as number) < (b as number) ? a : b;\n const high = (a as number) >= (b as number) ? a : b;\n const result =\n (val as number) >= (low as number) && (val as number) <= (high as number);\n return kind === 13 ? !result : result;\n }\n return null;\n }\n\n // AEXPR_OP_ANY: kind = 1 (op ANY (array))\n if (kind === 1) {\n const left = this.evaluate(asObj(lexpr), row);\n const right = this.evaluate(asObj(rexpr), row);\n if (left === null || right === null) return null;\n const arr = Array.isArray(right) ? (right as unknown[]) : [right];\n return arr.some((v) => this._applyOp(opName, left, v) === true);\n }\n\n // AEXPR_OP_ALL: kind = 2 (op ALL (array))\n if (kind === 2) {\n const left = this.evaluate(asObj(lexpr), row);\n const right = this.evaluate(asObj(rexpr), row);\n if (left === null || right === null) return null;\n const arr = Array.isArray(right) ? (right as unknown[]) : [right];\n return arr.every((v) => this._applyOp(opName, left, v) === true);\n }\n\n // AEXPR_DISTINCT: kind = 3 (IS DISTINCT FROM)\n if (kind === 3) {\n const left = this.evaluate(asObj(lexpr), row);\n const right = this.evaluate(asObj(rexpr), row);\n if (left === null && right === null) return false;\n if (left === null || right === null) return true;\n return left !== right;\n }\n\n // AEXPR_NOT_DISTINCT: kind = 4 (IS NOT DISTINCT FROM)\n if (kind === 4) {\n const left = this.evaluate(asObj(lexpr), row);\n const right = this.evaluate(asObj(rexpr), row);\n if (left === null && right === null) return true;\n if (left === null || right === null) return false;\n return left === right;\n }\n\n // AEXPR_NULLIF: kind = 5\n if (kind === 5) {\n const left = this.evaluate(asObj(lexpr), row);\n const right = this.evaluate(asObj(rexpr), row);\n return left === right ? null : left;\n }\n\n // IN: kind = 6\n if (kind === 6) {\n const left = this.evaluate(asObj(lexpr), row);\n if (left === null) return null;\n // Unwrap List node if present\n const rexprObj3 = asObj(rexpr);\n const listNodeIn = nodeGet(rexprObj3, \"List\");\n const itemsIn =\n listNodeIn !== null\n ? asList(nodeGet(asObj(listNodeIn), \"items\"))\n : asList(rexpr);\n let inList: unknown[];\n if (itemsIn.length > 0) {\n inList = itemsIn.map((item) => this.evaluate(item, row));\n } else {\n const evaluated = this.evaluate(rexprObj3, row);\n inList = Array.isArray(evaluated) ? evaluated : [evaluated];\n }\n // Use loose equality for cross-type comparison (e.g., number vs string)\n return inList.some((v) => v == left);\n }\n\n // Standard binary operators (kind = 0)\n const left = lexpr !== null ? this.evaluate(asObj(lexpr), row) : null;\n const right = rexpr !== null ? this.evaluate(asObj(rexpr), row) : null;\n\n return this._applyOp(opName, left, right);\n }\n\n private _applyOp(op: string, left: unknown, right: unknown): unknown {\n // Arithmetic\n if (op === \"+\") {\n if (left === null || right === null) return null;\n if (typeof left === \"string\" || typeof right === \"string\") {\n return toStr(left) + toStr(right);\n }\n return (left as number) + (right as number);\n }\n if (op === \"-\") {\n if (left === null || right === null) return null;\n return (left as number) - (right as number);\n }\n if (op === \"*\") {\n if (left === null || right === null) return null;\n return (left as number) * (right as number);\n }\n if (op === \"/\") {\n if (left === null || right === null) return null;\n const r = right as number;\n if (r === 0) throw new Error(\"Division by zero\");\n return (left as number) / r;\n }\n if (op === \"%\") {\n if (left === null || right === null) return null;\n return (left as number) % (right as number);\n }\n if (op === \"^\") {\n if (left === null || right === null) return null;\n return Math.pow(left as number, right as number);\n }\n\n // Comparison\n if (op === \"=\") {\n if (left === null || right === null) return null;\n return left === right;\n }\n if (op === \"<>\" || op === \"!=\") {\n if (left === null || right === null) return null;\n return left !== right;\n }\n if (op === \"<\") {\n if (left === null || right === null) return null;\n return (left as number) < (right as number);\n }\n if (op === \">\") {\n if (left === null || right === null) return null;\n return (left as number) > (right as number);\n }\n if (op === \"<=\") {\n if (left === null || right === null) return null;\n return (left as number) <= (right as number);\n }\n if (op === \">=\") {\n if (left === null || right === null) return null;\n return (left as number) >= (right as number);\n }\n\n // String operators\n if (op === \"||\") {\n if (left === null || right === null) return null;\n return toStr(left) + toStr(right);\n }\n if (op === \"~~\") {\n // LIKE\n if (left === null || right === null) return null;\n return likeToRegex(toStr(right), false).test(toStr(left));\n }\n if (op === \"!~~\") {\n // NOT LIKE\n if (left === null || right === null) return null;\n return !likeToRegex(toStr(right), false).test(toStr(left));\n }\n if (op === \"~~*\") {\n // ILIKE\n if (left === null || right === null) return null;\n return likeToRegex(toStr(right), true).test(toStr(left));\n }\n if (op === \"!~~*\") {\n // NOT ILIKE\n if (left === null || right === null) return null;\n return !likeToRegex(toStr(right), true).test(toStr(left));\n }\n\n // Regex match\n if (op === \"~\") {\n if (left === null || right === null) return null;\n return new RegExp(toStr(right)).test(toStr(left));\n }\n if (op === \"~*\") {\n if (left === null || right === null) return null;\n return new RegExp(toStr(right), \"i\").test(toStr(left));\n }\n if (op === \"!~\") {\n if (left === null || right === null) return null;\n return !new RegExp(toStr(right)).test(toStr(left));\n }\n if (op === \"!~*\") {\n if (left === null || right === null) return null;\n return !new RegExp(toStr(right), \"i\").test(toStr(left));\n }\n\n // Bitwise\n if (op === \"&\") {\n if (left === null || right === null) return null;\n return (left as number) & (right as number);\n }\n if (op === \"|\") {\n if (left === null || right === null) return null;\n return (left as number) | (right as number);\n }\n if (op === \"#\") {\n if (left === null || right === null) return null;\n return (left as number) ^ (right as number);\n }\n if (op === \"<<\") {\n if (left === null || right === null) return null;\n return (left as number) << (right as number);\n }\n if (op === \">>\") {\n if (left === null || right === null) return null;\n return (left as number) >> (right as number);\n }\n\n // JSON operators\n if (op === \"->\") {\n // JSON field access (returns JSON)\n if (left === null || right === null) return null;\n const obj: unknown =\n typeof left === \"string\" ? (JSON.parse(left) as unknown) : left;\n if (typeof right === \"number\" && Array.isArray(obj)) {\n return (obj as unknown[])[right] ?? null;\n }\n if (typeof obj === \"object\" && obj !== null && !Array.isArray(obj)) {\n return (obj as Record<string, unknown>)[toStr(right)] ?? null;\n }\n return null;\n }\n if (op === \"->>\") {\n // JSON field access (returns text)\n if (left === null || right === null) return null;\n const obj: unknown =\n typeof left === \"string\" ? (JSON.parse(left) as unknown) : left;\n if (typeof right === \"number\" && Array.isArray(obj)) {\n const v = (obj as unknown[])[right];\n if (v === null || v === undefined) return null;\n return typeof v === \"object\" ? JSON.stringify(v) : toStr(v);\n }\n if (typeof obj === \"object\" && obj !== null && !Array.isArray(obj)) {\n const v = (obj as Record<string, unknown>)[toStr(right)];\n if (v === null || v === undefined) return null;\n return typeof v === \"object\" ? JSON.stringify(v) : toStr(v);\n }\n return null;\n }\n if (op === \"#>\") {\n // JSON path access (returns JSON)\n if (left === null || right === null) return null;\n let obj: unknown = typeof left === \"string\" ? JSON.parse(left) : left;\n const path = Array.isArray(right)\n ? (right as unknown[])\n : toStr(right)\n .replace(/^\\{/, \"\")\n .replace(/\\}$/, \"\")\n .split(\",\")\n .map((s) => s.trim());\n for (const key of path) {\n if (obj === null || obj === undefined) return null;\n if (Array.isArray(obj)) {\n obj = (obj as unknown[])[Number(key)];\n } else if (typeof obj === \"object\") {\n obj = (obj as Record<string, unknown>)[toStr(key)];\n } else {\n return null;\n }\n }\n return obj ?? null;\n }\n if (op === \"#>>\") {\n // JSON path access (returns text)\n if (left === null || right === null) return null;\n const result = this._applyOp(\"#>\", left, right);\n if (result === null || result === undefined) return null;\n return typeof result === \"object\" ? JSON.stringify(result) : toStr(result);\n }\n if (op === \"@>\") {\n // JSON containment (left contains right)\n if (left === null || right === null) return null;\n const leftObj: unknown =\n typeof left === \"string\" ? (JSON.parse(left) as unknown) : left;\n const rightObj: unknown =\n typeof right === \"string\" ? (JSON.parse(right) as unknown) : right;\n return jsonContains(leftObj, rightObj);\n }\n if (op === \"<@\") {\n // JSON containment (right contains left)\n if (left === null || right === null) return null;\n const leftObj: unknown =\n typeof left === \"string\" ? (JSON.parse(left) as unknown) : left;\n const rightObj: unknown =\n typeof right === \"string\" ? (JSON.parse(right) as unknown) : right;\n return jsonContains(rightObj, leftObj);\n }\n if (op === \"?\") {\n // JSON key existence\n if (left === null || right === null) return null;\n const obj: unknown =\n typeof left === \"string\" ? (JSON.parse(left) as unknown) : left;\n if (typeof obj === \"object\" && obj !== null && !Array.isArray(obj)) {\n return toStr(right) in (obj as Record<string, unknown>);\n }\n if (Array.isArray(obj)) {\n return (obj as unknown[]).includes(toStr(right));\n }\n return false;\n }\n if (op === \"?|\") {\n // JSON key existence (any)\n if (left === null || right === null) return null;\n const obj: unknown =\n typeof left === \"string\" ? (JSON.parse(left) as unknown) : left;\n const keys = Array.isArray(right) ? (right as string[]) : [toStr(right)];\n if (typeof obj === \"object\" && obj !== null && !Array.isArray(obj)) {\n return keys.some((k) => k in (obj as Record<string, unknown>));\n }\n return false;\n }\n if (op === \"?&\") {\n // JSON key existence (all)\n if (left === null || right === null) return null;\n const obj: unknown =\n typeof left === \"string\" ? (JSON.parse(left) as unknown) : left;\n const keys = Array.isArray(right) ? (right as string[]) : [toStr(right)];\n if (typeof obj === \"object\" && obj !== null && !Array.isArray(obj)) {\n return keys.every((k) => k in (obj as Record<string, unknown>));\n }\n return false;\n }\n\n // Array operators\n if (op === \"&&\") {\n // Array overlap\n if (left === null || right === null) return null;\n if (Array.isArray(left) && Array.isArray(right)) {\n const rightSet = new Set(right as unknown[]);\n return (left as unknown[]).some((v) => rightSet.has(v));\n }\n return false;\n }\n\n // Full-text search operator\n if (op === \"@@\") {\n if (left === null || right === null) return false;\n const text = String(left as string | number).toLowerCase();\n const query = String(right as string | number);\n return ftsMatch(text, query);\n }\n\n throw new Error(`Unsupported operator: \"${op}\"`);\n }\n\n // -- BoolExpr -----------------------------------------------------------------\n\n private _evalBoolExpr(\n node: Record<string, unknown>,\n row: Record<string, unknown>,\n ): unknown {\n const boolop = nodeGet(node, \"boolop\");\n const args = asList(nodeGet(node, \"args\"));\n\n // BOOL_AND = 0 (\"AND_EXPR\"), BOOL_OR = 1 (\"OR_EXPR\"), BOOL_NOT = 2 (\"NOT_EXPR\")\n if (boolop === 0 || boolop === \"BOOL_AND\" || boolop === \"AND_EXPR\") {\n let result: unknown = true;\n for (const arg of args) {\n const v = this.evaluate(arg, row);\n if (v === false) return false;\n if (v === null) result = null;\n }\n return result;\n }\n\n if (boolop === 1 || boolop === \"BOOL_OR\" || boolop === \"OR_EXPR\") {\n let result: unknown = false;\n for (const arg of args) {\n const v = this.evaluate(arg, row);\n if (v === true) return true;\n if (v === null) result = null;\n }\n return result;\n }\n\n if (boolop === 2 || boolop === \"BOOL_NOT\" || boolop === \"NOT_EXPR\") {\n const v = this.evaluate(args[0]!, row);\n if (v === null) return null;\n return !v;\n }\n\n throw new Error(`Unknown BoolExpr boolop: ${toStr(boolop)}`);\n }\n\n // -- FuncCall -----------------------------------------------------------------\n\n private _evalFuncCall(\n node: Record<string, unknown>,\n row: Record<string, unknown>,\n ): unknown {\n // Extract function name\n const funcNameList = asList(nodeGet(node, \"funcname\"));\n const nameSegments: string[] = [];\n for (const seg of funcNameList) {\n const strNode = nodeGet(seg, \"String\") ?? nodeGet(seg, \"str\");\n if (strNode !== null && typeof strNode === \"object\") {\n const sval = nodeStr(asObj(strNode), \"sval\") || nodeStr(asObj(strNode), \"str\");\n if (sval) nameSegments.push(sval);\n } else if (typeof strNode === \"string\") {\n nameSegments.push(strNode);\n } else {\n const sv = nodeStr(seg, \"sval\") || nodeStr(seg, \"str\");\n if (sv) nameSegments.push(sv);\n }\n }\n let funcName = nameSegments.join(\".\").toLowerCase();\n // Strip pg_catalog schema prefix (PostgreSQL system catalog)\n if (funcName.startsWith(\"pg_catalog.\")) {\n funcName = funcName.slice(\"pg_catalog.\".length);\n }\n\n // Handle aggregate functions that were pre-computed for HAVING clause\n const AGG_NAMES = new Set([\n \"count\",\n \"sum\",\n \"avg\",\n \"min\",\n \"max\",\n \"string_agg\",\n \"array_agg\",\n \"bool_and\",\n \"bool_or\",\n \"stddev\",\n \"stddev_pop\",\n \"stddev_samp\",\n \"variance\",\n \"var_pop\",\n \"var_samp\",\n \"corr\",\n \"covar_pop\",\n \"covar_samp\",\n \"regr_slope\",\n \"regr_intercept\",\n \"regr_r2\",\n \"regr_count\",\n \"regr_avgx\",\n \"regr_avgy\",\n \"regr_sxx\",\n \"regr_syy\",\n \"regr_sxy\",\n ]);\n if (AGG_NAMES.has(funcName)) {\n // Check if the aggregate was pre-computed and stored in the row\n const isStar = nodeGet(node, \"agg_star\") === true;\n const argNodes = asList(nodeGet(node, \"args\"));\n let aggKey: string;\n if (isStar || argNodes.length === 0) {\n aggKey = `${funcName}(*)`;\n } else {\n try {\n const colRef = nodeGet(argNodes[0]!, \"ColumnRef\");\n if (colRef) {\n const fields = asList(nodeGet(asObj(colRef), \"fields\"));\n const colParts: string[] = [];\n for (const f of fields) {\n const s = nodeStr(f, \"sval\") || nodeStr(f, \"str\");\n if (s) colParts.push(s);\n }\n aggKey = `${funcName}(${colParts.join(\".\")})`;\n } else {\n aggKey = funcName;\n }\n } catch {\n aggKey = funcName;\n }\n }\n if (aggKey in row) {\n return row[aggKey];\n }\n // Also check for __having_agg_ synthetic key\n const syntheticKey = `__having_agg_${JSON.stringify({ FuncCall: node })}`;\n if (syntheticKey in row) {\n return row[syntheticKey];\n }\n }\n\n // Handle sequence functions\n if (funcName === \"nextval\" && this._sequences !== null) {\n const argNodes = asList(nodeGet(node, \"args\"));\n const seqName =\n argNodes.length > 0 ? toStr(this.evaluate(argNodes[0]!, row)) : \"\";\n const seq = this._sequences.get(seqName);\n if (seq) {\n seq.current += seq.increment;\n return seq.current;\n }\n throw new Error(`Sequence not found: \"${seqName}\"`);\n }\n if (funcName === \"currval\" && this._sequences !== null) {\n const argNodes = asList(nodeGet(node, \"args\"));\n const seqName =\n argNodes.length > 0 ? toStr(this.evaluate(argNodes[0]!, row)) : \"\";\n const seq = this._sequences.get(seqName);\n if (seq) {\n return seq.current;\n }\n throw new Error(`Sequence not found: \"${seqName}\"`);\n }\n if (funcName === \"setval\" && this._sequences !== null) {\n const argNodes = asList(nodeGet(node, \"args\"));\n if (argNodes.length < 2)\n throw new Error(\"setval() requires at least 2 arguments\");\n const seqName = toStr(this.evaluate(argNodes[0]!, row));\n const newVal = Number(this.evaluate(argNodes[1]!, row));\n const seq = this._sequences.get(seqName);\n if (seq) {\n // If third argument is true (default), next nextval() returns newVal + increment\n // If false, next nextval() returns newVal\n const isCalled =\n argNodes.length >= 3 ? Boolean(this.evaluate(argNodes[2]!, row)) : true;\n seq.current = isCalled ? newVal : newVal - seq.increment;\n return newVal;\n }\n throw new Error(`Sequence not found: \"${seqName}\"`);\n }\n if (funcName === \"lastval\" && this._sequences !== null) {\n // Return the value most recently returned by nextval in the current session\n let latest: number | null = null;\n for (const seq of this._sequences.values()) {\n if (latest === null || seq.current > latest) {\n latest = seq.current;\n }\n }\n if (latest === null)\n throw new Error(\"lastval is not yet defined in this session\");\n return latest;\n }\n\n // Handle special case: count(*) with agg_star\n if (nodeGet(node, \"agg_star\") === true) {\n // This is count(*); in row-level evaluation context, return 1\n return 1;\n }\n\n // Evaluate arguments\n const argNodes = asList(nodeGet(node, \"args\"));\n\n // Handle named arguments for make_interval\n if (funcName === \"make_interval\") {\n const hasNamedArgs = argNodes.some(\n (arg) =>\n nodeGet(arg, \"NamedArgExpr\") !== null &&\n nodeGet(arg, \"NamedArgExpr\") !== undefined,\n );\n if (hasNamedArgs) {\n const namedArgs: Record<string, number> = {\n years: 0,\n months: 0,\n weeks: 0,\n days: 0,\n hours: 0,\n mins: 0,\n secs: 0,\n };\n for (const arg of argNodes) {\n const na = nodeGet(arg, \"NamedArgExpr\");\n if (na !== null && na !== undefined) {\n const naObj = asObj(na);\n const argName = (nodeStr(naObj, \"name\") || \"\").toLowerCase();\n const argVal = nodeGet(naObj, \"arg\");\n const val =\n argVal !== null\n ? Number(this.evaluate(argVal as Record<string, unknown>, row))\n : 0;\n if (argName in namedArgs) {\n namedArgs[argName] = val;\n }\n }\n }\n return callScalarFunction(funcName, [\n namedArgs[\"years\"],\n namedArgs[\"months\"],\n namedArgs[\"weeks\"],\n namedArgs[\"days\"],\n namedArgs[\"hours\"],\n namedArgs[\"mins\"],\n namedArgs[\"secs\"],\n ]);\n }\n }\n\n const evaluatedArgs = argNodes.map((arg) => this.evaluate(arg, row));\n\n return callScalarFunction(funcName, evaluatedArgs);\n }\n\n // -- NullTest -----------------------------------------------------------------\n\n private _evalNullTest(\n node: Record<string, unknown>,\n row: Record<string, unknown>,\n ): unknown {\n const arg = nodeGet(node, \"arg\");\n const nullTestType = nodeGet(node, \"nulltesttype\");\n const value = this.evaluate(asObj(arg), row);\n\n // IS_NULL = 0, IS_NOT_NULL = 1\n if (nullTestType === 0 || nullTestType === \"IS_NULL\") {\n return value === null || value === undefined;\n }\n return value !== null && value !== undefined;\n }\n\n // -- SQLValueFunction ---------------------------------------------------------\n\n private _evalSQLValueFunction(node: Record<string, unknown>): unknown {\n const op = nodeGet(node, \"op\");\n const opStr = typeof op === \"string\" ? op : \"\";\n if (opStr === \"SVFOP_CURRENT_DATE\") {\n const now = new Date();\n const y = String(now.getFullYear());\n const m = String(now.getMonth() + 1).padStart(2, \"0\");\n const d = String(now.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\n }\n if (opStr === \"SVFOP_CURRENT_TIMESTAMP\" || opStr === \"SVFOP_CURRENT_TIMESTAMP_N\") {\n return new Date().toISOString();\n }\n if (opStr === \"SVFOP_CURRENT_TIME\" || opStr === \"SVFOP_CURRENT_TIME_N\") {\n const now = new Date();\n const h = String(now.getHours()).padStart(2, \"0\");\n const min = String(now.getMinutes()).padStart(2, \"0\");\n const s = String(now.getSeconds()).padStart(2, \"0\");\n return `${h}:${min}:${s}`;\n }\n if (opStr === \"SVFOP_LOCALTIME\" || opStr === \"SVFOP_LOCALTIME_N\") {\n const now = new Date();\n const h = String(now.getHours()).padStart(2, \"0\");\n const min = String(now.getMinutes()).padStart(2, \"0\");\n const s = String(now.getSeconds()).padStart(2, \"0\");\n return `${h}:${min}:${s}`;\n }\n if (opStr === \"SVFOP_LOCALTIMESTAMP\" || opStr === \"SVFOP_LOCALTIMESTAMP_N\") {\n return new Date().toISOString();\n }\n if (opStr === \"SVFOP_CURRENT_ROLE\") return \"current_user\";\n if (opStr === \"SVFOP_CURRENT_USER\") return \"current_user\";\n if (opStr === \"SVFOP_SESSION_USER\") return \"session_user\";\n if (opStr === \"SVFOP_USER\") return \"current_user\";\n if (opStr === \"SVFOP_CURRENT_CATALOG\") return \"uqa\";\n if (opStr === \"SVFOP_CURRENT_SCHEMA\") return \"public\";\n throw new Error(`Unsupported SQLValueFunction op: ${opStr}`);\n }\n\n // -- CaseExpr -----------------------------------------------------------------\n\n private _evalCaseExpr(\n node: Record<string, unknown>,\n row: Record<string, unknown>,\n ): unknown {\n const argNode = nodeGet(node, \"arg\");\n const baseValue =\n argNode !== null && argNode !== undefined\n ? this.evaluate(asObj(argNode), row)\n : null;\n\n const whenClauses = asList(nodeGet(node, \"args\"));\n for (const whenClause of whenClauses) {\n const caseWhen = nodeGet(whenClause, \"CaseWhen\") ?? whenClause;\n const exprNode = nodeGet(asObj(caseWhen), \"expr\");\n const resultNode = nodeGet(asObj(caseWhen), \"result\");\n\n if (baseValue !== null) {\n // Simple CASE: compare base value to each WHEN value\n const whenValue = this.evaluate(asObj(exprNode), row);\n if (baseValue === whenValue) {\n return this.evaluate(asObj(resultNode), row);\n }\n } else {\n // Searched CASE: evaluate WHEN expression as boolean\n const condition = this.evaluate(asObj(exprNode), row);\n if (condition === true) {\n return this.evaluate(asObj(resultNode), row);\n }\n }\n }\n\n // ELSE clause\n const defresult = nodeGet(node, \"defresult\");\n if (defresult !== null && defresult !== undefined) {\n return this.evaluate(asObj(defresult), row);\n }\n\n return null;\n }\n\n // -- TypeCast -----------------------------------------------------------------\n\n private _evalTypeCast(\n node: Record<string, unknown>,\n row: Record<string, unknown>,\n ): unknown {\n const arg = nodeGet(node, \"arg\");\n const typeName = nodeGet(node, \"typeName\");\n\n const value = this.evaluate(asObj(arg), row);\n\n // Extract type name from TypeName node\n const typeNameNode = asObj(typeName);\n const names = asList(nodeGet(typeNameNode, \"names\"));\n let typeStr = \"\";\n for (const n of names) {\n const strNode = nodeGet(n, \"String\") ?? nodeGet(n, \"str\");\n if (strNode !== null && typeof strNode === \"object\") {\n const sval = nodeStr(asObj(strNode), \"sval\") || nodeStr(asObj(strNode), \"str\");\n if (sval && sval !== \"pg_catalog\") typeStr = sval;\n } else if (typeof strNode === \"string\" && strNode !== \"pg_catalog\") {\n typeStr = strNode;\n } else {\n const sv = nodeStr(n, \"sval\") || nodeStr(n, \"str\");\n if (sv && sv !== \"pg_catalog\") typeStr = sv;\n }\n }\n\n if (!typeStr) return value;\n return castValue(value, typeStr);\n }\n\n // -- ParamRef -----------------------------------------------------------------\n\n private _evalParamRef(node: Record<string, unknown>): unknown {\n const number = nodeGet(node, \"number\");\n const idx = typeof number === \"number\" ? number : 0;\n // ParamRef numbers are 1-based\n if (idx > 0 && idx <= this._params.length) {\n return this._params[idx - 1];\n }\n // Numbered param out of range -- throw\n if (idx > 0 && idx > this._params.length) {\n throw new Error(`No value supplied for parameter $${String(idx)}`);\n }\n // $0 or unnumbered -> use next available param (positional)\n return null;\n }\n\n // -- SubLink ------------------------------------------------------------------\n\n private _evalSubLink(\n node: Record<string, unknown>,\n row: Record<string, unknown>,\n ): unknown {\n // SubLink is a subquery in expression context (EXISTS, IN, scalar subquery)\n if (this._subqueryExecutor === null) {\n throw new Error(\n \"SubLink (subquery) evaluation requires a subqueryExecutor callback\",\n );\n }\n\n const linkType = nodeGet(node, \"subLinkType\") as number | string;\n const subselect = asObj(nodeGet(node, \"subselect\"));\n const selectStmt = asObj(nodeGet(subselect, \"SelectStmt\") ?? subselect);\n const innerResult = this._subqueryExecutor(selectStmt, row);\n\n // EXISTS_SUBLINK = 0\n if (linkType === 0 || linkType === \"EXISTS_SUBLINK\") {\n return innerResult.rows.length > 0;\n }\n\n // ALL_SUBLINK = 1\n if (linkType === 1 || linkType === \"ALL_SUBLINK\") {\n const testExpr = asObj(nodeGet(node, \"testexpr\"));\n const lhsValue = this.evaluate(testExpr, row);\n const operName = this._extractSubLinkOperator(node);\n const subCol = innerResult.columns[0]!;\n for (const subRow of innerResult.rows) {\n const rhsValue = subRow[subCol];\n if (!this._compareValues(lhsValue, operName, rhsValue)) return false;\n }\n return true;\n }\n\n // ANY_SUBLINK = 2 (IN subquery)\n if (linkType === 2 || linkType === \"ANY_SUBLINK\") {\n const testExpr = asObj(nodeGet(node, \"testexpr\"));\n const lhsValue = this.evaluate(testExpr, row);\n if (innerResult.columns.length === 0) return false;\n const subCol = innerResult.columns[0]!;\n const operName = this._extractSubLinkOperator(node);\n for (const subRow of innerResult.rows) {\n const rhsValue = subRow[subCol];\n if (this._compareValues(lhsValue, operName, rhsValue)) return true;\n }\n return false;\n }\n\n // EXPR_SUBLINK = 4 (scalar subquery)\n if (linkType === 4 || linkType === \"EXPR_SUBLINK\") {\n if (innerResult.rows.length === 0) return null;\n const subCol = innerResult.columns[0]!;\n return innerResult.rows[0]![subCol] ?? null;\n }\n\n throw new Error(`Unsupported SubLink type: ${String(linkType)}`);\n }\n\n private _extractSubLinkOperator(node: Record<string, unknown>): string {\n const operNameList = asList(nodeGet(node, \"operName\"));\n if (operNameList.length > 0) {\n const item = operNameList[0]!;\n const str = nodeGet(item, \"str\");\n if (str !== null && str !== undefined) return String(str as string | number);\n const sval = nodeGet(asObj(nodeGet(item, \"String\") ?? item), \"sval\");\n if (sval !== null && sval !== undefined) return String(sval as string | number);\n }\n return \"=\";\n }\n\n private _compareValues(lhs: unknown, op: string, rhs: unknown): boolean {\n switch (op) {\n case \"=\":\n return lhs == rhs;\n case \"<>\":\n case \"!=\":\n return lhs != rhs;\n case \"<\":\n return (lhs as number) < (rhs as number);\n case \"<=\":\n return (lhs as number) <= (rhs as number);\n case \">\":\n return (lhs as number) > (rhs as number);\n case \">=\":\n return (lhs as number) >= (rhs as number);\n default:\n return lhs === rhs;\n }\n }\n\n // -- CoalesceExpr -------------------------------------------------------------\n\n private _evalCoalesceExpr(\n node: Record<string, unknown>,\n row: Record<string, unknown>,\n ): unknown {\n const args = asList(nodeGet(node, \"args\"));\n for (const arg of args) {\n const value = this.evaluate(arg, row);\n if (value !== null && value !== undefined) return value;\n }\n return null;\n }\n\n // -- MinMaxExpr ---------------------------------------------------------------\n\n private _evalMinMaxExpr(\n node: Record<string, unknown>,\n row: Record<string, unknown>,\n ): unknown {\n const op = nodeGet(node, \"op\");\n const args = asList(nodeGet(node, \"args\"));\n const values = args\n .map((arg) => this.evaluate(arg, row))\n .filter((v) => v !== null && v !== undefined);\n\n if (values.length === 0) return null;\n\n // IS_GREATEST = 0, IS_LEAST = 1\n if (op === 0 || op === \"IS_GREATEST\") {\n return values.reduce((a, b) => ((a as number) > (b as number) ? a : b));\n }\n return values.reduce((a, b) => ((a as number) < (b as number) ? a : b));\n }\n\n // -- BooleanTest --------------------------------------------------------------\n\n private _evalBooleanTest(\n node: Record<string, unknown>,\n row: Record<string, unknown>,\n ): unknown {\n const arg = nodeGet(node, \"arg\");\n const booltesttype = nodeGet(node, \"booltesttype\");\n const value = this.evaluate(asObj(arg), row);\n\n // IS_TRUE = 0, IS_NOT_TRUE = 1, IS_FALSE = 2, IS_NOT_FALSE = 3,\n // IS_UNKNOWN = 4, IS_NOT_UNKNOWN = 5\n switch (booltesttype) {\n case 0:\n case \"IS_TRUE\":\n return value === true;\n case 1:\n case \"IS_NOT_TRUE\":\n return value !== true;\n case 2:\n case \"IS_FALSE\":\n return value === false;\n case 3:\n case \"IS_NOT_FALSE\":\n return value !== false;\n case 4:\n case \"IS_UNKNOWN\":\n return value === null || value === undefined;\n case 5:\n case \"IS_NOT_UNKNOWN\":\n return value !== null && value !== undefined;\n default:\n throw new Error(`Unknown BooleanTest type: ${toStr(booltesttype)}`);\n }\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- SQL Table\n// 1:1 port of uqa/sql/table.py\n\nimport type { IndexedTerms } from \"../storage/abc/inverted-index.js\";\nimport type { DocumentStore } from \"../storage/abc/document-store.js\";\nimport type { InvertedIndex } from \"../storage/abc/inverted-index.js\";\nimport { MemoryDocumentStore } from \"../storage/document-store.js\";\nimport { MemoryInvertedIndex } from \"../storage/inverted-index.js\";\nimport type { VectorIndex } from \"../storage/vector-index.js\";\nimport { FlatVectorIndex } from \"../storage/vector-index.js\";\nimport { SpatialIndex } from \"../storage/spatial-index.js\";\n\n// -- ColumnStats ----------------------------------------------------------------\n\nexport interface ColumnStats {\n distinctCount: number;\n nullCount: number;\n minValue: unknown;\n maxValue: unknown;\n rowCount: number;\n histogram: unknown[];\n mcvValues: unknown[];\n mcvFrequencies: number[];\n}\n\nexport function columnStatsSelectivity(stats: ColumnStats): number {\n if (stats.distinctCount <= 0) return 1.0;\n return 1.0 / stats.distinctCount;\n}\n\n// -- ColumnDef ------------------------------------------------------------------\n\nexport interface ColumnDef {\n readonly name: string;\n readonly typeName: string;\n readonly pythonType: string; // \"number\" | \"string\" | \"boolean\" | \"object\" | \"array\"\n readonly primaryKey: boolean;\n readonly notNull: boolean;\n readonly autoIncrement: boolean;\n readonly defaultValue: unknown;\n readonly vectorDimensions: number | null;\n readonly unique: boolean;\n readonly numericPrecision: number | null;\n readonly numericScale: number | null;\n}\n\nexport function createColumnDef(\n name: string,\n typeName: string,\n opts?: Partial<Omit<ColumnDef, \"name\" | \"typeName\">>,\n): ColumnDef {\n return {\n name,\n typeName,\n pythonType: opts?.pythonType ?? \"string\",\n primaryKey: opts?.primaryKey ?? false,\n notNull: opts?.notNull ?? false,\n autoIncrement: opts?.autoIncrement ?? false,\n defaultValue: opts?.defaultValue ?? null,\n vectorDimensions: opts?.vectorDimensions ?? null,\n unique: opts?.unique ?? false,\n numericPrecision: opts?.numericPrecision ?? null,\n numericScale: opts?.numericScale ?? null,\n };\n}\n\n// -- ForeignKeyDef --------------------------------------------------------------\n\nexport interface ForeignKeyDef {\n readonly column: string;\n readonly refTable: string;\n readonly refColumn: string;\n}\n\n// -- Type map -------------------------------------------------------------------\n\nconst TYPE_MAP: ReadonlyMap<string, [string, string]> = new Map([\n [\"INT\", [\"integer\", \"number\"]],\n [\"INTEGER\", [\"integer\", \"number\"]],\n [\"SERIAL\", [\"integer\", \"number\"]],\n [\"BIGINT\", [\"integer\", \"number\"]],\n [\"BIGSERIAL\", [\"integer\", \"number\"]],\n [\"SMALLINT\", [\"integer\", \"number\"]],\n [\"SMALLSERIAL\", [\"integer\", \"number\"]],\n [\"INT2\", [\"integer\", \"number\"]],\n [\"INT4\", [\"integer\", \"number\"]],\n [\"INT8\", [\"integer\", \"number\"]],\n\n [\"FLOAT\", [\"float\", \"number\"]],\n [\"FLOAT4\", [\"float\", \"number\"]],\n [\"FLOAT8\", [\"float\", \"number\"]],\n [\"DOUBLE\", [\"float\", \"number\"]],\n [\"DOUBLE PRECISION\", [\"float\", \"number\"]],\n [\"REAL\", [\"float\", \"number\"]],\n [\"NUMERIC\", [\"float\", \"number\"]],\n [\"DECIMAL\", [\"float\", \"number\"]],\n\n [\"TEXT\", [\"text\", \"string\"]],\n [\"VARCHAR\", [\"text\", \"string\"]],\n [\"CHAR\", [\"text\", \"string\"]],\n [\"CHARACTER\", [\"text\", \"string\"]],\n [\"CHARACTER VARYING\", [\"text\", \"string\"]],\n [\"NAME\", [\"text\", \"string\"]],\n\n [\"BOOLEAN\", [\"boolean\", \"boolean\"]],\n [\"BOOL\", [\"boolean\", \"boolean\"]],\n\n [\"DATE\", [\"date\", \"string\"]],\n [\"TIME\", [\"time\", \"string\"]],\n [\"TIMESTAMP\", [\"timestamp\", \"string\"]],\n [\"TIMESTAMPTZ\", [\"timestamp\", \"string\"]],\n [\"TIMESTAMP WITH TIME ZONE\", [\"timestamp\", \"string\"]],\n [\"TIMESTAMP WITHOUT TIME ZONE\", [\"timestamp\", \"string\"]],\n [\"INTERVAL\", [\"interval\", \"string\"]],\n\n [\"VECTOR\", [\"vector\", \"object\"]],\n [\"POINT\", [\"point\", \"object\"]],\n\n [\"JSON\", [\"json\", \"object\"]],\n [\"JSONB\", [\"json\", \"object\"]],\n\n [\"BYTEA\", [\"bytea\", \"object\"]],\n\n [\"ARRAY\", [\"array\", \"array\"]],\n [\"UUID\", [\"text\", \"string\"]],\n]);\n\n/**\n * Resolve an array of SQL type name tokens into a canonical [typeName, jsTypeCategory] pair.\n */\nexport function resolveType(\n typeNames: string[],\n arrayBounds?: unknown[] | null,\n): [string, string] {\n const raw = typeNames[typeNames.length - 1]!.toLowerCase();\n\n if (raw === \"vector\") return [\"vector\", \"object\"];\n if (raw === \"point\") return [\"point\", \"object\"];\n\n if (arrayBounds !== null && arrayBounds !== undefined && arrayBounds.length > 0) {\n // Array column: e.g. TEXT[] -> element type is \"text\"\n const combined = typeNames.map((t) => t.toUpperCase()).join(\" \");\n const match = TYPE_MAP.get(combined) ?? TYPE_MAP.get(typeNames[0]!.toUpperCase());\n if (match === undefined) {\n throw new Error(`Unsupported array element type: ${raw}`);\n }\n return [`${raw}[]`, \"array\"];\n }\n\n // Try the full combined name first (e.g. \"DOUBLE PRECISION\")\n const combined = typeNames.map((t) => t.toUpperCase()).join(\" \");\n const fullMatch = TYPE_MAP.get(combined);\n if (fullMatch) return [fullMatch[0], fullMatch[1]];\n\n // Try the first token alone\n const first = typeNames[0];\n if (first !== undefined) {\n const singleMatch = TYPE_MAP.get(first.toUpperCase());\n if (singleMatch) return [singleMatch[0], singleMatch[1]];\n }\n\n // Unknown type -- fall back to text/string\n return [\"text\", \"string\"];\n}\n\n// -- Type coercion helpers ------------------------------------------------------\n\nfunction coerceJSON(value: unknown): unknown {\n if (typeof value === \"object\" && value !== null) return value;\n if (typeof value === \"string\") return JSON.parse(value);\n return value;\n}\n\nfunction coerceBytea(value: unknown): Uint8Array {\n if (value instanceof Uint8Array) return value;\n if (typeof value === \"string\") return new TextEncoder().encode(value);\n return new TextEncoder().encode(String(value));\n}\n\nfunction coerceArray(value: unknown): unknown[] {\n if (Array.isArray(value)) return value;\n if (typeof value === \"string\") return JSON.parse(value) as unknown[];\n return [value];\n}\n\nfunction coerceNumeric(value: unknown, scale: number): number {\n const num = typeof value === \"number\" ? value : Number(value);\n const factor = Math.pow(10, scale);\n return Math.round(num * factor) / factor;\n}\n\n// -- Table ----------------------------------------------------------------------\n\nconst HISTOGRAM_BUCKETS = 100;\nconst MCV_COUNT = 10;\n\nexport class Table {\n readonly name: string;\n readonly columns: Map<string, ColumnDef>;\n readonly primaryKey: string | null;\n checkConstraints: [string, (row: Record<string, unknown>) => boolean][];\n foreignKeys: ForeignKeyDef[];\n fkInsertValidators: ((row: Record<string, unknown>) => void)[];\n fkDeleteValidators: ((docId: number) => void)[];\n fkUpdateValidators: ((\n oldDoc: Record<string, unknown>,\n newDoc: Record<string, unknown>,\n ) => void)[];\n documentStore: DocumentStore;\n invertedIndex: InvertedIndex;\n vectorIndexes: Map<string, VectorIndex>;\n spatialIndexes: Map<string, SpatialIndex>;\n private _stats: Map<string, ColumnStats>;\n _nextDocId: number;\n private _uniqueIndexes: Map<string, Map<unknown, number>>;\n private _uniqueIndexesBuilt: boolean;\n\n constructor(name: string, columns: ColumnDef[], conn?: unknown) {\n this.name = name;\n this.columns = new Map<string, ColumnDef>();\n this.checkConstraints = [];\n this.foreignKeys = [];\n this.fkInsertValidators = [];\n this.fkDeleteValidators = [];\n this.fkUpdateValidators = [];\n this._stats = new Map();\n this._nextDocId = 1;\n this.vectorIndexes = new Map();\n this.spatialIndexes = new Map();\n this._uniqueIndexes = new Map();\n this._uniqueIndexesBuilt = false;\n\n // Determine primary key and populate column map\n let pk: string | null = null;\n for (const col of columns) {\n this.columns.set(col.name, col);\n if (col.primaryKey) {\n pk = col.name;\n }\n }\n this.primaryKey = pk;\n\n // Set up storage backends -- in-memory when conn is null/undefined\n void conn; // reserved for future backend selection\n this.documentStore = new MemoryDocumentStore();\n this.invertedIndex = new MemoryInvertedIndex();\n\n // Create vector indexes for VECTOR columns\n for (const col of columns) {\n if (col.typeName === \"vector\" && col.vectorDimensions !== null) {\n this.vectorIndexes.set(col.name, new FlatVectorIndex(col.vectorDimensions));\n }\n if (col.typeName === \"point\") {\n this.spatialIndexes.set(col.name, new SpatialIndex(this.name, col.name));\n }\n }\n }\n\n get columnNames(): string[] {\n return [...this.columns.keys()];\n }\n\n get rowCount(): number {\n return this.documentStore.length;\n }\n\n /**\n * Insert a row into the table. Returns [docId, indexedTerms].\n */\n insert(row: Record<string, unknown>): [number, IndexedTerms | null] {\n // -- primary key / doc_id resolution --\n let docId: number;\n if (this.primaryKey !== null) {\n const pkCol = this.columns.get(this.primaryKey)!;\n if (pkCol.autoIncrement) {\n if (\n !(this.primaryKey in row) ||\n row[this.primaryKey] === null ||\n row[this.primaryKey] === undefined\n ) {\n row[this.primaryKey] = this._nextDocId;\n }\n docId = row[this.primaryKey] as number;\n this._nextDocId = Math.max(this._nextDocId, docId + 1);\n } else {\n if (\n !(this.primaryKey in row) ||\n row[this.primaryKey] === null ||\n row[this.primaryKey] === undefined\n ) {\n throw new Error(\n `Missing primary key '${this.primaryKey}' for table '${this.name}'`,\n );\n }\n const pkVal = row[this.primaryKey];\n if (typeof pkVal === \"number\") {\n docId = pkVal;\n this._nextDocId = Math.max(this._nextDocId, docId + 1);\n } else {\n // Non-integer PK: auto-generate doc_id\n docId = this._nextDocId;\n this._nextDocId++;\n }\n }\n } else {\n docId = this._nextDocId;\n this._nextDocId++;\n }\n\n // -- NOT NULL validation --\n for (const [colName, colDef] of this.columns) {\n if (colDef.notNull && !colDef.autoIncrement) {\n const value = row[colName];\n if (value === null || value === undefined) {\n if (colDef.defaultValue !== null && colDef.defaultValue !== undefined) {\n row[colName] = colDef.defaultValue;\n } else {\n throw new Error(\n `NOT NULL constraint violated: column '${colName}' in table '${this.name}'`,\n );\n }\n }\n }\n }\n\n // -- UNIQUE constraint validation --\n this._buildUniqueIndexes();\n for (const [colName, colDef] of this.columns) {\n if (!(colDef.unique || colDef.primaryKey)) continue;\n if (colDef.autoIncrement) continue;\n const value = row[colName];\n if (value === null || value === undefined) continue; // NULL is allowed in UNIQUE\n const idx = this._uniqueIndexes.get(colName);\n if (idx !== undefined && idx.has(value)) {\n throw new Error(\n `UNIQUE constraint violated: duplicate value '${String(value as string | number)}' for column '${colName}' in table '${this.name}'`,\n );\n }\n }\n\n // -- CHECK constraint validation --\n for (const [constraintName, checkFn] of this.checkConstraints) {\n if (!checkFn(row)) {\n throw new Error(\n `CHECK constraint '${constraintName}' violated in table '${this.name}'`,\n );\n }\n }\n\n // -- FOREIGN KEY constraint validation --\n for (const fkValidator of this.fkInsertValidators) {\n fkValidator(row);\n }\n\n // -- unknown column check --\n for (const colName of Object.keys(row)) {\n if (!this.columns.has(colName)) {\n throw new Error(`Unknown column '${colName}' for table '${this.name}'`);\n }\n }\n\n // -- type coercion + defaults --\n const coerced: Record<string, unknown> = {};\n const vectors: Record<string, Float64Array> = {};\n const points: Record<string, [number, number]> = {};\n\n for (const [colName, colDef] of this.columns) {\n const rawValue = row[colName];\n if (rawValue !== null && rawValue !== undefined) {\n if (colDef.vectorDimensions !== null) {\n const vec =\n rawValue instanceof Float64Array\n ? rawValue\n : new Float64Array(rawValue as number[]);\n coerced[colName] = Array.from(vec);\n vectors[colName] = vec;\n } else if (colDef.typeName === \"point\") {\n const pt = rawValue as [number, number] | { x: number; y: number };\n let x: number, y: number;\n if (Array.isArray(pt)) {\n x = pt[0];\n y = pt[1];\n } else if (typeof pt === \"object\" && \"x\" in pt) {\n x = pt.x;\n y = pt.y;\n } else {\n throw new Error(\n `POINT column '${colName}' requires [x, y] (2 elements), got ${JSON.stringify(pt)}`,\n );\n }\n coerced[colName] = [x, y];\n points[colName] = [x, y];\n } else if (colDef.typeName === \"json\" || colDef.typeName === \"jsonb\") {\n coerced[colName] = coerceJSON(rawValue);\n } else if (colDef.typeName.endsWith(\"[]\")) {\n coerced[colName] = coerceArray(rawValue);\n } else if (colDef.typeName === \"bytea\") {\n coerced[colName] = coerceBytea(rawValue);\n } else if (colDef.numericScale !== null) {\n coerced[colName] = coerceNumeric(rawValue, colDef.numericScale);\n } else if (colDef.pythonType === \"number\") {\n coerced[colName] = Number(rawValue);\n } else if (colDef.pythonType === \"boolean\") {\n coerced[colName] = Boolean(rawValue);\n } else if (colDef.pythonType === \"string\") {\n coerced[colName] = String(rawValue as string | number);\n } else {\n coerced[colName] = rawValue;\n }\n } else if (colDef.defaultValue !== null && colDef.defaultValue !== undefined) {\n coerced[colName] = colDef.defaultValue;\n }\n // else: column absent -> not stored (sparse document)\n }\n\n // -- persist --\n this.documentStore.put(docId, coerced);\n\n let indexed: IndexedTerms | null = null;\n const textFields: Record<string, string> = {};\n for (const [k, v] of Object.entries(coerced)) {\n if (typeof v === \"string\") {\n textFields[k] = v;\n }\n }\n if (Object.keys(textFields).length > 0) {\n indexed = this.invertedIndex.addDocument(docId, textFields);\n }\n\n for (const [fieldName, vec] of Object.entries(vectors)) {\n const vecIdx = this.vectorIndexes.get(fieldName);\n if (vecIdx !== undefined) {\n vecIdx.add(docId, vec);\n }\n }\n\n for (const [fieldName, [px, py]] of Object.entries(points)) {\n const spIdx = this.spatialIndexes.get(fieldName);\n if (spIdx !== undefined) {\n spIdx.add(docId, px, py);\n }\n }\n\n // Maintain unique indexes.\n for (const [colName, idx] of this._uniqueIndexes) {\n const val = coerced[colName];\n if (val !== null && val !== undefined) {\n idx.set(val, docId);\n }\n }\n\n return [docId, indexed];\n }\n\n private _buildUniqueIndexes(): void {\n if (this._uniqueIndexesBuilt) return;\n this._uniqueIndexesBuilt = true;\n const uniqueCols: string[] = [];\n for (const [colName, colDef] of this.columns) {\n if ((colDef.unique || colDef.primaryKey) && !colDef.autoIncrement) {\n uniqueCols.push(colName);\n this._uniqueIndexes.set(colName, new Map());\n }\n }\n if (uniqueCols.length === 0) return;\n for (const docId of this.documentStore.docIds) {\n for (const colName of uniqueCols) {\n const val = this.documentStore.getField(docId, colName);\n if (val !== null && val !== undefined) {\n this._uniqueIndexes.get(colName)!.set(val, docId);\n }\n }\n }\n }\n\n removeFromUniqueIndexes(docId: number): void {\n for (const [colName, idx] of this._uniqueIndexes) {\n const val = this.documentStore.getField(docId, colName);\n if (val !== null && val !== undefined) {\n idx.delete(val);\n }\n }\n }\n\n /**\n * Compute column statistics for the query optimizer.\n */\n analyze(): Map<string, ColumnStats> {\n const docIds = [...this.documentStore.docIds].sort((a, b) => a - b);\n const n = docIds.length;\n const colNames = [...this.columns.keys()];\n\n // Single-pass: collect all column values per doc.\n const colValues: Map<string, unknown[]> = new Map();\n const colNulls: Map<string, number> = new Map();\n for (const c of colNames) {\n colValues.set(c, []);\n colNulls.set(c, 0);\n }\n\n for (const docId of docIds) {\n const doc = this.documentStore.get(docId);\n for (const colName of colNames) {\n const val = doc !== null ? (doc[colName] ?? null) : null;\n if (val === null) {\n colNulls.set(colName, (colNulls.get(colName) ?? 0) + 1);\n } else {\n colValues.get(colName)!.push(val);\n }\n }\n }\n\n const stats = new Map<string, ColumnStats>();\n for (const colName of colNames) {\n const values = colValues.get(colName)!;\n const nullCount = colNulls.get(colName)!;\n const distinct = new Set(\n values.map((v) =>\n typeof v === \"object\"\n ? JSON.stringify(v)\n : String(v as string | number | boolean),\n ),\n ).size;\n\n const comparable = values.filter(\n (v) => typeof v === \"number\" || typeof v === \"string\",\n );\n\n let minVal: unknown = null;\n let maxVal: unknown = null;\n if (comparable.length > 0) {\n minVal = comparable.reduce((a, b) => (a < b ? a : b));\n maxVal = comparable.reduce((a, b) => (a > b ? a : b));\n }\n\n const histogram = _buildHistogram(comparable);\n const [mcvValues, mcvFrequencies] = _buildMcv(values, n);\n\n stats.set(colName, {\n distinctCount: distinct,\n nullCount,\n minValue: minVal,\n maxValue: maxVal,\n rowCount: n,\n histogram,\n mcvValues,\n mcvFrequencies,\n });\n }\n\n this._stats = stats;\n return new Map(stats);\n }\n\n getColumnStats(colName: string): ColumnStats | null {\n return this._stats.get(colName) ?? null;\n }\n}\n\n// -- Histogram and MCV helpers --------------------------------------------------\n\nfunction _buildHistogram(values: (number | string)[]): unknown[] {\n if (values.length === 0) return [];\n try {\n const sorted = [...values].sort((a, b) => {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n return String(a).localeCompare(String(b));\n });\n\n const n = sorted.length;\n const numBuckets = Math.min(HISTOGRAM_BUCKETS, n);\n if (numBuckets <= 1) {\n return [sorted[0], sorted[n - 1]];\n }\n\n const boundaries: unknown[] = [sorted[0]];\n for (let i = 1; i < numBuckets; i++) {\n const idx = Math.floor((i * n) / numBuckets);\n const val = sorted[idx];\n if (val !== boundaries[boundaries.length - 1]) {\n boundaries.push(val);\n }\n }\n if (boundaries[boundaries.length - 1] !== sorted[n - 1]) {\n boundaries.push(sorted[n - 1]);\n }\n return boundaries;\n } catch {\n return [];\n }\n}\n\nfunction _buildMcv(values: unknown[], total: number): [unknown[], number[]] {\n if (values.length === 0 || total <= 0) return [[], []];\n\n const counts = new Map<string, { value: unknown; count: number }>();\n for (const v of values) {\n const key =\n typeof v === \"object\"\n ? JSON.stringify(v)\n : String(v as string | number | boolean);\n const entry = counts.get(key);\n if (entry !== undefined) {\n entry.count++;\n } else {\n counts.set(key, { value: v, count: 1 });\n }\n }\n\n const ndv = counts.size;\n if (ndv <= 0) return [[], []];\n\n const avgFreq = 1.0 / ndv;\n const sorted = [...counts.values()]\n .sort((a, b) => b.count - a.count)\n .slice(0, MCV_COUNT);\n\n const aboveAvg = sorted.filter((e) => e.count / total > avgFreq);\n if (aboveAvg.length === 0) return [[], []];\n\n return [aboveAvg.map((e) => e.value), aboveAvg.map((e) => e.count / total)];\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- sparse threshold operator\n// 1:1 port of uqa/operators/sparse.py\n\nimport type { IndexStats } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"./base.js\";\nimport { Operator } from \"./base.js\";\n\nexport class SparseThresholdOperator extends Operator {\n readonly source: Operator;\n readonly threshold: number;\n\n constructor(source: Operator, threshold: number) {\n super();\n this.source = source;\n this.threshold = threshold;\n }\n\n execute(context: ExecutionContext): PostingList {\n const sourcePl = this.source.execute(context);\n const entries: { docId: number; payload: ReturnType<typeof createPayload> }[] = [];\n\n for (const e of sourcePl) {\n const adjusted = e.payload.score - this.threshold;\n if (adjusted > 0) {\n entries.push({\n docId: e.docId,\n payload: createPayload({\n positions: e.payload.positions as number[],\n score: adjusted,\n fields: e.payload.fields as Record<string, unknown>,\n }),\n });\n }\n }\n\n return PostingList.fromSorted(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return this.source.costEstimate(stats);\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- multi-stage retrieval operator\n// 1:1 port of uqa/operators/multi_stage.py\n\nimport type { IndexStats } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"./base.js\";\nimport { Operator } from \"./base.js\";\n\nexport class MultiStageOperator extends Operator {\n readonly stages: [Operator, number][];\n\n constructor(stages: [Operator, number][]) {\n super();\n if (stages.length === 0) {\n throw new Error(\"MultiStageOperator requires at least one stage\");\n }\n this.stages = stages;\n }\n\n execute(context: ExecutionContext): PostingList {\n if (this.stages.length === 0) return new PostingList();\n\n let current = this.stages[0]![0].execute(context);\n current = applyCutoff(current, this.stages[0]![1]);\n\n for (let i = 1; i < this.stages.length; i++) {\n const [op, cutoff] = this.stages[i]!;\n const stageResult = op.execute(context);\n\n // Re-score surviving candidates\n const stageMap = new Map<number, number>();\n for (const e of stageResult) {\n stageMap.set(e.docId, e.payload.score);\n }\n\n const entries = current.entries.map((e) => ({\n docId: e.docId,\n payload: createPayload({\n positions: e.payload.positions as number[],\n score: stageMap.get(e.docId) ?? e.payload.score,\n fields: e.payload.fields as Record<string, unknown>,\n }),\n }));\n current = applyCutoff(new PostingList(entries), cutoff);\n }\n\n return current;\n }\n\n costEstimate(stats: IndexStats): number {\n let total = 0;\n let cardinality = stats.totalDocs;\n for (const [op, cutoff] of this.stages) {\n total += op.costEstimate(stats) * (cardinality / Math.max(stats.totalDocs, 1));\n cardinality =\n typeof cutoff === \"number\" && Number.isInteger(cutoff)\n ? Math.min(cutoff, cardinality)\n : cardinality * 0.5;\n }\n return total;\n }\n\n static applyCutoff(pl: PostingList, cutoff: number): PostingList {\n return applyCutoff(pl, cutoff);\n }\n}\n\nfunction applyCutoff(pl: PostingList, cutoff: number): PostingList {\n if (Number.isInteger(cutoff) && cutoff > 0) {\n return pl.topK(cutoff);\n }\n // Float threshold\n const entries = pl.entries.filter((e) => e.payload.score >= cutoff);\n return new PostingList(entries);\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- multi-field search operator\n// 1:1 port of uqa/operators/multi_field.py\n\nimport { logOddsConjunction } from \"bayesian-bm25\";\nimport type { DocId, IndexStats } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"./base.js\";\nimport { Operator } from \"./base.js\";\nimport { TermOperator } from \"./primitive.js\";\nimport { ScoreOperator } from \"./primitive.js\";\nimport {\n BayesianBM25Scorer,\n createBayesianBM25Params,\n} from \"../scoring/bayesian-bm25.js\";\n\nexport class MultiFieldSearchOperator extends Operator {\n readonly fields: string[];\n readonly query: string;\n readonly weights: number[];\n\n constructor(fields: string[], query: string, weights?: number[] | null) {\n super();\n this.fields = fields;\n this.query = query;\n this.weights = weights ?? fields.map(() => 1.0);\n }\n\n execute(context: ExecutionContext): PostingList {\n const idx = context.invertedIndex;\n if (!idx) return new PostingList();\n\n const stats = idx.stats;\n const signalMaps: Map<DocId, number>[] = [];\n const allDocIds = new Set<DocId>();\n\n for (const field of this.fields) {\n const termOp = new TermOperator(this.query, field);\n const scorer = new BayesianBM25Scorer(createBayesianBM25Params(), stats);\n const analyzer = idx.getSearchAnalyzer(field);\n const tokens = analyzer.analyze(this.query);\n const scoreOp = new ScoreOperator(scorer, termOp, tokens, field);\n const pl = scoreOp.execute(context);\n\n const m = new Map<DocId, number>();\n for (const entry of pl) {\n m.set(entry.docId, entry.payload.score);\n allDocIds.add(entry.docId);\n }\n signalMaps.push(m);\n }\n\n // Normalize weights\n let wSum = 0;\n for (const w of this.weights) wSum += w;\n const normWeights = this.weights.map((w) => w / wSum);\n\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n for (const docId of allDocIds) {\n const probs: number[] = [];\n for (let i = 0; i < this.fields.length; i++) {\n probs.push(signalMaps[i]!.get(docId) ?? 0.5);\n }\n const fused =\n probs.length === 1 ? probs[0]! : logOddsConjunction(probs, 0.0, normWeights);\n entries.push({ docId, payload: createPayload({ score: fused }) });\n }\n\n return new PostingList(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return stats.totalDocs * this.fields.length;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- progressive fusion operator\n// 1:1 port of uqa/operators/progressive_fusion.py\n\nimport type { DocId, IndexStats } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"./base.js\";\nimport { Operator } from \"./base.js\";\nimport { FusionWANDScorer } from \"../scoring/fusion-wand.js\";\n\nexport class ProgressiveFusionOperator extends Operator {\n readonly stages: [Operator[], number][];\n readonly alpha: number;\n readonly gating: string | null;\n\n constructor(stages: [Operator[], number][], alpha = 0.5, gating?: string | null) {\n super();\n this.stages = stages;\n this.alpha = alpha;\n this.gating = gating ?? null;\n }\n\n execute(context: ExecutionContext): PostingList {\n const accumulatedPls: PostingList[] = [];\n let candidateIds: Set<DocId> | null = null;\n let result = new PostingList();\n\n for (const [newSignals, k] of this.stages) {\n // Execute new signal operators\n const newPls = newSignals.map((s) => s.execute(context));\n\n // Filter to candidate set if available\n if (candidateIds !== null) {\n for (let i = 0; i < newPls.length; i++) {\n const filtered = newPls[i]!.entries.filter((e) => candidateIds!.has(e.docId));\n newPls[i] = PostingList.fromSorted(filtered);\n }\n }\n\n accumulatedPls.push(...newPls);\n\n // Compute upper bounds\n const upperBounds = accumulatedPls.map((pl) => {\n let max = 0;\n for (const e of pl) {\n if (e.payload.score > max) max = e.payload.score;\n }\n return Math.max(max, 0.01);\n });\n\n // Fuse with WAND\n const fwand = new FusionWANDScorer(\n accumulatedPls,\n upperBounds,\n this.alpha,\n k,\n this.gating,\n );\n result = fwand.scoreTopK();\n\n // Update candidate set for next stage\n candidateIds = new Set(result.entries.map((e) => e.docId));\n }\n\n return result;\n }\n\n costEstimate(stats: IndexStats): number {\n let total = 0;\n let cardinality = stats.totalDocs;\n for (const [signals, k] of this.stages) {\n for (const s of signals) {\n total += s.costEstimate(stats) * (cardinality / Math.max(stats.totalDocs, 1));\n }\n cardinality = Math.min(k, cardinality);\n }\n return total;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- operator backend utilities\n// 1:1 port of uqa/operators/_backend.py\n// Browser version: no PyTorch, pure TypeScript/Float64Array\n\nimport * as linalg from \"../math/linalg.js\";\n\nconst PROB_FLOOR = 1e-15;\nconst PROB_CEIL = 1.0 - 1e-15;\n\nexport function deviceName(): string {\n return \"cpu (js)\";\n}\n\nexport function safeLogit(p: number): number {\n const c = Math.max(PROB_FLOOR, Math.min(PROB_CEIL, p));\n return Math.log(c / (1.0 - c));\n}\n\nexport function sigmoidStable(x: number): number {\n if (x >= 0) return 1.0 / (1.0 + Math.exp(-x));\n const ex = Math.exp(x);\n return ex / (1.0 + ex);\n}\n\nexport function applyGating(logitVal: number, gating: string): number {\n if (gating === \"relu\") return Math.max(0, logitVal);\n if (gating === \"swish\") return logitVal * sigmoidStable(logitVal);\n return logitVal;\n}\n\nexport function sigmoidVec(x: Float64Array): Float64Array {\n const out = new Float64Array(x.length);\n for (let i = 0; i < x.length; i++) {\n out[i] = sigmoidStable(x[i]!);\n }\n return out;\n}\n\nexport function applyGatingVec(vec: Float64Array, gating: string): Float64Array {\n if (gating === \"relu\") {\n const out = new Float64Array(vec.length);\n for (let i = 0; i < vec.length; i++) {\n out[i] = Math.max(0.0, vec[i]!);\n }\n return out;\n }\n if (gating === \"swish\") {\n const out = new Float64Array(vec.length);\n for (let i = 0; i < vec.length; i++) {\n out[i] = vec[i]! * sigmoidStable(vec[i]!);\n }\n return out;\n }\n return new Float64Array(vec);\n}\n\n// -- Kernel builder --------------------------------------------------------\n\nfunction buildKernelNp(hopWeights: number[]): Float64Array {\n const total = hopWeights.reduce((a, b) => a + b, 0);\n const k = new Float64Array(9); // 3x3\n if (total <= 0) return k;\n const wS = hopWeights[0]! / total;\n const wN = (hopWeights.length > 1 ? hopWeights[1]! : 0.0) / total;\n k[4] = wS; // center\n k[1] = wN / 4; // top\n k[7] = wN / 4; // bottom\n k[3] = wN / 4; // left\n k[5] = wN / 4; // right\n return k;\n}\n\nexport function hopWeightsToKernel(hopWeights: number[]): Float64Array {\n // Convert [w_self, w_neighbor] to (1, 1, 3, 3) kernel array.\n // For the JS version we return a flat 9-element array representing the 3x3 kernel.\n // Multi-channel kernels would need (out_ch * in_ch * 3 * 3) elements.\n return buildKernelNp(hopWeights);\n}\n\n// -- Ridge regression ------------------------------------------------------\n\nexport function ridgeSolve(\n X: Float64Array,\n shapeX: linalg.Shape2D,\n Y: Float64Array,\n shapeY: linalg.Shape2D,\n lam: number,\n): { weights: Float64Array; bias: Float64Array } {\n const [n, p] = shapeX;\n const [, nClasses] = shapeY;\n\n // W = (X^T X + lam I)^{-1} X^T Y via normal equations\n const Xt = linalg.transpose(X, n, p);\n const XtX = linalg.matmul(Xt, [p, n], X, [n, p]);\n\n // Add lambda * I\n for (let i = 0; i < p; i++) {\n XtX.data[i * p + i]! += lam;\n }\n\n const XtY = linalg.matmul(Xt, [p, n], Y, [n, nClasses]);\n\n // Solve via iterative refinement (Gauss-Seidel)\n const W = new Float64Array(p * nClasses);\n\n // Use gradient descent to solve (XtX)W = XtY\n const lr = 0.01;\n for (let iter = 0; iter < 100; iter++) {\n const residual = linalg.matmul(XtX.data, [p, p], W, [p, nClasses]);\n for (let i = 0; i < p * nClasses; i++) {\n W[i]! -= lr * (residual.data[i]! - XtY.data[i]!);\n }\n }\n\n // Bias = meanY - W^T meanX\n const meanX = new Float64Array(p);\n const meanY = new Float64Array(nClasses);\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < p; j++) meanX[j]! += X[i * p + j]! / n;\n for (let j = 0; j < nClasses; j++) meanY[j]! += Y[i * nClasses + j]! / n;\n }\n\n const bias = new Float64Array(nClasses);\n for (let j = 0; j < nClasses; j++) {\n bias[j] = meanY[j]!;\n for (let i = 0; i < p; i++) {\n bias[j]! -= W[i * nClasses + j]! * meanX[i]!;\n }\n }\n\n return { weights: W, bias };\n}\n\n// -- Elastic net solve -----------------------------------------------------\n\nexport function elasticNetSolve(\n X: Float64Array,\n shapeX: linalg.Shape2D,\n Y: Float64Array,\n shapeY: linalg.Shape2D,\n lam: number,\n l1Ratio: number,\n maxIter = 200,\n tol = 1e-4,\n): { weights: Float64Array; bias: Float64Array } {\n const l2Pen = lam * (1.0 - l1Ratio);\n const l1Pen = lam * l1Ratio;\n\n const [n, p] = shapeX;\n const [, nClasses] = shapeY;\n\n // Warm start from ridge\n const { weights: W, bias } = ridgeSolve(X, shapeX, Y, shapeY, l2Pen);\n\n // Compute XtX / n\n const Xt = linalg.transpose(X, n, p);\n const XtXn = linalg.matmul(Xt, [p, n], X, [n, p]);\n for (let i = 0; i < p * p; i++) XtXn.data[i]! /= n;\n\n // Lipschitz constant\n let lip = 0;\n for (let i = 0; i < p * p; i++) lip += XtXn.data[i]! * XtXn.data[i]!;\n lip = Math.sqrt(lip) + l2Pen;\n const step = 1.0 / lip;\n const threshold = (l1Pen * step) / n;\n\n for (let iter = 0; iter < maxIter; iter++) {\n const WOld = new Float64Array(W);\n\n // residual = Y - X @ W^T - bias\n // grad = -(X^T @ residual / n)^T + l2Pen * W\n // W = W - step * grad, then soft threshold\n const residual = new Float64Array(n * nClasses);\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < nClasses; j++) {\n let pred = bias[j]!;\n for (let k = 0; k < p; k++) {\n pred += X[i * p + k]! * W[j * p + k]!;\n }\n residual[i * nClasses + j] = Y[i * nClasses + j]! - pred;\n }\n }\n\n // grad = -(Xt @ residual / n)^T + l2Pen * W\n const XtRes = linalg.matmul(Xt, [p, n], residual, [n, nClasses]);\n for (let j = 0; j < nClasses; j++) {\n for (let k = 0; k < p; k++) {\n const grad = -(XtRes.data[k * nClasses + j]! / n) + l2Pen * W[j * p + k]!;\n let val = W[j * p + k]! - step * grad;\n // Soft threshold (proximal L1)\n val = Math.sign(val) * Math.max(Math.abs(val) - threshold, 0);\n W[j * p + k] = val;\n }\n }\n\n // Update bias\n for (let j = 0; j < nClasses; j++) {\n let total = 0;\n for (let i = 0; i < n; i++) {\n let pred = 0;\n for (let k = 0; k < p; k++) {\n pred += X[i * p + k]! * W[j * p + k]!;\n }\n total += Y[i * nClasses + j]! - pred;\n }\n bias[j] = total / n;\n }\n\n // Check convergence\n let maxDiff = 0;\n for (let i = 0; i < W.length; i++) {\n maxDiff = Math.max(maxDiff, Math.abs(W[i]! - WOld[i]!));\n }\n if (maxDiff < tol) break;\n }\n\n return { weights: W, bias };\n}\n\n// -- Magnitude pruning -------------------------------------------------------\n\nexport function magnitudePrune(W: Float64Array, pruneRatio: number): Float64Array {\n if (pruneRatio <= 0) return new Float64Array(W);\n const absVals = Array.from(W, (v) => Math.abs(v));\n const sorted = absVals.slice().sort((a, b) => a - b);\n const cutoffIdx = Math.floor(pruneRatio * sorted.length);\n const cutoff = sorted[cutoffIdx] ?? 0;\n const out = new Float64Array(W.length);\n for (let i = 0; i < W.length; i++) {\n out[i] = Math.abs(W[i]!) < cutoff ? 0 : W[i]!;\n }\n return out;\n}\n\n// -- WAND predict ------------------------------------------------------------\n\nexport function wandPredict(\n W: Float64Array,\n shapeW: linalg.Shape2D,\n bias: Float64Array,\n x: Float64Array,\n): Float64Array {\n const [nClasses, nFeatures] = shapeW;\n const logits = new Float64Array(bias);\n\n for (let c = 0; c < nClasses; c++) {\n for (let f = 0; f < nFeatures; f++) {\n const w = W[c * nFeatures + f]!;\n if (w !== 0) {\n logits[c]! += w * x[f]!;\n }\n }\n }\n\n return logits;\n}\n\n// -- Grid forward pass -------------------------------------------------------\n\nexport function gridForward(\n embeddings: Float64Array,\n shapeE: linalg.Shape2D,\n gridH: number,\n gridW: number,\n stages: {\n kernel: Float64Array;\n kernelShape: number[];\n poolSize: number;\n poolMethod: string;\n }[],\n gating = \"none\",\n): { data: Float64Array; shape: linalg.Shape2D } {\n const [batch] = shapeE;\n let inCh = Math.floor(shapeE[1] / (gridH * gridW));\n if (inCh < 1) inCh = 1;\n let h = gridH;\n let w = gridW;\n\n // current: (batch, inCh, h, w) stored flat\n let current = new Float64Array(embeddings);\n\n for (const stage of stages) {\n const ks = stage.kernelShape;\n // kernel: (outCh, inCurCh, kH, kW) flattened\n let outCh: number;\n let inCurCh: number;\n if (ks.length === 4) {\n outCh = ks[0]!;\n inCurCh = ks[1]!;\n } else {\n // Simple 3x3 kernel\n outCh = inCh;\n inCurCh = inCh;\n }\n\n const kH = ks.length === 4 ? ks[2]! : 3;\n const kW = ks.length === 4 ? ks[3]! : 3;\n const padH = Math.floor(kH / 2);\n const padW = Math.floor(kW / 2);\n\n // Convolution: output (batch, outCh, h, w)\n const convOut = new Float64Array(batch * outCh * h * w);\n for (let b = 0; b < batch; b++) {\n for (let oc = 0; oc < outCh; oc++) {\n for (let i = 0; i < h; i++) {\n for (let j = 0; j < w; j++) {\n let val = 0;\n for (let ic = 0; ic < inCurCh; ic++) {\n for (let ki = 0; ki < kH; ki++) {\n for (let kj = 0; kj < kW; kj++) {\n const ni = i + ki - padH;\n const nj = j + kj - padW;\n if (ni >= 0 && ni < h && nj >= 0 && nj < w) {\n const srcIdx = b * inCurCh * h * w + ic * h * w + ni * w + nj;\n const kIdx = oc * inCurCh * kH * kW + ic * kH * kW + ki * kW + kj;\n const coeff = stage.kernel[kIdx] ?? 0;\n if (coeff !== 0) {\n val += (current[srcIdx] ?? 0) * coeff;\n }\n }\n }\n }\n }\n const dstIdx = b * outCh * h * w + oc * h * w + i * w + j;\n convOut[dstIdx] = applyGating(val, gating);\n }\n }\n }\n }\n current = convOut;\n inCh = outCh;\n\n // Apply pooling\n if (stage.poolSize > 1) {\n const newH = Math.floor(h / stage.poolSize);\n const newW = Math.floor(w / stage.poolSize);\n const pooled = new Float64Array(batch * outCh * newH * newW);\n for (let b = 0; b < batch; b++) {\n for (let c = 0; c < outCh; c++) {\n for (let pi = 0; pi < newH; pi++) {\n for (let pj = 0; pj < newW; pj++) {\n let poolVal = stage.poolMethod === \"max\" ? -Infinity : 0;\n let count = 0;\n for (let ki = 0; ki < stage.poolSize; ki++) {\n for (let kj = 0; kj < stage.poolSize; kj++) {\n const si = pi * stage.poolSize + ki;\n const sj = pj * stage.poolSize + kj;\n if (si < h && sj < w) {\n const idx = b * outCh * h * w + c * h * w + si * w + sj;\n const v = current[idx] ?? 0;\n if (stage.poolMethod === \"max\") {\n poolVal = Math.max(poolVal, v);\n } else {\n poolVal += v;\n }\n count++;\n }\n }\n }\n if (stage.poolMethod === \"avg\" && count > 0) poolVal /= count;\n const dstIdx = b * outCh * newH * newW + c * newH * newW + pi * newW + pj;\n pooled[dstIdx] = poolVal;\n }\n }\n }\n }\n current = pooled;\n h = newH;\n w = newW;\n }\n }\n\n const outFeatures = inCh * h * w;\n return { data: current, shape: [batch, outFeatures] };\n}\n\n// -- Batch dense / softmax / batchnorm ------------------------------------\n\nexport function batchDense(\n X: Float64Array,\n shapeX: linalg.Shape2D,\n weights: Float64Array,\n shapeW: linalg.Shape2D,\n bias: Float64Array,\n gating = \"none\",\n): { data: Float64Array; shape: linalg.Shape2D } {\n // out = X @ W^T + bias with gating\n const [n] = shapeX;\n const [nOut] = shapeW;\n const Wt = linalg.transpose(weights, shapeW[0], shapeW[1]);\n const result = linalg.matmul(X, shapeX, Wt, [shapeW[1], shapeW[0]]);\n\n // Add bias and apply gating\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < nOut; j++) {\n const idx = i * nOut + j;\n result.data[idx] = applyGating(result.data[idx]! + bias[j]!, gating);\n }\n }\n\n return { data: result.data, shape: [n, nOut] };\n}\n\nexport function batchSoftmax(X: Float64Array, shape: linalg.Shape2D): Float64Array {\n const [n, c] = shape;\n const out = new Float64Array(X.length);\n for (let i = 0; i < n; i++) {\n const row = X.subarray(i * c, (i + 1) * c);\n const sm = linalg.softmax(row);\n out.set(sm, i * c);\n }\n return out;\n}\n\nexport function batchBatchnorm(\n X: Float64Array,\n shape: linalg.Shape2D,\n epsilon = 1e-5,\n): Float64Array {\n const [n, c] = shape;\n if (n < 2) return new Float64Array(X);\n\n const means = new Float64Array(c);\n const vars = new Float64Array(c);\n\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < c; j++) {\n means[j]! += X[i * c + j]! / n;\n }\n }\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < c; j++) {\n const diff = X[i * c + j]! - means[j]!;\n vars[j]! += (diff * diff) / n;\n }\n }\n\n const out = new Float64Array(X.length);\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < c; j++) {\n out[i * c + j] = (X[i * c + j]! - means[j]!) / Math.sqrt(vars[j]! + epsilon);\n }\n }\n return out;\n}\n\n// -- Self-attention (Theorem 8.3, Paper 4) --------------------------------\n\nexport function generateQkProjections(\n dModel: number,\n seed = 42,\n): { wQ: Float64Array; wK: Float64Array } {\n // Generate random Q, K projection matrices (Kaiming init).\n // Returns (wQ, wK) each of shape (dModel, dModel).\n const std = Math.sqrt(2.0 / dModel);\n const wQ = new Float64Array(dModel * dModel);\n const wK = new Float64Array(dModel * dModel);\n\n // Simple seeded PRNG (xorshift32)\n let s = seed;\n function nextRand(): number {\n s ^= s << 13;\n s ^= s >> 17;\n s ^= s << 5;\n // Box-Muller approximation for normal distribution\n const u1 = (s >>> 0) / 0xffffffff;\n s ^= s << 13;\n s ^= s >> 17;\n s ^= s << 5;\n const u2 = (s >>> 0) / 0xffffffff;\n return Math.sqrt(-2 * Math.log(Math.max(1e-10, u1))) * Math.cos(2 * Math.PI * u2);\n }\n\n for (let i = 0; i < dModel * dModel; i++) {\n wQ[i] = nextRand() * std;\n }\n for (let i = 0; i < dModel * dModel; i++) {\n wK[i] = nextRand() * std;\n }\n\n return { wQ, wK };\n}\n\nexport function batchSelfAttention(\n X: Float64Array,\n shapeX: readonly [number, number, number], // (batch, seqLen, dModel)\n nHeads = 1,\n wQ: Float64Array | null = null,\n wK: Float64Array | null = null,\n wV: Float64Array | null = null,\n gating = \"none\",\n): Float64Array {\n const [nTotal, seqLen, dModel] = shapeX;\n\n let effectiveHeads = nHeads;\n if (dModel % effectiveHeads !== 0) effectiveHeads = 1;\n const dHead = Math.floor(dModel / effectiveHeads);\n\n // Q = X @ W_q or X, K = X @ W_k or X, V = X @ W_v or X\n const Q =\n wQ !== null\n ? matmul3d(X, nTotal, seqLen, dModel, wQ, dModel, dModel)\n : new Float64Array(X);\n const K =\n wK !== null\n ? matmul3d(X, nTotal, seqLen, dModel, wK, dModel, dModel)\n : new Float64Array(X);\n const V =\n wV !== null\n ? matmul3d(X, nTotal, seqLen, dModel, wV, dModel, dModel)\n : new Float64Array(X);\n\n // Reshape to (nTotal, nHeads, seqLen, dHead) and compute attention\n const scale = 1.0 / Math.sqrt(dHead);\n const out = new Float64Array(nTotal * seqLen * dModel);\n\n for (let b = 0; b < nTotal; b++) {\n for (let h = 0; h < effectiveHeads; h++) {\n // Compute attention scores for this head\n const scores = new Float64Array(seqLen * seqLen);\n for (let i = 0; i < seqLen; i++) {\n for (let j = 0; j < seqLen; j++) {\n let dot = 0;\n for (let d = 0; d < dHead; d++) {\n const qIdx = b * seqLen * dModel + i * dModel + h * dHead + d;\n const kIdx = b * seqLen * dModel + j * dModel + h * dHead + d;\n dot += Q[qIdx]! * K[kIdx]!;\n }\n scores[i * seqLen + j] = dot * scale;\n }\n }\n\n // Softmax per row\n for (let i = 0; i < seqLen; i++) {\n let maxVal = -Infinity;\n for (let j = 0; j < seqLen; j++) {\n maxVal = Math.max(maxVal, scores[i * seqLen + j]!);\n }\n let sumExp = 0;\n for (let j = 0; j < seqLen; j++) {\n scores[i * seqLen + j] = Math.exp(scores[i * seqLen + j]! - maxVal);\n sumExp += scores[i * seqLen + j]!;\n }\n for (let j = 0; j < seqLen; j++) {\n scores[i * seqLen + j]! /= sumExp;\n }\n }\n\n // Apply attention: out = scores @ V\n for (let i = 0; i < seqLen; i++) {\n for (let d = 0; d < dHead; d++) {\n let val = 0;\n for (let j = 0; j < seqLen; j++) {\n const vIdx = b * seqLen * dModel + j * dModel + h * dHead + d;\n val += scores[i * seqLen + j]! * V[vIdx]!;\n }\n const outIdx = b * seqLen * dModel + i * dModel + h * dHead + d;\n out[outIdx] = val;\n }\n }\n }\n }\n\n // Apply gating\n if (gating === \"relu\") {\n for (let i = 0; i < out.length; i++) {\n out[i] = Math.max(0.0, out[i]!);\n }\n } else if (gating === \"swish\") {\n for (let i = 0; i < out.length; i++) {\n out[i] = out[i]! * sigmoidStable(out[i]!);\n }\n }\n\n return out;\n}\n\n// -- Global pooling --------------------------------------------------------\n\nexport function gridGlobalPool(\n features: Float64Array,\n shape: linalg.Shape2D,\n gridH: number,\n gridW: number,\n method = \"avg\",\n): { data: Float64Array; shape: linalg.Shape2D } {\n const [batch, totalFeatures] = shape;\n let channels = Math.floor(totalFeatures / (gridH * gridW));\n if (channels < 1) channels = 1;\n\n const outChannels = method === \"avg_max\" ? channels * 2 : channels;\n const out = new Float64Array(batch * outChannels);\n\n for (let b = 0; b < batch; b++) {\n for (let c = 0; c < channels; c++) {\n let sumVal = 0;\n let maxVal = -Infinity;\n for (let i = 0; i < gridH * gridW; i++) {\n const v = features[b * totalFeatures + c * gridH * gridW + i] ?? 0;\n sumVal += v;\n maxVal = Math.max(maxVal, v);\n }\n const avgVal = sumVal / (gridH * gridW);\n\n if (method === \"avg\") {\n out[b * outChannels + c] = avgVal;\n } else if (method === \"max\") {\n out[b * outChannels + c] = maxVal;\n } else {\n // avg_max\n out[b * outChannels + c] = avgVal;\n out[b * outChannels + channels + c] = maxVal;\n }\n }\n }\n\n return { data: out, shape: [batch, outChannels] };\n}\n\n// -- Kernel initialization -------------------------------------------------\n\nexport function generateOrthogonalKernels(\n nChannels: number,\n inChannels: number,\n seed = 42,\n): Float64Array {\n // Orthogonal conv kernels via QR decomposition (Saxe et al. 2014).\n // Returns (nChannels * inChannels * 3 * 3) float64 array.\n const fanIn = inChannels * 9;\n const rows = Math.max(nChannels, fanIn);\n const cols = Math.max(nChannels, fanIn);\n\n // Generate random matrix\n let s = seed;\n function nextRand(): number {\n s ^= s << 13;\n s ^= s >> 17;\n s ^= s << 5;\n const u1 = (s >>> 0) / 0xffffffff;\n s ^= s << 13;\n s ^= s >> 17;\n s ^= s << 5;\n const u2 = (s >>> 0) / 0xffffffff;\n return Math.sqrt(-2 * Math.log(Math.max(1e-10, u1))) * Math.cos(2 * Math.PI * u2);\n }\n\n // Simple QR via Gram-Schmidt (sufficient for kernel init)\n const flat = new Float64Array(rows * cols);\n for (let i = 0; i < rows * cols; i++) flat[i] = nextRand();\n\n // Gram-Schmidt orthogonalization (on rows)\n const Q = new Float64Array(rows * cols);\n for (let i = 0; i < Math.min(rows, cols); i++) {\n // Copy row i\n for (let j = 0; j < cols; j++) Q[i * cols + j] = flat[i * cols + j]!;\n // Subtract projections\n for (let k = 0; k < i; k++) {\n let dot = 0;\n let normK = 0;\n for (let j = 0; j < cols; j++) {\n dot += Q[i * cols + j]! * Q[k * cols + j]!;\n normK += Q[k * cols + j]! * Q[k * cols + j]!;\n }\n if (normK > 1e-12) {\n const scale = dot / normK;\n for (let j = 0; j < cols; j++) {\n Q[i * cols + j]! -= scale * Q[k * cols + j]!;\n }\n }\n }\n // Normalize\n let norm = 0;\n for (let j = 0; j < cols; j++) norm += Q[i * cols + j]! * Q[i * cols + j]!;\n norm = Math.sqrt(norm);\n if (norm > 1e-12) {\n for (let j = 0; j < cols; j++) Q[i * cols + j]! /= norm;\n }\n }\n\n // Take first nChannels rows, first fanIn columns\n const kernels = new Float64Array(nChannels * inChannels * 9);\n const gain = Math.sqrt(2.0 / fanIn) * Math.sqrt(fanIn);\n for (let c = 0; c < nChannels; c++) {\n for (let f = 0; f < fanIn && f < cols; f++) {\n kernels[c * fanIn + f] = Q[c * cols + f]! * gain;\n }\n }\n\n return kernels;\n}\n\nexport function generateGaborKernels(\n nChannels: number,\n inChannels: number,\n seed = 42,\n): Float64Array {\n // Gabor filter bank with varied orientations, frequencies, and phases.\n // Returns (nChannels * inChannels * 3 * 3) float64 array.\n const ks = 3;\n const half = Math.floor(ks / 2);\n const nOrientations = 8;\n const frequencies = [0.5, 1.0, 1.5];\n const phases = [0.0, Math.PI / 2];\n const sigma = 1.0;\n const gamma = 0.5;\n\n const gaborFilters: Float64Array[] = [];\n for (let thetaIdx = 0; thetaIdx < nOrientations; thetaIdx++) {\n const theta = (thetaIdx * Math.PI) / nOrientations;\n const cosT = Math.cos(theta);\n const sinT = Math.sin(theta);\n for (const freq of frequencies) {\n for (const phase of phases) {\n const g = new Float64Array(9);\n for (let yi = 0; yi < ks; yi++) {\n for (let xi = 0; xi < ks; xi++) {\n const x = xi - half;\n const y = yi - half;\n const xRot = x * cosT + y * sinT;\n const yRot = -x * sinT + y * cosT;\n const envelope = Math.exp(\n -(xRot * xRot + gamma * gamma * yRot * yRot) / (2 * sigma * sigma),\n );\n const sinusoid = Math.cos(2 * Math.PI * freq * xRot + phase);\n g[yi * ks + xi] = envelope * sinusoid;\n }\n }\n // Normalize to zero mean, unit norm\n let mean = 0;\n for (let i = 0; i < 9; i++) mean += g[i]! / 9;\n for (let i = 0; i < 9; i++) g[i]! -= mean;\n let norm = 0;\n for (let i = 0; i < 9; i++) norm += g[i]! * g[i]!;\n norm = Math.sqrt(norm);\n if (norm > 1e-6) {\n for (let i = 0; i < 9; i++) g[i]! /= norm;\n }\n gaborFilters.push(g);\n }\n }\n }\n\n const kernels = new Float64Array(nChannels * inChannels * 9);\n const nGabor = gaborFilters.length;\n\n let s = seed;\n function nextRand(): number {\n s ^= s << 13;\n s ^= s >> 17;\n s ^= s << 5;\n const u1 = (s >>> 0) / 0xffffffff;\n s ^= s << 13;\n s ^= s >> 17;\n s ^= s << 5;\n const u2 = (s >>> 0) / 0xffffffff;\n return Math.sqrt(-2 * Math.log(Math.max(1e-10, u1))) * Math.cos(2 * Math.PI * u2);\n }\n\n for (let c = 0; c < nChannels; c++) {\n if (c < nGabor) {\n for (let ic = 0; ic < inChannels; ic++) {\n const filter = gaborFilters[c]!;\n for (let k = 0; k < 9; k++) {\n kernels[c * inChannels * 9 + ic * 9 + k] = filter[k]!;\n }\n }\n } else {\n // Fill remaining with random Kaiming\n const fanIn = inChannels * 9;\n const std = Math.sqrt(2.0 / fanIn);\n for (let ic = 0; ic < inChannels; ic++) {\n for (let k = 0; k < 9; k++) {\n kernels[c * inChannels * 9 + ic * 9 + k] = nextRand() * std;\n }\n }\n }\n }\n\n return kernels;\n}\n\nexport function generateKmeansKernels(\n nChannels: number,\n inChannels: number,\n trainingData: Float64Array,\n shapeData: linalg.Shape2D,\n gridH: number,\n gridW: number,\n seed = 42,\n nPatches = 10000,\n maxIter = 50,\n): Float64Array {\n // Data-dependent conv kernels via k-means on image patches.\n // Returns (nChannels * inChannels * 3 * 3) float64 array.\n const nSamples = shapeData[0];\n const ks = 3;\n const half = Math.floor(ks / 2);\n const patchDim = inChannels * ks * ks;\n\n let s = seed;\n function nextInt(max: number): number {\n s ^= s << 13;\n s ^= s >> 17;\n s ^= s << 5;\n return (s >>> 0) % max;\n }\n\n // Extract random patches\n const patches = new Float64Array(nPatches * patchDim);\n for (let i = 0; i < nPatches; i++) {\n const imgIdx = nextInt(nSamples);\n const row = half + nextInt(gridH - ks + 1);\n const col = half + nextInt(gridW - ks + 1);\n for (let ic = 0; ic < inChannels; ic++) {\n for (let ki = 0; ki < ks; ki++) {\n for (let kj = 0; kj < ks; kj++) {\n const srcIdx =\n imgIdx * inChannels * gridH * gridW +\n ic * gridH * gridW +\n (row - half + ki) * gridW +\n (col - half + kj);\n patches[i * patchDim + ic * ks * ks + ki * ks + kj] =\n trainingData[srcIdx] ?? 0;\n }\n }\n }\n }\n\n // Normalize patches: zero mean, unit norm\n for (let i = 0; i < nPatches; i++) {\n let mean = 0;\n for (let j = 0; j < patchDim; j++) mean += patches[i * patchDim + j]! / patchDim;\n for (let j = 0; j < patchDim; j++) patches[i * patchDim + j]! -= mean;\n let norm = 0;\n for (let j = 0; j < patchDim; j++)\n norm += patches[i * patchDim + j]! * patches[i * patchDim + j]!;\n norm = Math.sqrt(norm);\n if (norm < 1e-6) norm = 1.0;\n for (let j = 0; j < patchDim; j++) patches[i * patchDim + j]! /= norm;\n }\n\n // K-means++ initialization\n const centroids = new Float64Array(nChannels * patchDim);\n const firstIdx = nextInt(nPatches);\n for (let j = 0; j < patchDim; j++) {\n centroids[j] = patches[firstIdx * patchDim + j]!;\n }\n\n for (let c = 1; c < nChannels; c++) {\n const dists = new Float64Array(nPatches);\n let totalDist = 0;\n for (let i = 0; i < nPatches; i++) {\n let minDist = Infinity;\n for (let cc = 0; cc < c; cc++) {\n let dist = 0;\n for (let j = 0; j < patchDim; j++) {\n const diff = patches[i * patchDim + j]! - centroids[cc * patchDim + j]!;\n dist += diff * diff;\n }\n minDist = Math.min(minDist, dist);\n }\n dists[i] = minDist;\n totalDist += minDist;\n }\n // Choose next centroid proportional to distance\n let target = (nextInt(1000000) / 1000000) * totalDist;\n let chosen = 0;\n for (let i = 0; i < nPatches; i++) {\n target -= dists[i]!;\n if (target <= 0) {\n chosen = i;\n break;\n }\n }\n for (let j = 0; j < patchDim; j++) {\n centroids[c * patchDim + j] = patches[chosen * patchDim + j]!;\n }\n }\n\n // Lloyd's algorithm\n const labels = new Int32Array(nPatches);\n for (let iter = 0; iter < maxIter; iter++) {\n // Assign patches to nearest centroid\n for (let i = 0; i < nPatches; i++) {\n let bestDist = Infinity;\n let bestC = 0;\n for (let c = 0; c < nChannels; c++) {\n let dist = 0;\n for (let j = 0; j < patchDim; j++) {\n const diff = patches[i * patchDim + j]! - centroids[c * patchDim + j]!;\n dist += diff * diff;\n }\n if (dist < bestDist) {\n bestDist = dist;\n bestC = c;\n }\n }\n labels[i] = bestC;\n }\n\n // Update centroids\n const newCentroids = new Float64Array(nChannels * patchDim);\n const counts = new Int32Array(nChannels);\n for (let i = 0; i < nPatches; i++) {\n const c = labels[i]!;\n counts[c]!++;\n for (let j = 0; j < patchDim; j++) {\n newCentroids[c * patchDim + j]! += patches[i * patchDim + j]!;\n }\n }\n for (let c = 0; c < nChannels; c++) {\n if (counts[c]! > 0) {\n for (let j = 0; j < patchDim; j++) {\n newCentroids[c * patchDim + j]! /= counts[c]!;\n }\n } else {\n for (let j = 0; j < patchDim; j++) {\n newCentroids[c * patchDim + j] = centroids[c * patchDim + j]!;\n }\n }\n }\n\n // Check convergence\n let maxDiff = 0;\n for (let i = 0; i < nChannels * patchDim; i++) {\n maxDiff = Math.max(maxDiff, Math.abs(newCentroids[i]! - centroids[i]!));\n }\n for (let i = 0; i < nChannels * patchDim; i++) {\n centroids[i] = newCentroids[i]!;\n }\n if (maxDiff < 1e-6) break;\n }\n\n return centroids;\n}\n\n// -- V projection search ---------------------------------------------------\n\nexport function searchVProjection(\n X: Float64Array,\n shapeX: readonly [number, number, number], // (nTotal, seqLen, dModel)\n nHeads: number,\n wQ: Float64Array | null,\n wK: Float64Array | null,\n Y: Float64Array,\n shapeY: linalg.Shape2D,\n lam: number,\n gating = \"none\",\n nCandidates = 20,\n seed = 42,\n): { bestWV: Float64Array; bestOutFlat: Float64Array } {\n const [nTotal, seqLen, dModel] = shapeX;\n let effectiveHeads = nHeads;\n if (dModel % effectiveHeads !== 0) effectiveHeads = 1;\n const nFlat = dModel * seqLen;\n\n // Generate candidate V projections\n let s = seed + 1000;\n function nextRand(): number {\n s ^= s << 13;\n s ^= s >> 17;\n s ^= s << 5;\n const u1 = (s >>> 0) / 0xffffffff;\n s ^= s << 13;\n s ^= s >> 17;\n s ^= s << 5;\n const u2 = (s >>> 0) / 0xffffffff;\n return Math.sqrt(-2 * Math.log(Math.max(1e-10, u1))) * Math.cos(2 * Math.PI * u2);\n }\n\n // Identity matrix as first candidate\n const candidates: Float64Array[] = [];\n const eye = new Float64Array(dModel * dModel);\n for (let i = 0; i < dModel; i++) eye[i * dModel + i] = 1.0;\n candidates.push(eye);\n\n // Random orthogonal candidates\n for (let c = 1; c < nCandidates; c++) {\n const M = new Float64Array(dModel * dModel);\n for (let i = 0; i < dModel * dModel; i++) M[i] = nextRand();\n candidates.push(M);\n }\n\n let bestAcc = -1.0;\n let bestWV = candidates[0]!;\n let bestOutFlat = new Float64Array(nTotal * nFlat);\n\n for (const wVCand of candidates) {\n // Forward pass with this V projection\n const outFlat = batchSelfAttention(\n X,\n shapeX,\n effectiveHeads,\n wQ,\n wK,\n wVCand,\n gating,\n );\n\n // Flatten to (nTotal, nFlat)\n // Ridge regression\n const { weights: Wt, bias: bt } = ridgeSolve(\n outFlat,\n [nTotal, nFlat],\n Y,\n shapeY,\n lam,\n );\n\n // Compute accuracy\n let correct = 0;\n const nClasses = shapeY[1];\n for (let i = 0; i < nTotal; i++) {\n let bestClass = 0;\n let bestScore = -Infinity;\n for (let j = 0; j < nClasses; j++) {\n let score = bt[j]!;\n for (let k = 0; k < nFlat; k++) {\n score += outFlat[i * nFlat + k]! * Wt[k * nClasses + j]!;\n }\n if (score > bestScore) {\n bestScore = score;\n bestClass = j;\n }\n }\n // Find true class\n let trueClass = 0;\n let trueMax = -Infinity;\n for (let j = 0; j < nClasses; j++) {\n if (Y[i * nClasses + j]! > trueMax) {\n trueMax = Y[i * nClasses + j]!;\n trueClass = j;\n }\n }\n if (bestClass === trueClass) correct++;\n }\n\n const acc = correct / nTotal;\n if (acc > bestAcc) {\n bestAcc = acc;\n bestWV = wVCand;\n bestOutFlat = new Float64Array(outFlat);\n }\n }\n\n return { bestWV, bestOutFlat };\n}\n\n// -- Helper for 3D matrix multiplication -----------------------------------\n\nfunction matmul3d(\n X: Float64Array,\n batch: number,\n seqLen: number,\n dIn: number,\n W: Float64Array,\n _wRows: number,\n wCols: number,\n): Float64Array {\n // X: (batch, seqLen, dIn), W: (dIn, wCols)\n // Out: (batch, seqLen, wCols)\n const out = new Float64Array(batch * seqLen * wCols);\n for (let b = 0; b < batch; b++) {\n for (let i = 0; i < seqLen; i++) {\n for (let j = 0; j < wCols; j++) {\n let val = 0;\n for (let k = 0; k < dIn; k++) {\n val += X[b * seqLen * dIn + i * dIn + k]! * W[k * wCols + j]!;\n }\n out[b * seqLen * wCols + i * wCols + j] = val;\n }\n }\n }\n return out;\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- deep fusion operator\n// 1:1 port of uqa/operators/deep_fusion.py\n// Multi-layer fusion operator (Paper 4, Section 7)\n\nimport { logOddsConjunction } from \"bayesian-bm25\";\nimport type { DocId, IndexStats } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"./base.js\";\nimport { Operator } from \"./base.js\";\nimport { coverageBasedDefault } from \"./hybrid.js\";\nimport {\n applyGating as backendApplyGating,\n batchDense,\n batchSoftmax,\n batchBatchnorm,\n batchSelfAttention,\n gridForward as backendGridForward,\n gridGlobalPool as backendGridGlobalPool,\n hopWeightsToKernel,\n sigmoidStable,\n sigmoidVec,\n} from \"./backend.js\";\n\n// -- Constants ---------------------------------------------------------------\n\nconst PROB_FLOOR = 1e-15;\nconst PROB_CEIL = 1.0 - 1e-15;\n\n// -- Layer definitions -------------------------------------------------------\n\nexport interface SignalLayer {\n readonly type: \"signal\";\n readonly signals: Operator[];\n}\n\nexport interface PropagateLayer {\n readonly type: \"propagate\";\n readonly edgeLabel: string;\n readonly aggregation: string;\n readonly direction: string;\n}\n\nexport interface ConvLayer {\n readonly type: \"conv\";\n readonly edgeLabel: string;\n readonly hopWeights: readonly number[];\n readonly direction: string;\n readonly kernel?: readonly number[] | null;\n readonly kernelShape?: readonly number[] | null;\n}\n\nexport interface PoolLayer {\n readonly type: \"pool\";\n readonly edgeLabel: string;\n readonly poolSize: number;\n readonly method: string;\n readonly direction: string;\n}\n\nexport interface DenseLayer {\n readonly type: \"dense\";\n readonly weights: readonly number[];\n readonly bias: readonly number[];\n readonly outputChannels: number;\n readonly inputChannels: number;\n}\n\nexport interface FlattenLayer {\n readonly type: \"flatten\";\n}\n\nexport interface SoftmaxLayer {\n readonly type: \"softmax\";\n}\n\nexport interface BatchNormLayer {\n readonly type: \"batchnorm\";\n readonly epsilon?: number;\n}\n\nexport interface DropoutLayer {\n readonly type: \"dropout\";\n readonly p: number;\n}\n\nexport interface GlobalPoolLayer {\n readonly type: \"global_pool\";\n readonly method: string;\n}\n\nexport interface AttentionLayer {\n readonly type: \"attention\";\n readonly nHeads: number;\n readonly mode: string;\n readonly qWeights?: readonly number[] | null;\n readonly qShape?: readonly number[] | null;\n readonly kWeights?: readonly number[] | null;\n readonly kShape?: readonly number[] | null;\n readonly vWeights?: readonly number[] | null;\n readonly vShape?: readonly number[] | null;\n}\n\nexport interface EmbedLayer {\n readonly type: \"embed\";\n readonly embedding?: readonly number[];\n readonly vectorField?: string;\n readonly gridH: number;\n readonly gridW: number;\n readonly inChannels?: number;\n}\n\nexport type FusionLayer =\n | SignalLayer\n | PropagateLayer\n | ConvLayer\n | PoolLayer\n | DenseLayer\n | FlattenLayer\n | SoftmaxLayer\n | BatchNormLayer\n | DropoutLayer\n | GlobalPoolLayer\n | AttentionLayer\n | EmbedLayer;\n\n// -- Utility -----------------------------------------------------------------\n\nexport function safeLogit(p: number): number {\n const c = Math.max(PROB_FLOOR, Math.min(PROB_CEIL, p));\n return Math.log(c / (1 - c));\n}\n\nexport function sigmoidVal(x: number): number {\n return sigmoidStable(x);\n}\n\nexport function applyGating(logitVal: number, gating: string): number {\n return backendApplyGating(logitVal, gating);\n}\n\nconst SPATIAL_TYPES = new Set([\"propagate\", \"conv\", \"pool\"]);\n\n// -- Graph neighbor helper ---------------------------------------------------\n\nfunction graphNeighbors(\n gs: unknown,\n vid: number,\n edgeLabel: string,\n direction: string,\n graphName: string,\n): number[] {\n const store = gs as {\n neighbors: (\n vid: number,\n graph: string,\n label?: string | null,\n dir?: \"out\" | \"in\",\n ) => number[];\n };\n const result: number[] = [];\n if (direction === \"out\" || direction === \"both\") {\n result.push(...store.neighbors(vid, graphName, edgeLabel || null, \"out\"));\n }\n if (direction === \"in\" || direction === \"both\") {\n result.push(...store.neighbors(vid, graphName, edgeLabel || null, \"in\"));\n }\n return result;\n}\n\n// -- DeepFusionOperator ------------------------------------------------------\n\nexport class DeepFusionOperator extends Operator {\n readonly layers: FusionLayer[];\n readonly alpha: number;\n readonly gating: string;\n readonly graphName: string;\n readonly embedMode: boolean;\n private readonly _gridShape: [number, number] | null;\n\n constructor(layers: FusionLayer[], alpha = 0.5, gating = \"none\", graphName = \"\") {\n super();\n if (layers.length === 0) {\n throw new Error(\"deep_fusion requires at least one layer\");\n }\n if (SPATIAL_TYPES.has(layers[0]!.type)) {\n throw new Error(\n \"deep_fusion: first layer must be a SignalLayer or EmbedLayer \" +\n \"(no scores to propagate or convolve)\",\n );\n }\n\n // Validate layer ordering and parameters\n let flattened = false;\n for (const layer of layers) {\n if (SPATIAL_TYPES.has(layer.type) && flattened) {\n throw new Error(\n \"deep_fusion: spatial layers (propagate, convolve, pool) \" +\n \"must not appear after flatten() or global_pool()\",\n );\n }\n if (layer.type === \"flatten\" || layer.type === \"global_pool\") {\n flattened = true;\n }\n if (layer.type === \"pool\" && layer.poolSize < 2) {\n throw new Error(\"deep_fusion: pool() pool_size must be >= 2\");\n }\n if (layer.type === \"dropout\") {\n const p = layer.p;\n if (p <= 0 || p >= 1) {\n throw new Error(\"deep_fusion: dropout() p must be in (0, 1)\");\n }\n }\n }\n\n this.layers = layers;\n this.alpha = alpha;\n this.gating = gating;\n this.graphName = graphName;\n this.embedMode = layers[0]!.type === \"embed\";\n\n // Grid acceleration\n if (this.embedMode) {\n const el = layers[0] as EmbedLayer;\n if (el.gridH > 0 && el.gridW > 0) {\n this._gridShape = [el.gridH, el.gridW];\n } else {\n this._gridShape = null;\n }\n } else {\n this._gridShape = null;\n }\n }\n\n execute(context: ExecutionContext): PostingList {\n let channelMap = new Map<DocId, Float64Array>();\n let numChannels = 1;\n let softmaxApplied = false;\n\n // Grid acceleration: batch conv+pool sequences via backend\n if (this._gridShape !== null) {\n const result = this._executeGrid(\n channelMap,\n numChannels,\n softmaxApplied,\n context,\n );\n channelMap = result.channelMap;\n numChannels = result.numChannels;\n softmaxApplied = result.softmaxApplied;\n } else {\n for (const layer of this.layers) {\n switch (layer.type) {\n case \"embed\":\n DeepFusionOperator._executeEmbedLayer(layer, channelMap);\n break;\n case \"signal\":\n this._executeSignalLayer(layer, context, channelMap, numChannels);\n break;\n case \"propagate\":\n this._executePropagateLayer(layer, context, channelMap, numChannels);\n break;\n case \"conv\":\n this._executeConvLayer(layer, context, channelMap);\n break;\n case \"pool\":\n this._executePoolLayer(layer, context, channelMap);\n break;\n case \"dense\":\n this._executeDenseLayer(layer, channelMap);\n numChannels = layer.outputChannels;\n break;\n case \"flatten\": {\n const r = DeepFusionOperator._executeFlattenLayer(channelMap);\n channelMap = r.channelMap;\n numChannels = r.numChannels;\n break;\n }\n case \"global_pool\": {\n const r = DeepFusionOperator._executeGlobalPoolLayer(layer, channelMap);\n channelMap = r.channelMap;\n numChannels = r.numChannels;\n break;\n }\n case \"softmax\":\n DeepFusionOperator._executeSoftmaxLayer(channelMap);\n softmaxApplied = true;\n break;\n case \"batchnorm\":\n DeepFusionOperator._executeBatchNormLayer(layer, channelMap);\n break;\n case \"dropout\":\n DeepFusionOperator._executeDropoutLayer(layer, channelMap);\n break;\n case \"attention\":\n this._executeAttentionLayer(layer, channelMap);\n break;\n }\n }\n }\n\n return DeepFusionOperator._buildResult(channelMap, numChannels, softmaxApplied);\n }\n\n // -- Result builder --\n\n private static _buildResult(\n channelMap: Map<DocId, Float64Array>,\n numChannels: number,\n softmaxApplied: boolean,\n ): PostingList {\n if (channelMap.size === 0) return new PostingList();\n\n const sortedIds = [...channelMap.keys()].sort((a, b) => a - b);\n const entries = sortedIds.map((docId) => {\n const vec = channelMap.get(docId)!;\n if (softmaxApplied) {\n let maxProb = -Infinity;\n for (let i = 0; i < vec.length; i++) {\n if (vec[i]! > maxProb) maxProb = vec[i]!;\n }\n const classProbs = Array.from(vec);\n return {\n docId,\n payload: createPayload({\n score: maxProb,\n fields: { class_probs: classProbs },\n }),\n };\n } else if (numChannels === 1) {\n const score = sigmoidVal(vec[0] ?? 0);\n return { docId, payload: createPayload({ score }) };\n } else {\n const sigVec = sigmoidVec(vec);\n let maxSig = -Infinity;\n for (let i = 0; i < sigVec.length; i++) {\n if (sigVec[i]! > maxSig) maxSig = sigVec[i]!;\n }\n return { docId, payload: createPayload({ score: maxSig }) };\n }\n });\n return PostingList.fromSorted(entries);\n }\n\n // -- Signal layer --\n\n private _executeSignalLayer(\n layer: SignalLayer,\n context: ExecutionContext,\n channelMap: Map<DocId, Float64Array>,\n numChannels: number,\n ): void {\n const signals = layer.signals;\n const postingLists = signals.map((s) => s.execute(context));\n\n const allDocIds = new Set<DocId>();\n const scoreMaps: Map<DocId, number>[] = [];\n for (const pl of postingLists) {\n const smap = new Map<DocId, number>();\n for (const entry of pl) {\n smap.set(entry.docId, entry.payload.score);\n allDocIds.add(entry.docId);\n }\n scoreMaps.push(smap);\n }\n\n if (allDocIds.size === 0) return;\n\n const numDocs = allDocIds.size;\n const defaults = scoreMaps.map((m) => coverageBasedDefault(m.size, numDocs));\n const alpha = this.alpha;\n const gating = this.gating;\n\n if (signals.length === 1) {\n const smap = scoreMaps[0]!;\n const def = defaults[0]!;\n for (const docId of allDocIds) {\n const p = smap.get(docId) ?? def;\n let layerLogit = safeLogit(p);\n layerLogit = applyGating(layerLogit, gating);\n if (!channelMap.has(docId)) {\n channelMap.set(docId, new Float64Array(numChannels));\n }\n channelMap.get(docId)![0]! += layerLogit;\n }\n } else {\n for (const docId of allDocIds) {\n const probs: number[] = [];\n for (let j = 0; j < scoreMaps.length; j++) {\n probs.push(scoreMaps[j]!.get(docId) ?? defaults[j]!);\n }\n const fusedP = logOddsConjunction(probs, alpha, undefined, \"none\");\n let layerLogit = safeLogit(fusedP);\n layerLogit = applyGating(layerLogit, gating);\n if (!channelMap.has(docId)) {\n channelMap.set(docId, new Float64Array(numChannels));\n }\n channelMap.get(docId)![0]! += layerLogit;\n }\n }\n }\n\n // -- Propagate layer --\n\n private _executePropagateLayer(\n layer: PropagateLayer,\n context: ExecutionContext,\n channelMap: Map<DocId, Float64Array>,\n numChannels: number,\n ): void {\n const gs = context.graphStore;\n if (gs == null) {\n throw new Error(\n \"deep_fusion propagate layer requires a graph_store in ExecutionContext\",\n );\n }\n\n // Convert channel 0 to probabilities\n const probMap = new Map<DocId, number>();\n for (const [docId, vec] of channelMap) {\n probMap.set(docId, sigmoidVal(vec[0]!));\n }\n\n const newMap = new Map<DocId, Float64Array>();\n const { direction, edgeLabel, aggregation } = layer;\n const gName = this.graphName;\n const gating = this.gating;\n\n // Collect all vertices that could be affected\n const allVertexIds = new Set(channelMap.keys());\n for (const docId of [...allVertexIds]) {\n const nbs = graphNeighbors(gs, docId, edgeLabel, direction, gName);\n for (const nb of nbs) allVertexIds.add(nb);\n }\n\n for (const vid of allVertexIds) {\n const neighborProbs: number[] = [];\n const nbs = graphNeighbors(gs, vid, edgeLabel, direction, gName);\n for (const nb of nbs) {\n const p = probMap.get(nb);\n if (p !== undefined) neighborProbs.push(p);\n }\n\n if (neighborProbs.length === 0) {\n if (channelMap.has(vid)) {\n newMap.set(vid, new Float64Array(channelMap.get(vid)!));\n }\n continue;\n }\n\n let aggProb: number;\n if (aggregation === \"mean\") {\n aggProb = neighborProbs.reduce((a, b) => a + b, 0) / neighborProbs.length;\n } else if (aggregation === \"sum\") {\n aggProb = Math.min(\n PROB_CEIL,\n neighborProbs.reduce((a, b) => a + b, 0),\n );\n } else if (aggregation === \"max\") {\n aggProb = Math.max(...neighborProbs);\n } else {\n aggProb = neighborProbs.reduce((a, b) => a + b, 0) / neighborProbs.length;\n }\n\n let propagatedLogit = safeLogit(aggProb);\n propagatedLogit = applyGating(propagatedLogit, gating);\n\n const existing = channelMap.get(vid);\n let newVec: Float64Array;\n if (existing !== undefined) {\n newVec = new Float64Array(existing);\n newVec[0] = existing[0]! + propagatedLogit;\n } else {\n newVec = new Float64Array(numChannels);\n newVec[0] = propagatedLogit;\n }\n newMap.set(vid, newVec);\n }\n\n channelMap.clear();\n for (const [k, v] of newMap) channelMap.set(k, v);\n }\n\n // -- Conv layer --\n\n private _executeConvLayer(\n layer: ConvLayer,\n context: ExecutionContext,\n channelMap: Map<DocId, Float64Array>,\n ): void {\n const gs = context.graphStore;\n if (gs == null) {\n throw new Error(\n \"deep_fusion convolve layer requires a graph_store in ExecutionContext\",\n );\n }\n\n const embedMode = this.embedMode;\n\n // Build value map\n const valMap = new Map<DocId, number>();\n for (const [docId, vec] of channelMap) {\n valMap.set(docId, embedMode ? vec[0]! : sigmoidVal(vec[0]!));\n }\n\n // Normalize hop weights\n const totalW = layer.hopWeights.reduce((a, b) => a + b, 0);\n if (totalW <= 0) return;\n const normWeights = layer.hopWeights.map((w) => w / totalW);\n\n const newMap = new Map<DocId, Float64Array>();\n const { edgeLabel, direction } = layer;\n const gName = this.graphName;\n const gating = this.gating;\n const kernelHops = layer.hopWeights.length - 1;\n\n for (const vid of [...channelMap.keys()]) {\n let weightedVal = 0.0;\n\n // Hop 0: self\n const selfVal = valMap.get(vid);\n if (selfVal !== undefined) {\n weightedVal += normWeights[0]! * selfVal;\n }\n\n // Hop 1..kernelHops: BFS rings\n let currentFrontier = new Set([vid]);\n const visited = new Set([vid]);\n for (let h = 1; h <= kernelHops; h++) {\n const nextFrontier = new Set<number>();\n for (const fv of currentFrontier) {\n for (const nb of graphNeighbors(gs, fv, edgeLabel, direction, gName)) {\n if (!visited.has(nb)) {\n nextFrontier.add(nb);\n visited.add(nb);\n }\n }\n }\n\n if (nextFrontier.size > 0) {\n const hopVals: number[] = [];\n for (const nb of nextFrontier) {\n const v = valMap.get(nb);\n if (v !== undefined) hopVals.push(v);\n }\n if (hopVals.length > 0) {\n const hopMean = hopVals.reduce((a, b) => a + b, 0) / hopVals.length;\n weightedVal += normWeights[h]! * hopMean;\n }\n }\n\n currentFrontier = nextFrontier;\n }\n\n const newVec = new Float64Array(channelMap.get(vid)!);\n if (embedMode) {\n newVec[0] = applyGating(weightedVal, gating);\n } else {\n let convLogit = safeLogit(\n Math.max(PROB_FLOOR, Math.min(PROB_CEIL, weightedVal)),\n );\n convLogit = applyGating(convLogit, gating);\n newVec[0] = channelMap.get(vid)![0]! + convLogit;\n }\n newMap.set(vid, newVec);\n }\n\n channelMap.clear();\n for (const [k, v] of newMap) channelMap.set(k, v);\n }\n\n // -- Pool layer --\n\n private _executePoolLayer(\n layer: PoolLayer,\n context: ExecutionContext,\n channelMap: Map<DocId, Float64Array>,\n ): void {\n const gs = context.graphStore;\n if (gs == null) {\n throw new Error(\n \"deep_fusion pool layer requires a graph_store in ExecutionContext\",\n );\n }\n\n const { edgeLabel, direction, poolSize, method } = layer;\n const gName = this.graphName;\n\n const remaining = new Set(channelMap.keys());\n const pooled = new Map<DocId, Float64Array>();\n\n while (remaining.size > 0) {\n const seed = Math.min(...remaining);\n remaining.delete(seed);\n\n // BFS to collect poolSize - 1 more neighbors\n const group = [seed];\n let frontier = new Set([seed]);\n const visitedBfs = new Set([seed]);\n\n while (group.length < poolSize && frontier.size > 0) {\n const nextFrontier = new Set<number>();\n for (const fv of frontier) {\n for (const nb of graphNeighbors(gs, fv, edgeLabel, direction, gName)) {\n if (!visitedBfs.has(nb)) {\n visitedBfs.add(nb);\n nextFrontier.add(nb);\n if (remaining.has(nb)) {\n group.push(nb);\n remaining.delete(nb);\n if (group.length >= poolSize) break;\n }\n }\n }\n if (group.length >= poolSize) break;\n }\n frontier = nextFrontier;\n }\n\n // Aggregate channel vectors element-wise\n const nCh = channelMap.get(group[0]!)!.length;\n const agg = new Float64Array(nCh);\n if (method === \"max\") {\n agg.fill(-Infinity);\n for (const g of group) {\n const vec = channelMap.get(g)!;\n for (let c = 0; c < nCh; c++) {\n agg[c] = Math.max(agg[c]!, vec[c]!);\n }\n }\n } else {\n for (const g of group) {\n const vec = channelMap.get(g)!;\n for (let c = 0; c < nCh; c++) {\n agg[c]! += vec[c]! / group.length;\n }\n }\n }\n\n const rep = Math.min(...group);\n pooled.set(rep, agg);\n }\n\n channelMap.clear();\n for (const [k, v] of pooled) channelMap.set(k, v);\n }\n\n // -- Dense layer --\n\n private _executeDenseLayer(\n layer: DenseLayer,\n channelMap: Map<DocId, Float64Array>,\n ): void {\n const docIds = [...channelMap.keys()].sort((a, b) => a - b);\n if (docIds.length === 0) return;\n const nCh = channelMap.get(docIds[0]!)!.length;\n const n = docIds.length;\n\n // Stack into matrix\n const X = new Float64Array(n * nCh);\n for (let i = 0; i < n; i++) {\n X.set(channelMap.get(docIds[i]!)!, i * nCh);\n }\n\n const W = new Float64Array(layer.weights);\n const bias = new Float64Array(layer.bias);\n const result = batchDense(\n X,\n [n, nCh],\n W,\n [layer.outputChannels, layer.inputChannels],\n bias,\n this.gating,\n );\n\n for (let i = 0; i < n; i++) {\n channelMap.set(\n docIds[i]!,\n result.data.slice(i * layer.outputChannels, (i + 1) * layer.outputChannels),\n );\n }\n }\n\n // -- Flatten layer --\n\n private static _executeFlattenLayer(channelMap: Map<DocId, Float64Array>): {\n channelMap: Map<DocId, Float64Array>;\n numChannels: number;\n } {\n if (channelMap.size === 0) return { channelMap: new Map(), numChannels: 0 };\n\n const sortedIds = [...channelMap.keys()].sort((a, b) => a - b);\n const parts: Float64Array[] = [];\n for (const did of sortedIds) parts.push(channelMap.get(did)!);\n\n let totalLen = 0;\n for (const p of parts) totalLen += p.length;\n const flatVec = new Float64Array(totalLen);\n let offset = 0;\n for (const p of parts) {\n flatVec.set(p, offset);\n offset += p.length;\n }\n\n const repId = sortedIds[0]!;\n const newMap = new Map<DocId, Float64Array>();\n newMap.set(repId, flatVec);\n return { channelMap: newMap, numChannels: totalLen };\n }\n\n // -- Global pool layer --\n\n private static _executeGlobalPoolLayer(\n layer: GlobalPoolLayer,\n channelMap: Map<DocId, Float64Array>,\n ): { channelMap: Map<DocId, Float64Array>; numChannels: number } {\n if (channelMap.size === 0) return { channelMap: new Map(), numChannels: 0 };\n\n const sortedIds = [...channelMap.keys()].sort((a, b) => a - b);\n const nCh = channelMap.get(sortedIds[0]!)!.length;\n const n = sortedIds.length;\n\n if (layer.method === \"avg\") {\n const pooled = new Float64Array(nCh);\n for (const did of sortedIds) {\n const vec = channelMap.get(did)!;\n for (let c = 0; c < nCh; c++) pooled[c]! += vec[c]! / n;\n }\n const newMap = new Map<DocId, Float64Array>();\n newMap.set(sortedIds[0]!, pooled);\n return { channelMap: newMap, numChannels: nCh };\n }\n\n if (layer.method === \"max\") {\n const pooled = new Float64Array(nCh).fill(-Infinity);\n for (const did of sortedIds) {\n const vec = channelMap.get(did)!;\n for (let c = 0; c < nCh; c++) pooled[c] = Math.max(pooled[c]!, vec[c]!);\n }\n const newMap = new Map<DocId, Float64Array>();\n newMap.set(sortedIds[0]!, pooled);\n return { channelMap: newMap, numChannels: nCh };\n }\n\n // avg_max\n const avgPooled = new Float64Array(nCh);\n const maxPooled = new Float64Array(nCh).fill(-Infinity);\n for (const did of sortedIds) {\n const vec = channelMap.get(did)!;\n for (let c = 0; c < nCh; c++) {\n avgPooled[c]! += vec[c]! / n;\n maxPooled[c] = Math.max(maxPooled[c]!, vec[c]!);\n }\n }\n const combined = new Float64Array(nCh * 2);\n combined.set(avgPooled, 0);\n combined.set(maxPooled, nCh);\n const newMap = new Map<DocId, Float64Array>();\n newMap.set(sortedIds[0]!, combined);\n return { channelMap: newMap, numChannels: nCh * 2 };\n }\n\n // -- Softmax layer --\n\n private static _executeSoftmaxLayer(channelMap: Map<DocId, Float64Array>): void {\n const docIds = [...channelMap.keys()].sort((a, b) => a - b);\n if (docIds.length === 0) return;\n const nCh = channelMap.get(docIds[0]!)!.length;\n const n = docIds.length;\n\n const X = new Float64Array(n * nCh);\n for (let i = 0; i < n; i++) {\n X.set(channelMap.get(docIds[i]!)!, i * nCh);\n }\n const out = batchSoftmax(X, [n, nCh]);\n for (let i = 0; i < n; i++) {\n channelMap.set(docIds[i]!, out.slice(i * nCh, (i + 1) * nCh));\n }\n }\n\n // -- Batchnorm layer --\n\n private static _executeBatchNormLayer(\n layer: BatchNormLayer,\n channelMap: Map<DocId, Float64Array>,\n ): void {\n if (channelMap.size < 2) return;\n\n const docIds = [...channelMap.keys()].sort((a, b) => a - b);\n const nCh = channelMap.get(docIds[0]!)!.length;\n const n = docIds.length;\n const eps = layer.epsilon ?? 1e-5;\n\n const X = new Float64Array(n * nCh);\n for (let i = 0; i < n; i++) {\n X.set(channelMap.get(docIds[i]!)!, i * nCh);\n }\n const out = batchBatchnorm(X, [n, nCh], eps);\n for (let i = 0; i < n; i++) {\n channelMap.set(docIds[i]!, out.slice(i * nCh, (i + 1) * nCh));\n }\n }\n\n // -- Dropout layer --\n\n private static _executeDropoutLayer(\n layer: DropoutLayer,\n channelMap: Map<DocId, Float64Array>,\n ): void {\n const scale = 1.0 - layer.p;\n for (const [docId, vec] of channelMap) {\n const scaled = new Float64Array(vec.length);\n for (let i = 0; i < vec.length; i++) scaled[i] = vec[i]! * scale;\n channelMap.set(docId, scaled);\n }\n }\n\n // -- Attention layer --\n\n private _executeAttentionLayer(\n layer: AttentionLayer,\n channelMap: Map<DocId, Float64Array>,\n ): void {\n if (channelMap.size === 0) return;\n\n const docIds = [...channelMap.keys()].sort((a, b) => a - b);\n const nCh = channelMap.get(docIds[0]!)!.length;\n const seqLen = docIds.length;\n\n // Stack into (1, seqLen, nCh) for batch_self_attention\n const X = new Float64Array(seqLen * nCh);\n for (let i = 0; i < seqLen; i++) {\n X.set(channelMap.get(docIds[i]!)!, i * nCh);\n }\n\n const wQ = layer.qWeights && layer.qShape ? new Float64Array(layer.qWeights) : null;\n const wK = layer.kWeights && layer.kShape ? new Float64Array(layer.kWeights) : null;\n const wV = layer.vWeights && layer.vShape ? new Float64Array(layer.vWeights) : null;\n\n const out = batchSelfAttention(\n X,\n [1, seqLen, nCh],\n layer.nHeads,\n wQ,\n wK,\n wV,\n this.gating,\n );\n\n for (let i = 0; i < seqLen; i++) {\n channelMap.set(docIds[i]!, out.slice(i * nCh, (i + 1) * nCh));\n }\n }\n\n // -- Embed layer --\n\n private static _executeEmbedLayer(\n layer: EmbedLayer,\n channelMap: Map<DocId, Float64Array>,\n ): void {\n if (layer.embedding) {\n for (let i = 0; i < layer.embedding.length; i++) {\n channelMap.set(i + 1, new Float64Array([layer.embedding[i]!]));\n }\n }\n }\n\n // -- Grid-accelerated execution --\n\n private _executeGrid(\n channelMap: Map<DocId, Float64Array>,\n numChannels: number,\n softmaxApplied: boolean,\n _context: ExecutionContext,\n ): {\n channelMap: Map<DocId, Float64Array>;\n numChannels: number;\n softmaxApplied: boolean;\n } {\n const [gridH, gridW] = this._gridShape!;\n\n type SegType = \"conv_pool\" | \"attention\" | \"global_pool\";\n type ConvPoolStage = {\n kernel: Float64Array;\n kernelShape: number[];\n poolSize: number;\n poolMethod: string;\n };\n const segments: [SegType, unknown][] = [];\n let currentConvPool: ConvPoolStage[] = [];\n const remainingLayers: FusionLayer[] = [];\n const nonEmbed = this.layers.filter((la) => la.type !== \"embed\");\n\n let i = 0;\n while (i < nonEmbed.length) {\n const la = nonEmbed[i]!;\n if (la.type === \"conv\") {\n const conv = la;\n let poolSize = 2;\n let poolMethod = \"max\";\n if (i + 1 < nonEmbed.length && nonEmbed[i + 1]!.type === \"pool\") {\n const pl = nonEmbed[i + 1] as PoolLayer;\n poolSize = pl.poolSize;\n poolMethod = pl.method;\n i += 2;\n } else {\n i += 1;\n }\n let k: Float64Array;\n let kShape: number[];\n if (conv.kernel != null && conv.kernelShape != null) {\n k = new Float64Array(conv.kernel);\n kShape = [...conv.kernelShape];\n } else {\n k = hopWeightsToKernel([...conv.hopWeights]);\n kShape = [1, 1, 3, 3];\n }\n currentConvPool.push({ kernel: k, kernelShape: kShape, poolSize, poolMethod });\n } else if (la.type === \"attention\") {\n if (currentConvPool.length > 0) {\n segments.push([\"conv_pool\", currentConvPool]);\n currentConvPool = [];\n }\n segments.push([\"attention\", la]);\n i += 1;\n } else if (la.type === \"global_pool\") {\n if (currentConvPool.length > 0) {\n segments.push([\"conv_pool\", currentConvPool]);\n currentConvPool = [];\n }\n segments.push([\"global_pool\", la]);\n i += 1;\n } else {\n if (currentConvPool.length > 0) {\n segments.push([\"conv_pool\", currentConvPool]);\n currentConvPool = [];\n }\n remainingLayers.push(la);\n i += 1;\n }\n }\n if (currentConvPool.length > 0) {\n segments.push([\"conv_pool\", currentConvPool]);\n }\n\n // Process segments sequentially\n const embedLayer = this.layers[0] as EmbedLayer;\n const embedding = embedLayer.embedding ?? [];\n let currentFlat: Float64Array = new Float64Array(embedding);\n let curH = gridH;\n let curW = gridW;\n const batch = 1;\n\n for (const [segType, segData] of segments) {\n if (segType === \"conv_pool\") {\n const stagesList = segData as ConvPoolStage[];\n const result = backendGridForward(\n currentFlat,\n [batch, currentFlat.length],\n curH,\n curW,\n stagesList,\n this.gating,\n );\n currentFlat = result.data;\n for (const stage of stagesList) {\n curH = Math.floor(curH / stage.poolSize);\n curW = Math.floor(curW / stage.poolSize);\n }\n } else if (segType === \"attention\") {\n const attnLayer = segData as AttentionLayer;\n const nCh = Math.floor(currentFlat.length / (curH * curW));\n const seqLen = curH * curW;\n\n // Reshape (1, C*H*W) -> (1, H*W, C)\n const X3d = new Float64Array(seqLen * nCh);\n for (let s = 0; s < seqLen; s++) {\n for (let c = 0; c < nCh; c++) {\n X3d[s * nCh + c] = currentFlat[c * seqLen + s] ?? 0;\n }\n }\n\n const wQ =\n attnLayer.qWeights && attnLayer.qShape\n ? new Float64Array(attnLayer.qWeights)\n : null;\n const wK =\n attnLayer.kWeights && attnLayer.kShape\n ? new Float64Array(attnLayer.kWeights)\n : null;\n const wV =\n attnLayer.vWeights && attnLayer.vShape\n ? new Float64Array(attnLayer.vWeights)\n : null;\n\n const out3d = batchSelfAttention(\n X3d,\n [1, seqLen, nCh],\n attnLayer.nHeads,\n wQ,\n wK,\n wV,\n this.gating,\n );\n\n // Reshape back to (1, C*H*W)\n currentFlat = new Float64Array(nCh * seqLen);\n for (let s = 0; s < seqLen; s++) {\n for (let c = 0; c < nCh; c++) {\n currentFlat[c * seqLen + s] = out3d[s * nCh + c]!;\n }\n }\n } else {\n const gpLayer = segData as GlobalPoolLayer;\n const result = backendGridGlobalPool(\n currentFlat,\n [batch, currentFlat.length],\n curH,\n curW,\n gpLayer.method,\n );\n currentFlat = result.data;\n curH = 1;\n curW = 1;\n }\n }\n\n // Rebuild channel_map from final features\n const newChannelMap = new Map<DocId, Float64Array>();\n const hasGlobalPool = segments.some(([st]) => st === \"global_pool\");\n if (hasGlobalPool) {\n newChannelMap.set(1, currentFlat);\n numChannels = currentFlat.length;\n } else {\n for (let idx = 0; idx < currentFlat.length; idx++) {\n newChannelMap.set(idx + 1, new Float64Array([currentFlat[idx]!]));\n }\n numChannels = 1;\n }\n\n // Process remaining layers\n let cm = newChannelMap;\n let nc = numChannels;\n let sa = softmaxApplied;\n for (const layer of remainingLayers) {\n switch (layer.type) {\n case \"flatten\": {\n const r = DeepFusionOperator._executeFlattenLayer(cm);\n cm = r.channelMap;\n nc = r.numChannels;\n break;\n }\n case \"global_pool\": {\n const r = DeepFusionOperator._executeGlobalPoolLayer(layer, cm);\n cm = r.channelMap;\n nc = r.numChannels;\n break;\n }\n case \"dense\":\n this._executeDenseLayer(layer, cm);\n nc = layer.outputChannels;\n break;\n case \"softmax\":\n DeepFusionOperator._executeSoftmaxLayer(cm);\n sa = true;\n break;\n case \"batchnorm\":\n DeepFusionOperator._executeBatchNormLayer(layer, cm);\n break;\n case \"dropout\":\n DeepFusionOperator._executeDropoutLayer(layer, cm);\n break;\n }\n }\n\n return { channelMap: cm, numChannels: nc, softmaxApplied: sa };\n }\n\n // -- Cost estimation --\n\n costEstimate(stats: IndexStats): number {\n let total = 0;\n for (const layer of this.layers) {\n switch (layer.type) {\n case \"signal\":\n for (const s of layer.signals) {\n total += s.costEstimate(stats);\n }\n break;\n case \"embed\":\n total += (layer.embedding ?? []).length;\n break;\n case \"propagate\":\n case \"conv\":\n case \"pool\":\n total += stats.totalDocs;\n break;\n case \"dense\":\n total += layer.inputChannels * layer.outputChannels;\n break;\n case \"flatten\":\n case \"global_pool\":\n case \"softmax\":\n case \"batchnorm\":\n case \"dropout\":\n total += stats.totalDocs;\n break;\n case \"attention\":\n total += stats.totalDocs ** 2;\n break;\n }\n }\n return total;\n }\n}\n\n// -- estimate_conv_weights --------------------------------------------------\n\nexport function estimateConvWeights(\n graphStore: unknown,\n docStore: unknown,\n edgeLabel: string,\n kernelHops: number,\n graphName: string,\n embeddingField = \"embedding\",\n): number[] {\n const store = docStore as {\n docIds: number[];\n getField: (docId: number, field: string) => number[] | Float64Array | null;\n };\n const gs = graphStore;\n\n // Collect all doc_ids and their embeddings\n const embeddings = new Map<number, Float64Array>();\n for (const docId of store.docIds) {\n const vec = store.getField(docId, embeddingField);\n if (vec != null) {\n const arr = vec instanceof Float64Array ? vec : new Float64Array(vec);\n let norm = 0;\n for (let i = 0; i < arr.length; i++) norm += arr[i]! * arr[i]!;\n norm = Math.sqrt(norm);\n if (norm > 0) {\n const normalized = new Float64Array(arr.length);\n for (let i = 0; i < arr.length; i++) normalized[i] = arr[i]! / norm;\n embeddings.set(docId, normalized);\n }\n }\n }\n\n if (embeddings.size < 2) {\n const w = 1.0 / (kernelHops + 1);\n return new Array<number>(kernelHops + 1).fill(w);\n }\n\n // For each hop distance, compute average cosine similarity\n const hopSimilarities: number[][] = [];\n for (let h = 0; h <= kernelHops; h++) hopSimilarities.push([]);\n\n for (const [vid, vecV] of embeddings) {\n hopSimilarities[0]!.push(1.0);\n\n let currentFrontier = new Set([vid]);\n const visited = new Set([vid]);\n for (let h = 1; h <= kernelHops; h++) {\n const nextFrontier = new Set<number>();\n for (const fv of currentFrontier) {\n for (const nb of graphNeighbors(gs, fv, edgeLabel, \"both\", graphName)) {\n if (!visited.has(nb)) {\n nextFrontier.add(nb);\n visited.add(nb);\n }\n }\n }\n for (const nb of nextFrontier) {\n const vecNb = embeddings.get(nb);\n if (vecNb !== undefined) {\n let dot = 0;\n for (let i = 0; i < vecV.length; i++) dot += vecV[i]! * vecNb[i]!;\n hopSimilarities[h]!.push(dot);\n }\n }\n currentFrontier = nextFrontier;\n }\n }\n\n // Compute mean similarity per hop\n const rawWeights: number[] = [];\n for (let h = 0; h <= kernelHops; h++) {\n const sims = hopSimilarities[h]!;\n if (sims.length > 0) {\n const meanSim = sims.reduce((a, b) => a + b, 0) / sims.length;\n rawWeights.push(Math.max(0.0, meanSim));\n } else {\n rawWeights.push(0.0);\n }\n }\n\n // Normalize to sum to 1\n const total = rawWeights.reduce((a, b) => a + b, 0);\n if (total <= 0) {\n const w = 1.0 / (kernelHops + 1);\n return new Array<number>(kernelHops + 1).fill(w);\n }\n\n return rawWeights.map((w) => w / total);\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- hierarchical operators\n// 1:1 port of uqa/operators/hierarchical.py\n\nimport type { DocId, IndexStats, PathExpr, Predicate } from \"../core/types.js\";\nimport { createPayload, isNullPredicate } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"./base.js\";\nimport { Operator } from \"./base.js\";\nimport { FilterOperator } from \"./primitive.js\";\nimport type { AggregationMonoid } from \"./aggregation.js\";\n\n// -- PathFilterOperator ------------------------------------------------------\n\nexport class PathFilterOperator extends Operator {\n readonly path: PathExpr;\n readonly predicate: Predicate;\n readonly source: Operator | null;\n\n constructor(path: PathExpr, predicate: Predicate, source?: Operator | null) {\n super();\n this.path = path;\n this.predicate = predicate;\n this.source = source ?? null;\n }\n\n execute(context: ExecutionContext): PostingList {\n const docStore = context.documentStore;\n if (!docStore) return new PostingList();\n\n const isNullAware = isNullPredicate(this.predicate);\n let docIds: DocId[];\n if (this.source) {\n docIds = this.source.execute(context).entries.map((e) => e.docId);\n } else {\n docIds = [...docStore.docIds].sort((a, b) => a - b);\n }\n\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n for (const docId of docIds) {\n const value = docStore.evalPath(docId, this.path);\n if (Array.isArray(value)) {\n if ((value as unknown[]).some((v) => this.predicate.evaluate(v))) {\n entries.push({ docId, payload: createPayload({ score: 0.0 }) });\n }\n } else {\n if (!isNullAware && (value === null || value === undefined)) continue;\n if (this.predicate.evaluate(value)) {\n entries.push({ docId, payload: createPayload({ score: 0.0 }) });\n }\n }\n }\n\n return PostingList.fromSorted(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return this.source ? this.source.costEstimate(stats) : stats.totalDocs;\n }\n}\n\n// -- PathProjectOperator -----------------------------------------------------\n\nexport class PathProjectOperator extends Operator {\n readonly paths: PathExpr[];\n readonly source: Operator;\n\n constructor(paths: PathExpr[], source: Operator) {\n super();\n this.paths = paths;\n this.source = source;\n }\n\n execute(context: ExecutionContext): PostingList {\n const sourcePl = this.source.execute(context);\n const docStore = context.documentStore;\n if (!docStore) return sourcePl;\n\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n for (const entry of sourcePl) {\n const projected: Record<string, unknown> = {};\n for (const path of this.paths) {\n const value = docStore.evalPath(entry.docId, path);\n const key = path.join(\".\");\n projected[key] = value;\n }\n entries.push({\n docId: entry.docId,\n payload: createPayload({\n positions: entry.payload.positions as number[],\n score: entry.payload.score,\n fields: {\n ...(entry.payload.fields as Record<string, unknown>),\n ...projected,\n },\n }),\n });\n }\n\n return PostingList.fromSorted(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return this.source.costEstimate(stats);\n }\n}\n\n// -- PathUnnestOperator ------------------------------------------------------\n\nexport class PathUnnestOperator extends Operator {\n readonly path: PathExpr;\n readonly source: Operator;\n\n constructor(path: PathExpr, source: Operator) {\n super();\n this.path = path;\n this.source = source;\n }\n\n execute(context: ExecutionContext): PostingList {\n const sourcePl = this.source.execute(context);\n const docStore = context.documentStore;\n if (!docStore) return sourcePl;\n\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n for (const entry of sourcePl) {\n const arr = docStore.evalPath(entry.docId, this.path);\n if (Array.isArray(arr)) {\n for (const item of arr as unknown[]) {\n entries.push({\n docId: entry.docId,\n payload: createPayload({\n positions: entry.payload.positions as number[],\n score: entry.payload.score,\n fields: {\n ...(entry.payload.fields as Record<string, unknown>),\n _unnested_data: item,\n },\n }),\n });\n }\n } else {\n entries.push(entry);\n }\n }\n\n return new PostingList(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return this.source.costEstimate(stats) * 2.0;\n }\n}\n\n// -- PathAggregateOperator ---------------------------------------------------\n\nexport class PathAggregateOperator extends Operator {\n readonly path: PathExpr;\n readonly monoid: AggregationMonoid<unknown, unknown, unknown>;\n readonly source: Operator | null;\n\n constructor(\n path: PathExpr,\n monoid: AggregationMonoid<unknown, unknown, unknown>,\n source?: Operator | null,\n ) {\n super();\n this.path = path;\n this.monoid = monoid;\n this.source = source ?? null;\n }\n\n execute(context: ExecutionContext): PostingList {\n const docStore = context.documentStore;\n if (!docStore) return new PostingList();\n\n let docIds: DocId[];\n if (this.source) {\n docIds = this.source.execute(context).entries.map((e) => e.docId);\n } else {\n docIds = [...docStore.docIds].sort((a, b) => a - b);\n }\n\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n for (const docId of docIds) {\n const value = docStore.evalPath(docId, this.path);\n let state = this.monoid.identity();\n\n if (Array.isArray(value)) {\n for (const v of value as unknown[]) {\n if (v !== null && v !== undefined) {\n state = this.monoid.accumulate(state, v);\n }\n }\n } else if (value !== null && value !== undefined) {\n state = this.monoid.accumulate(state, value);\n }\n\n const result = this.monoid.finalize(state);\n const score = typeof result === \"number\" ? result : 0;\n entries.push({\n docId,\n payload: createPayload({\n score,\n fields: {\n _path_agg_result: result,\n _path_agg_path: this.path.join(\".\"),\n },\n }),\n });\n }\n\n return PostingList.fromSorted(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return this.source ? this.source.costEstimate(stats) : stats.totalDocs;\n }\n}\n\n// -- UnifiedFilterOperator ---------------------------------------------------\n\nexport class UnifiedFilterOperator extends Operator {\n readonly fieldExpr: string;\n readonly predicate: Predicate;\n readonly source: Operator | null;\n\n constructor(fieldExpr: string, predicate: Predicate, source?: Operator | null) {\n super();\n this.fieldExpr = fieldExpr;\n this.predicate = predicate;\n this.source = source ?? null;\n }\n\n execute(context: ExecutionContext): PostingList {\n if (this.fieldExpr.includes(\".\")) {\n const path = this.fieldExpr.split(\".\");\n return new PathFilterOperator(path, this.predicate, this.source).execute(context);\n }\n return new FilterOperator(this.fieldExpr, this.predicate, this.source).execute(\n context,\n );\n }\n\n costEstimate(stats: IndexStats): number {\n return this.source ? this.source.costEstimate(stats) : stats.totalDocs;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- attention fusion operator\n// 1:1 port of uqa/operators/attention.py\n\nimport type { DocId, IndexStats } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"./base.js\";\nimport { Operator } from \"./base.js\";\nimport { coverageBasedDefault } from \"./hybrid.js\";\n\n// Attention interface (from bayesian-bm25 AttentionLogOddsWeights / MultiHeadAttentionLogOddsWeights)\nexport interface AttentionFusionLike {\n fuse(probs: number[], queryFeatures: Float64Array | number[]): number;\n}\n\nexport class AttentionFusionOperator extends Operator {\n readonly signals: Operator[];\n readonly attention: AttentionFusionLike;\n readonly queryFeatures: Float64Array;\n\n constructor(\n signals: Operator[],\n attention: AttentionFusionLike,\n queryFeatures: Float64Array,\n ) {\n super();\n this.signals = signals;\n this.attention = attention;\n this.queryFeatures = queryFeatures;\n }\n\n execute(context: ExecutionContext): PostingList {\n const signalResults = this.signals.map((s) => s.execute(context));\n const scoreMaps: Map<DocId, number>[] = [];\n const allDocIds = new Set<DocId>();\n let numDocs = 0;\n\n for (const pl of signalResults) {\n const m = new Map<DocId, number>();\n for (const e of pl) {\n m.set(e.docId, e.payload.score);\n allDocIds.add(e.docId);\n }\n scoreMaps.push(m);\n numDocs = Math.max(numDocs, m.size);\n }\n\n const defaults = scoreMaps.map((m) => coverageBasedDefault(m.size, numDocs));\n\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n for (const docId of allDocIds) {\n const probs: number[] = [];\n for (let s = 0; s < scoreMaps.length; s++) {\n probs.push(scoreMaps[s]!.get(docId) ?? defaults[s]!);\n }\n const fused = this.attention.fuse(probs, this.queryFeatures);\n entries.push({ docId, payload: createPayload({ score: fused }) });\n }\n\n return new PostingList(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n let sum = 0;\n for (const s of this.signals) sum += s.costEstimate(stats);\n return sum;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- learned fusion operator\n// 1:1 port of uqa/operators/learned_fusion.py\n\nimport type { DocId, IndexStats } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"./base.js\";\nimport { Operator } from \"./base.js\";\nimport { coverageBasedDefault } from \"./hybrid.js\";\n\n// Learned fusion interface (from bayesian-bm25 LearnableLogOddsWeights)\nexport interface LearnedFusionLike {\n fuse(probs: number[]): number;\n}\n\nexport class LearnedFusionOperator extends Operator {\n readonly signals: Operator[];\n readonly learned: LearnedFusionLike;\n\n constructor(signals: Operator[], learned: LearnedFusionLike) {\n super();\n this.signals = signals;\n this.learned = learned;\n }\n\n execute(context: ExecutionContext): PostingList {\n const signalResults = this.signals.map((s) => s.execute(context));\n const scoreMaps: Map<DocId, number>[] = [];\n const allDocIds = new Set<DocId>();\n let numDocs = 0;\n\n for (const pl of signalResults) {\n const m = new Map<DocId, number>();\n for (const e of pl) {\n m.set(e.docId, e.payload.score);\n allDocIds.add(e.docId);\n }\n scoreMaps.push(m);\n numDocs = Math.max(numDocs, m.size);\n }\n\n const defaults = scoreMaps.map((m) => coverageBasedDefault(m.size, numDocs));\n\n const entries: { docId: DocId; payload: ReturnType<typeof createPayload> }[] = [];\n for (const docId of allDocIds) {\n const probs: number[] = [];\n for (let s = 0; s < scoreMaps.length; s++) {\n probs.push(scoreMaps[s]!.get(docId) ?? defaults[s]!);\n }\n const fused = this.learned.fuse(probs);\n entries.push({ docId, payload: createPayload({ score: fused }) });\n }\n\n return new PostingList(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n let sum = 0;\n for (const s of this.signals) sum += s.costEstimate(stats);\n return sum;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- GraphPostingList\n// 1:1 port of uqa/graph/posting_list.py\n\nimport type { PostingEntry } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\n\n// -- GraphPayload -------------------------------------------------------------\n\nexport interface GraphPayload {\n readonly subgraphVertices: ReadonlySet<number>;\n readonly subgraphEdges: ReadonlySet<number>;\n readonly score: number;\n readonly graphName: string;\n}\n\nexport function createGraphPayload(\n opts?: Partial<{\n subgraphVertices: ReadonlySet<number>;\n subgraphEdges: ReadonlySet<number>;\n score: number;\n graphName: string;\n }>,\n): GraphPayload {\n return {\n subgraphVertices: opts?.subgraphVertices ?? new Set<number>(),\n subgraphEdges: opts?.subgraphEdges ?? new Set<number>(),\n score: opts?.score ?? 0.0,\n graphName: opts?.graphName ?? \"\",\n };\n}\n\n// -- GraphPostingList ---------------------------------------------------------\n\nexport class GraphPostingList extends PostingList {\n private _graphPayloads: Map<number, GraphPayload>;\n\n constructor(entries?: PostingEntry[], graphPayloads?: Map<number, GraphPayload>) {\n super(entries);\n this._graphPayloads = new Map(graphPayloads ?? []);\n }\n\n setGraphPayload(docId: number, payload: GraphPayload): void {\n this._graphPayloads.set(docId, payload);\n }\n\n getGraphPayload(docId: number): GraphPayload | null {\n return this._graphPayloads.get(docId) ?? null;\n }\n\n get graphPayloads(): Map<number, GraphPayload> {\n return this._graphPayloads;\n }\n\n // Isomorphism Phi: GraphPostingList -> PostingList\n // Embeds graph-specific payload into the standard PostingList fields.\n toPostingList(): PostingList {\n const entries: PostingEntry[] = [];\n for (const entry of this) {\n const gp = this._graphPayloads.get(entry.docId);\n const fields: Record<string, unknown> = {\n ...(entry.payload.fields as Record<string, unknown>),\n };\n if (gp) {\n fields[\"_subgraph_vertices\"] = [...gp.subgraphVertices];\n fields[\"_subgraph_edges\"] = [...gp.subgraphEdges];\n fields[\"_graph_score\"] = gp.score;\n fields[\"_graph_name\"] = gp.graphName;\n }\n entries.push({\n docId: entry.docId,\n payload: createPayload({\n positions: entry.payload.positions,\n score: gp ? gp.score : entry.payload.score,\n fields,\n }),\n });\n }\n return new PostingList(entries);\n }\n\n // Inverse: PostingList -> GraphPostingList\n static fromPostingList(pl: PostingList): GraphPostingList {\n const entries: PostingEntry[] = [];\n const graphPayloads = new Map<number, GraphPayload>();\n\n for (const entry of pl) {\n entries.push(entry);\n const fields = entry.payload.fields as Record<string, unknown>;\n const rawVertices = fields[\"_subgraph_vertices\"];\n const rawEdges = fields[\"_subgraph_edges\"];\n const rawScore = fields[\"_graph_score\"];\n const rawName = fields[\"_graph_name\"];\n\n if (rawVertices !== undefined || rawEdges !== undefined) {\n graphPayloads.set(\n entry.docId,\n createGraphPayload({\n subgraphVertices: new Set(\n Array.isArray(rawVertices) ? (rawVertices as number[]) : [],\n ),\n subgraphEdges: new Set(\n Array.isArray(rawEdges) ? (rawEdges as number[]) : [],\n ),\n score: typeof rawScore === \"number\" ? rawScore : entry.payload.score,\n graphName: typeof rawName === \"string\" ? rawName : \"\",\n }),\n );\n }\n }\n\n return new GraphPostingList(entries, graphPayloads);\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Graph pattern types and RPQ parser\n// 1:1 port of uqa/graph/pattern.py\n\nimport type { Vertex, Edge } from \"../core/types.js\";\n\n// -- Pattern types ------------------------------------------------------------\n\nexport interface VertexPattern {\n readonly variable: string;\n readonly constraints: ((v: Vertex) => boolean)[];\n}\n\nexport interface EdgePattern {\n readonly sourceVar: string;\n readonly targetVar: string;\n readonly label: string | null;\n readonly constraints: ((e: Edge) => boolean)[];\n readonly negated: boolean;\n}\n\nexport interface GraphPattern {\n readonly vertexPatterns: VertexPattern[];\n readonly edgePatterns: EdgePattern[];\n}\n\nexport function createVertexPattern(\n variable: string,\n constraints?: ((v: Vertex) => boolean)[],\n): VertexPattern {\n return { variable, constraints: constraints ?? [] };\n}\n\nexport function createEdgePattern(\n sourceVar: string,\n targetVar: string,\n opts?: Partial<{\n label: string | null;\n constraints: ((e: Edge) => boolean)[];\n negated: boolean;\n }>,\n): EdgePattern {\n return {\n sourceVar,\n targetVar,\n label: opts?.label ?? null,\n constraints: opts?.constraints ?? [],\n negated: opts?.negated ?? false,\n };\n}\n\nexport function createGraphPattern(\n vertexPatterns?: VertexPattern[],\n edgePatterns?: EdgePattern[],\n): GraphPattern {\n return {\n vertexPatterns: vertexPatterns ?? [],\n edgePatterns: edgePatterns ?? [],\n };\n}\n\n// -- Regular Path Expression AST ----------------------------------------------\n\nexport abstract class RegularPathExpr {\n abstract equals(other: RegularPathExpr): boolean;\n abstract toString(): string;\n}\n\nexport class Label extends RegularPathExpr {\n readonly name: string;\n\n constructor(name: string) {\n super();\n this.name = name;\n }\n\n equals(other: RegularPathExpr): boolean {\n return other instanceof Label && other.name === this.name;\n }\n\n toString(): string {\n return this.name;\n }\n}\n\nexport class Concat extends RegularPathExpr {\n readonly left: RegularPathExpr;\n readonly right: RegularPathExpr;\n\n constructor(left: RegularPathExpr, right: RegularPathExpr) {\n super();\n this.left = left;\n this.right = right;\n }\n\n equals(other: RegularPathExpr): boolean {\n return (\n other instanceof Concat &&\n this.left.equals(other.left) &&\n this.right.equals(other.right)\n );\n }\n\n toString(): string {\n return `${this.left.toString()} / ${this.right.toString()}`;\n }\n}\n\nexport class Alternation extends RegularPathExpr {\n readonly left: RegularPathExpr;\n readonly right: RegularPathExpr;\n\n constructor(left: RegularPathExpr, right: RegularPathExpr) {\n super();\n this.left = left;\n this.right = right;\n }\n\n equals(other: RegularPathExpr): boolean {\n return (\n other instanceof Alternation &&\n this.left.equals(other.left) &&\n this.right.equals(other.right)\n );\n }\n\n toString(): string {\n return `(${this.left.toString()} | ${this.right.toString()})`;\n }\n}\n\nexport class KleeneStar extends RegularPathExpr {\n readonly inner: RegularPathExpr;\n\n constructor(inner: RegularPathExpr) {\n super();\n this.inner = inner;\n }\n\n equals(other: RegularPathExpr): boolean {\n return other instanceof KleeneStar && this.inner.equals(other.inner);\n }\n\n toString(): string {\n return `(${this.inner.toString()})*`;\n }\n}\n\nexport class BoundedLabel extends RegularPathExpr {\n readonly name: string;\n readonly minCount: number;\n readonly maxCount: number;\n\n constructor(name: string, minCount: number, maxCount: number) {\n super();\n this.name = name;\n this.minCount = minCount;\n this.maxCount = maxCount;\n }\n\n equals(other: RegularPathExpr): boolean {\n return (\n other instanceof BoundedLabel &&\n other.name === this.name &&\n other.minCount === this.minCount &&\n other.maxCount === this.maxCount\n );\n }\n\n toString(): string {\n return `${this.name}{${String(this.minCount)},${String(this.maxCount)}}`;\n }\n}\n\n// -- RPQ tokenizer and parser -------------------------------------------------\n\ninterface Token {\n readonly type:\n | \"LABEL\"\n | \"PIPE\"\n | \"SLASH\"\n | \"STAR\"\n | \"LPAREN\"\n | \"RPAREN\"\n | \"LBRACE\"\n | \"RBRACE\"\n | \"COMMA\"\n | \"NUMBER\";\n readonly value: string;\n}\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n while (i < input.length) {\n const ch = input[i]!;\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\") {\n i++;\n continue;\n }\n if (ch === \"|\") {\n tokens.push({ type: \"PIPE\", value: \"|\" });\n i++;\n } else if (ch === \"/\") {\n tokens.push({ type: \"SLASH\", value: \"/\" });\n i++;\n } else if (ch === \"*\") {\n tokens.push({ type: \"STAR\", value: \"*\" });\n i++;\n } else if (ch === \"(\") {\n tokens.push({ type: \"LPAREN\", value: \"(\" });\n i++;\n } else if (ch === \")\") {\n tokens.push({ type: \"RPAREN\", value: \")\" });\n i++;\n } else if (ch === \"{\") {\n tokens.push({ type: \"LBRACE\", value: \"{\" });\n i++;\n } else if (ch === \"}\") {\n tokens.push({ type: \"RBRACE\", value: \"}\" });\n i++;\n } else if (ch === \",\") {\n tokens.push({ type: \"COMMA\", value: \",\" });\n i++;\n } else if (ch >= \"0\" && ch <= \"9\") {\n let num = \"\";\n while (i < input.length && input[i]! >= \"0\" && input[i]! <= \"9\") {\n num += input[i]!;\n i++;\n }\n tokens.push({ type: \"NUMBER\", value: num });\n } else {\n // Label: alphanumeric + underscore + hyphen\n let label = \"\";\n while (\n i < input.length &&\n input[i] !== \" \" &&\n input[i] !== \"\\t\" &&\n input[i] !== \"\\n\" &&\n input[i] !== \"\\r\" &&\n input[i] !== \"|\" &&\n input[i] !== \"/\" &&\n input[i] !== \"*\" &&\n input[i] !== \"(\" &&\n input[i] !== \")\" &&\n input[i] !== \"{\" &&\n input[i] !== \"}\" &&\n input[i] !== \",\"\n ) {\n label += input[i]!;\n i++;\n }\n if (label.length > 0) {\n tokens.push({ type: \"LABEL\", value: label });\n }\n }\n }\n return tokens;\n}\n\n// Recursive descent parser for RPQ expressions\n// Grammar:\n// expr -> concat (PIPE concat)*\n// concat -> unary (SLASH unary)*\n// unary -> primary (STAR | bounded)?\n// primary -> LABEL | LPAREN expr RPAREN\n// bounded -> LBRACE NUMBER COMMA NUMBER RBRACE\n\nclass RPQParser {\n private tokens: Token[];\n private pos: number;\n\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n this.pos = 0;\n }\n\n private peek(): Token | null {\n if (this.pos < this.tokens.length) {\n return this.tokens[this.pos]!;\n }\n return null;\n }\n\n private consume(expectedType?: string): Token {\n const tok = this.peek();\n if (!tok) {\n throw new Error(\"RPQ parse error: unexpected end of input\");\n }\n if (expectedType !== undefined && tok.type !== expectedType) {\n throw new Error(\n `RPQ parse error: expected ${expectedType}, got ${tok.type} ('${tok.value}')`,\n );\n }\n this.pos++;\n return tok;\n }\n\n parseExpr(): RegularPathExpr {\n let left = this.parseConcat();\n while (this.peek()?.type === \"PIPE\") {\n this.consume(\"PIPE\");\n const right = this.parseConcat();\n left = new Alternation(left, right);\n }\n return left;\n }\n\n private parseConcat(): RegularPathExpr {\n let left = this.parseUnary();\n while (this.peek()?.type === \"SLASH\") {\n this.consume(\"SLASH\");\n const right = this.parseUnary();\n left = new Concat(left, right);\n }\n return left;\n }\n\n private parseUnary(): RegularPathExpr {\n let node = this.parsePrimary();\n const next = this.peek();\n if (next?.type === \"STAR\") {\n this.consume(\"STAR\");\n node = new KleeneStar(node);\n } else if (next?.type === \"LBRACE\") {\n // Bounded repetition: only valid on Label\n this.consume(\"LBRACE\");\n const minTok = this.consume(\"NUMBER\");\n this.consume(\"COMMA\");\n const maxTok = this.consume(\"NUMBER\");\n this.consume(\"RBRACE\");\n if (node instanceof Label) {\n node = new BoundedLabel(\n node.name,\n parseInt(minTok.value, 10),\n parseInt(maxTok.value, 10),\n );\n } else {\n throw new Error(\"RPQ parse error: bounded repetition only supported on labels\");\n }\n }\n return node;\n }\n\n private parsePrimary(): RegularPathExpr {\n const tok = this.peek();\n if (!tok) {\n throw new Error(\"RPQ parse error: unexpected end of input\");\n }\n if (tok.type === \"LPAREN\") {\n this.consume(\"LPAREN\");\n const expr = this.parseExpr();\n this.consume(\"RPAREN\");\n return expr;\n }\n if (tok.type === \"LABEL\") {\n this.consume(\"LABEL\");\n return new Label(tok.value);\n }\n throw new Error(`RPQ parse error: unexpected token ${tok.type} ('${tok.value}')`);\n }\n}\n\nexport function parseRpq(exprStr: string): RegularPathExpr {\n const tokens = tokenize(exprStr);\n if (tokens.length === 0) {\n throw new Error(\"RPQ parse error: empty expression\");\n }\n const parser = new RPQParser(tokens);\n const result = parser.parseExpr();\n return result;\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- RPQ optimizer\n// 1:1 port of uqa/graph/rpq_optimizer.py\n\nimport { Alternation, Concat, KleeneStar, type RegularPathExpr } from \"./pattern.js\";\n\n// -- Algebraic simplification -------------------------------------------------\n\nexport function simplifyExpr(expr: RegularPathExpr): RegularPathExpr {\n if (expr instanceof KleeneStar) {\n const inner = simplifyExpr(expr.inner);\n // (a*)* -> a*\n if (inner instanceof KleeneStar) {\n return inner;\n }\n return new KleeneStar(inner);\n }\n\n if (expr instanceof Alternation) {\n const left = simplifyExpr(expr.left);\n const right = simplifyExpr(expr.right);\n // a | a -> a\n if (left.equals(right)) {\n return left;\n }\n // a* | a -> a*\n if (left instanceof KleeneStar && left.inner.equals(right)) {\n return left;\n }\n // a | a* -> a*\n if (right instanceof KleeneStar && right.inner.equals(left)) {\n return right;\n }\n return new Alternation(left, right);\n }\n\n if (expr instanceof Concat) {\n const left = simplifyExpr(expr.left);\n const right = simplifyExpr(expr.right);\n // a* / a* -> a*\n if (\n left instanceof KleeneStar &&\n right instanceof KleeneStar &&\n left.inner.equals(right.inner)\n ) {\n return left;\n }\n return new Concat(left, right);\n }\n\n return expr;\n}\n\n// -- NFA types (shared with operators) ----------------------------------------\n\nexport interface NFAState {\n readonly id: number;\n}\n\nexport interface NFATransition {\n readonly from: number;\n readonly to: number;\n readonly label: string | null; // null = epsilon\n}\n\nexport interface NFA {\n readonly states: NFAState[];\n readonly transitions: NFATransition[];\n readonly startState: number;\n readonly acceptState: number;\n}\n\n// -- DFA types ----------------------------------------------------------------\n\n// A DFA state is a serialized frozenset of NFA state ids\nexport type DFAState = string;\nexport type DFATransitions = Map<string, Map<string, string>>;\n\nexport interface DFAResult {\n readonly transitions: DFATransitions;\n readonly startState: DFAState;\n readonly acceptStates: Set<DFAState>;\n}\n\n// -- Subset construction ------------------------------------------------------\n\nfunction serializeStateSet(states: Set<number>): DFAState {\n return [...states].sort((a, b) => a - b).join(\",\");\n}\n\nfunction epsilonClosure(nfa: NFA, states: Set<number>): Set<number> {\n const closure = new Set(states);\n const stack = [...states];\n while (stack.length > 0) {\n const current = stack.pop()!;\n for (const t of nfa.transitions) {\n if (t.from === current && t.label === null && !closure.has(t.to)) {\n closure.add(t.to);\n stack.push(t.to);\n }\n }\n }\n return closure;\n}\n\nfunction move(nfa: NFA, states: Set<number>, label: string): Set<number> {\n const result = new Set<number>();\n for (const t of nfa.transitions) {\n if (states.has(t.from) && t.label === label) {\n result.add(t.to);\n }\n }\n return result;\n}\n\nfunction getAlphabet(nfa: NFA): Set<string> {\n const alphabet = new Set<string>();\n for (const t of nfa.transitions) {\n if (t.label !== null) {\n alphabet.add(t.label);\n }\n }\n return alphabet;\n}\n\nexport function subsetConstruction(nfa: NFA): DFAResult {\n const alphabet = getAlphabet(nfa);\n const startClosure = epsilonClosure(nfa, new Set([nfa.startState]));\n const startState = serializeStateSet(startClosure);\n\n const transitions: DFATransitions = new Map();\n const acceptStates = new Set<DFAState>();\n\n // Map from serialized state set to the actual state set\n const unmarked: Array<[DFAState, Set<number>]> = [[startState, startClosure]];\n const marked = new Set<DFAState>();\n\n if (startClosure.has(nfa.acceptState)) {\n acceptStates.add(startState);\n }\n\n while (unmarked.length > 0) {\n const [dfaState, nfaStates] = unmarked.pop()!;\n if (marked.has(dfaState)) continue;\n marked.add(dfaState);\n\n for (const symbol of alphabet) {\n const moveResult = move(nfa, nfaStates, symbol);\n if (moveResult.size === 0) continue;\n\n const closure = epsilonClosure(nfa, moveResult);\n const targetState = serializeStateSet(closure);\n\n let stateTransitions = transitions.get(dfaState);\n if (!stateTransitions) {\n stateTransitions = new Map();\n transitions.set(dfaState, stateTransitions);\n }\n stateTransitions.set(symbol, targetState);\n\n if (closure.has(nfa.acceptState)) {\n acceptStates.add(targetState);\n }\n\n if (!marked.has(targetState)) {\n unmarked.push([targetState, closure]);\n }\n }\n }\n\n return { transitions, startState, acceptStates };\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Graph operators\n// 1:1 port of uqa/graph/operators.py\n\nimport type { PostingEntry } from \"../core/types.js\";\nimport { createPayload, createPostingEntry } from \"../core/types.js\";\nimport type { Vertex } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport { Operator } from \"../operators/base.js\";\nimport type { ExecutionContext } from \"../operators/base.js\";\nimport type { GraphStore } from \"../storage/abc/graph-store.js\";\nimport { GraphPostingList, createGraphPayload } from \"./posting-list.js\";\nimport type { GraphPattern, RegularPathExpr } from \"./pattern.js\";\nimport { Alternation, BoundedLabel, Concat, KleeneStar, Label } from \"./pattern.js\";\nimport type { NFATransition } from \"./rpq-optimizer.js\";\nimport { subsetConstruction } from \"./rpq-optimizer.js\";\nimport { CypherCompiler } from \"./cypher/compiler.js\";\n\n// -- TraverseOperator ---------------------------------------------------------\n\nexport class TraverseOperator extends Operator {\n readonly startVertex: number;\n readonly graph: string;\n readonly label: string | null;\n readonly maxHops: number;\n readonly vertexPredicate: ((v: Vertex) => boolean) | null;\n readonly score: number;\n\n constructor(\n startVertex: number,\n graph: string,\n label?: string | null,\n maxHops?: number,\n vertexPredicate?: ((v: Vertex) => boolean) | null,\n score?: number,\n ) {\n super();\n this.startVertex = startVertex;\n this.graph = graph;\n this.label = label ?? null;\n this.maxHops = maxHops ?? Infinity;\n this.vertexPredicate = vertexPredicate ?? null;\n this.score = score ?? 1.0;\n }\n\n execute(context: ExecutionContext): PostingList {\n const store = context.graphStore as GraphStore;\n const graphName = this.graph;\n\n const visited = new Set<number>();\n const entries: PostingEntry[] = [];\n\n // BFS\n const queue: Array<[number, number]> = [[this.startVertex, 0]];\n visited.add(this.startVertex);\n\n const allVertices = new Set<number>();\n const allEdges = new Set<number>();\n\n while (queue.length > 0) {\n const [current, depth] = queue.shift()!;\n\n const vertex = store.getVertex(current);\n if (!vertex) continue;\n\n if (this.vertexPredicate && !this.vertexPredicate(vertex)) {\n continue;\n }\n\n allVertices.add(current);\n\n // Score decays with depth\n const depthScore = this.score / (1 + depth);\n entries.push(\n createPostingEntry(current, {\n score: depthScore,\n fields: { ...vertex.properties, _depth: depth },\n }),\n );\n\n if (depth < this.maxHops) {\n const neighbors = store.neighbors(current, graphName, this.label, \"out\");\n for (const neighborId of neighbors) {\n if (!visited.has(neighborId)) {\n visited.add(neighborId);\n queue.push([neighborId, depth + 1]);\n }\n }\n // Collect edges\n const outEdges = store.outEdgeIds(current, graphName);\n for (const eid of outEdges) {\n const edge = store.getEdge(eid);\n if (edge && (this.label === null || edge.label === this.label)) {\n allEdges.add(eid);\n }\n }\n }\n }\n\n const gpl = new GraphPostingList(entries);\n for (const entry of entries) {\n gpl.setGraphPayload(\n entry.docId,\n createGraphPayload({\n subgraphVertices: allVertices,\n subgraphEdges: allEdges,\n score: entry.payload.score,\n graphName,\n }),\n );\n }\n return gpl;\n }\n}\n\n// -- PatternMatchOperator -----------------------------------------------------\n\nexport class PatternMatchOperator extends Operator {\n readonly pattern: GraphPattern;\n readonly graph: string;\n readonly score: number;\n\n constructor(pattern: GraphPattern, graph: string, score?: number) {\n super();\n this.pattern = pattern;\n this.graph = graph;\n this.score = score ?? 1.0;\n }\n\n execute(context: ExecutionContext): PostingList {\n const store = context.graphStore as GraphStore;\n const results = this._backtrackSearch(store);\n return this._buildPostingList(store, results);\n }\n\n private _backtrackSearch(store: GraphStore): Array<Map<string, number>> {\n const candidates = this._computeCandidates(store);\n const results: Array<Map<string, number>> = [];\n const assignment = new Map<string, number>();\n const variables = this.pattern.vertexPatterns.map((vp) => vp.variable);\n\n this._backtrack(store, variables, 0, assignment, candidates, results);\n return results;\n }\n\n private _computeCandidates(store: GraphStore): Map<string, Set<number>> {\n const candidates = new Map<string, Set<number>>();\n const allVertexIds = store.vertexIdsInGraph(this.graph);\n\n for (const vp of this.pattern.vertexPatterns) {\n let candidateSet = new Set(allVertexIds);\n\n // Apply vertex constraints to filter candidates\n if (vp.constraints.length > 0) {\n const filtered = new Set<number>();\n for (const vid of candidateSet) {\n const vertex = store.getVertex(vid);\n if (vertex) {\n let valid = true;\n for (const constraint of vp.constraints) {\n if (!constraint(vertex)) {\n valid = false;\n break;\n }\n }\n if (valid) {\n filtered.add(vid);\n }\n }\n }\n candidateSet = filtered;\n }\n\n candidates.set(vp.variable, candidateSet);\n }\n\n // Arc consistency: prune candidates based on edge patterns\n let changed = true;\n while (changed) {\n changed = false;\n for (const ep of this.pattern.edgePatterns) {\n if (ep.negated) continue;\n const srcCandidates = candidates.get(ep.sourceVar);\n const tgtCandidates = candidates.get(ep.targetVar);\n if (!srcCandidates || !tgtCandidates) continue;\n\n // Filter source candidates\n const validSources = new Set<number>();\n for (const srcId of srcCandidates) {\n const neighbors = store.neighbors(srcId, this.graph, ep.label, \"out\");\n let hasValid = false;\n for (const nid of neighbors) {\n if (tgtCandidates.has(nid)) {\n hasValid = true;\n break;\n }\n }\n if (hasValid) {\n validSources.add(srcId);\n }\n }\n if (validSources.size < srcCandidates.size) {\n candidates.set(ep.sourceVar, validSources);\n changed = true;\n }\n\n // Filter target candidates\n const validTargets = new Set<number>();\n for (const tgtId of tgtCandidates) {\n const neighbors = store.neighbors(tgtId, this.graph, ep.label, \"in\");\n let hasValid = false;\n for (const nid of neighbors) {\n if (validSources.has(nid)) {\n hasValid = true;\n break;\n }\n }\n if (hasValid) {\n validTargets.add(tgtId);\n }\n }\n if (validTargets.size < tgtCandidates.size) {\n candidates.set(ep.targetVar, validTargets);\n changed = true;\n }\n }\n }\n\n return candidates;\n }\n\n private _backtrack(\n store: GraphStore,\n variables: string[],\n index: number,\n assignment: Map<string, number>,\n candidates: Map<string, Set<number>>,\n results: Array<Map<string, number>>,\n ): void {\n if (index === variables.length) {\n // Validate all edges\n if (\n this._validateAllEdges(store, assignment) &&\n this._checkNegatedEdges(store, assignment)\n ) {\n results.push(new Map(assignment));\n }\n return;\n }\n\n // MRV: pick variable with smallest remaining domain\n let bestIdx = index;\n let bestSize = Infinity;\n for (let i = index; i < variables.length; i++) {\n const v = variables[i]!;\n const cands = candidates.get(v);\n const size = cands ? cands.size : 0;\n if (size < bestSize) {\n bestSize = size;\n bestIdx = i;\n }\n }\n\n // Swap\n if (bestIdx !== index) {\n const tmp = variables[index]!;\n variables[index] = variables[bestIdx]!;\n variables[bestIdx] = tmp;\n }\n\n const variable = variables[index]!;\n const candidateSet = candidates.get(variable) ?? new Set<number>();\n const usedVertices = new Set(assignment.values());\n\n for (const vid of candidateSet) {\n // Ensure injective mapping (no two pattern variables map to same vertex)\n if (usedVertices.has(vid)) continue;\n\n assignment.set(variable, vid);\n\n // Check edges for assigned variables only\n if (this._validateEdgesFor(store, assignment, variable)) {\n this._backtrack(store, variables, index + 1, assignment, candidates, results);\n }\n\n assignment.delete(variable);\n }\n }\n\n private _validateEdgesFor(\n store: GraphStore,\n assignment: Map<string, number>,\n variable: string,\n ): boolean {\n for (const ep of this.pattern.edgePatterns) {\n if (ep.negated) continue;\n if (ep.sourceVar !== variable && ep.targetVar !== variable) continue;\n\n const srcId = assignment.get(ep.sourceVar);\n const tgtId = assignment.get(ep.targetVar);\n if (srcId === undefined || tgtId === undefined) continue;\n\n // Check that an edge with the given label exists\n const neighbors = store.neighbors(srcId, this.graph, ep.label, \"out\");\n if (!neighbors.includes(tgtId)) {\n // Also check edge constraints\n return false;\n }\n\n // Check edge constraints\n if (ep.constraints.length > 0) {\n const outEdges = store.outEdgeIds(srcId, this.graph);\n let found = false;\n for (const eid of outEdges) {\n const edge = store.getEdge(eid);\n if (\n edge &&\n edge.targetId === tgtId &&\n (ep.label === null || edge.label === ep.label)\n ) {\n let valid = true;\n for (const constraint of ep.constraints) {\n if (!constraint(edge)) {\n valid = false;\n break;\n }\n }\n if (valid) {\n found = true;\n break;\n }\n }\n }\n if (!found) return false;\n }\n }\n return true;\n }\n\n private _validateAllEdges(\n store: GraphStore,\n assignment: Map<string, number>,\n ): boolean {\n for (const ep of this.pattern.edgePatterns) {\n if (ep.negated) continue;\n const srcId = assignment.get(ep.sourceVar);\n const tgtId = assignment.get(ep.targetVar);\n if (srcId === undefined || tgtId === undefined) return false;\n\n const neighbors = store.neighbors(srcId, this.graph, ep.label, \"out\");\n if (!neighbors.includes(tgtId)) return false;\n\n if (ep.constraints.length > 0) {\n const outEdges = store.outEdgeIds(srcId, this.graph);\n let found = false;\n for (const eid of outEdges) {\n const edge = store.getEdge(eid);\n if (\n edge &&\n edge.targetId === tgtId &&\n (ep.label === null || edge.label === ep.label)\n ) {\n let valid = true;\n for (const constraint of ep.constraints) {\n if (!constraint(edge)) {\n valid = false;\n break;\n }\n }\n if (valid) {\n found = true;\n break;\n }\n }\n }\n if (!found) return false;\n }\n }\n return true;\n }\n\n private _checkNegatedEdges(\n store: GraphStore,\n assignment: Map<string, number>,\n ): boolean {\n for (const ep of this.pattern.edgePatterns) {\n if (!ep.negated) continue;\n const srcId = assignment.get(ep.sourceVar);\n const tgtId = assignment.get(ep.targetVar);\n if (srcId === undefined || tgtId === undefined) continue;\n\n const neighbors = store.neighbors(srcId, this.graph, ep.label, \"out\");\n if (neighbors.includes(tgtId)) {\n return false;\n }\n }\n return true;\n }\n\n private _collectMatchEdges(\n store: GraphStore,\n assignment: Map<string, number>,\n ): Set<number> {\n const edgeIds = new Set<number>();\n for (const ep of this.pattern.edgePatterns) {\n if (ep.negated) continue;\n const srcId = assignment.get(ep.sourceVar);\n const tgtId = assignment.get(ep.targetVar);\n if (srcId === undefined || tgtId === undefined) continue;\n\n const outEdges = store.outEdgeIds(srcId, this.graph);\n for (const eid of outEdges) {\n const edge = store.getEdge(eid);\n if (\n edge &&\n edge.targetId === tgtId &&\n (ep.label === null || edge.label === ep.label)\n ) {\n edgeIds.add(eid);\n }\n }\n }\n return edgeIds;\n }\n\n private _buildPostingList(\n store: GraphStore,\n results: Array<Map<string, number>>,\n ): GraphPostingList {\n const entries: PostingEntry[] = [];\n const graphPayloads = new Map<number, ReturnType<typeof createGraphPayload>>();\n\n for (let i = 0; i < results.length; i++) {\n const assignment = results[i]!;\n const vertexIds = new Set(assignment.values());\n const edgeIds = this._collectMatchEdges(store, assignment);\n\n const docId = i;\n const fields: Record<string, unknown> = {};\n for (const [variable, vid] of assignment) {\n fields[variable] = vid;\n }\n\n entries.push(\n createPostingEntry(docId, {\n score: this.score,\n fields,\n }),\n );\n\n graphPayloads.set(\n docId,\n createGraphPayload({\n subgraphVertices: vertexIds,\n subgraphEdges: edgeIds,\n score: this.score,\n graphName: this.graph,\n }),\n );\n }\n\n const gpl = new GraphPostingList(entries);\n for (const [docId, gp] of graphPayloads) {\n gpl.setGraphPayload(docId, gp);\n }\n return gpl;\n }\n}\n\n// -- RegularPathQueryOperator -------------------------------------------------\n\ninterface _NFAState {\n readonly id: number;\n}\n\ninterface _NFA {\n readonly states: _NFAState[];\n readonly transitions: NFATransition[];\n readonly startState: number;\n readonly acceptState: number;\n}\n\nlet _nfaStateCounter = 0;\n\nfunction _newState(): _NFAState {\n return { id: _nfaStateCounter++ };\n}\n\nfunction _resetNfaCounter(): void {\n _nfaStateCounter = 0;\n}\n\nfunction _buildNfa(expr: RegularPathExpr): _NFA {\n if (expr instanceof Label) {\n const start = _newState();\n const accept = _newState();\n return {\n states: [start, accept],\n transitions: [{ from: start.id, to: accept.id, label: expr.name }],\n startState: start.id,\n acceptState: accept.id,\n };\n }\n\n if (expr instanceof Concat) {\n const left = _buildNfa(expr.left);\n const right = _buildNfa(expr.right);\n // Connect left accept to right start with epsilon\n const transitions = [\n ...left.transitions,\n ...right.transitions,\n { from: left.acceptState, to: right.startState, label: null as string | null },\n ];\n return {\n states: [...left.states, ...right.states],\n transitions,\n startState: left.startState,\n acceptState: right.acceptState,\n };\n }\n\n if (expr instanceof Alternation) {\n const start = _newState();\n const accept = _newState();\n const left = _buildNfa(expr.left);\n const right = _buildNfa(expr.right);\n const transitions: NFATransition[] = [\n ...left.transitions,\n ...right.transitions,\n { from: start.id, to: left.startState, label: null },\n { from: start.id, to: right.startState, label: null },\n { from: left.acceptState, to: accept.id, label: null },\n { from: right.acceptState, to: accept.id, label: null },\n ];\n return {\n states: [start, accept, ...left.states, ...right.states],\n transitions,\n startState: start.id,\n acceptState: accept.id,\n };\n }\n\n if (expr instanceof KleeneStar) {\n const start = _newState();\n const accept = _newState();\n const inner = _buildNfa(expr.inner);\n const transitions: NFATransition[] = [\n ...inner.transitions,\n { from: start.id, to: inner.startState, label: null },\n { from: start.id, to: accept.id, label: null },\n { from: inner.acceptState, to: inner.startState, label: null },\n { from: inner.acceptState, to: accept.id, label: null },\n ];\n return {\n states: [start, accept, ...inner.states],\n transitions,\n startState: start.id,\n acceptState: accept.id,\n };\n }\n\n if (expr instanceof BoundedLabel) {\n // Expand bounded into concat of copies\n // a{m,n} = a/a/.../a (m times) / (epsilon | a) / ... (n-m times)\n if (expr.minCount === 0 && expr.maxCount === 0) {\n // epsilon\n const start = _newState();\n return {\n states: [start],\n transitions: [],\n startState: start.id,\n acceptState: start.id,\n };\n }\n\n let current: _NFA | null = null;\n\n // Build required repetitions\n for (let i = 0; i < expr.minCount; i++) {\n const copy = _buildNfa(new Label(expr.name));\n if (current === null) {\n current = copy;\n } else {\n const transitions: NFATransition[] = [\n ...current.transitions,\n ...copy.transitions,\n { from: current.acceptState, to: copy.startState, label: null },\n ];\n current = {\n states: [...current.states, ...copy.states],\n transitions,\n startState: current.startState,\n acceptState: copy.acceptState,\n };\n }\n }\n\n // Build optional repetitions\n for (let i = expr.minCount; i < expr.maxCount; i++) {\n const copy = _buildNfa(new Label(expr.name));\n if (current === null) {\n // min = 0, first optional\n const start = _newState();\n const accept = _newState();\n const transitions: NFATransition[] = [\n ...copy.transitions,\n { from: start.id, to: copy.startState, label: null },\n { from: start.id, to: accept.id, label: null },\n { from: copy.acceptState, to: accept.id, label: null },\n ];\n current = {\n states: [start, accept, ...copy.states],\n transitions,\n startState: start.id,\n acceptState: accept.id,\n };\n } else {\n // Add optional step\n const accept = _newState();\n const transitions: NFATransition[] = [\n ...current.transitions,\n ...copy.transitions,\n { from: current.acceptState, to: copy.startState, label: null },\n { from: current.acceptState, to: accept.id, label: null },\n { from: copy.acceptState, to: accept.id, label: null },\n ];\n current = {\n states: [...current.states, accept, ...copy.states],\n transitions,\n startState: current.startState,\n acceptState: accept.id,\n };\n }\n }\n\n if (current === null) {\n const start = _newState();\n return {\n states: [start],\n transitions: [],\n startState: start.id,\n acceptState: start.id,\n };\n }\n\n return current;\n }\n\n throw new Error(`Unsupported RPQ expression type: ${String(expr)}`);\n}\n\nexport class RegularPathQueryOperator extends Operator {\n readonly pathExpr: RegularPathExpr;\n readonly graph: string;\n readonly startVertex: number | null;\n readonly score: number;\n\n constructor(\n pathExpr: RegularPathExpr,\n graph: string,\n startVertex?: number | null,\n score?: number,\n ) {\n super();\n this.pathExpr = pathExpr;\n this.graph = graph;\n this.startVertex = startVertex ?? null;\n this.score = score ?? 1.0;\n }\n\n execute(context: ExecutionContext): PostingList {\n const store = context.graphStore as GraphStore;\n\n // Try index lookup first\n const indexResult = this._tryIndexLookup(context, store);\n if (indexResult !== null) return indexResult;\n\n // Build NFA and convert to DFA\n _resetNfaCounter();\n const nfa = _buildNfa(this.pathExpr);\n const dfa = subsetConstruction(nfa);\n\n const entries: PostingEntry[] = [];\n const graphPayloads = new Map<number, ReturnType<typeof createGraphPayload>>();\n const seenPairs = new Set<string>();\n\n const startVertices: number[] = [];\n if (this.startVertex !== null) {\n startVertices.push(this.startVertex);\n } else {\n const allVids = store.vertexIdsInGraph(this.graph);\n for (const vid of allVids) {\n startVertices.push(vid);\n }\n }\n\n let docIdCounter = 0;\n\n for (const startVid of startVertices) {\n const reachable = this._simulateDfa(store, dfa, startVid);\n\n for (const [endVid, pathEdges] of reachable) {\n const pairKey = `${String(startVid)}-${String(endVid)}`;\n if (seenPairs.has(pairKey)) continue;\n seenPairs.add(pairKey);\n\n const docId = docIdCounter++;\n entries.push(\n createPostingEntry(docId, {\n score: this.score,\n fields: {\n start: startVid,\n end: endVid,\n },\n }),\n );\n\n graphPayloads.set(\n docId,\n createGraphPayload({\n subgraphVertices: new Set([startVid, endVid]),\n subgraphEdges: pathEdges,\n score: this.score,\n graphName: this.graph,\n }),\n );\n }\n }\n\n const gpl = new GraphPostingList(entries);\n for (const [docId, gp] of graphPayloads) {\n gpl.setGraphPayload(docId, gp);\n }\n return gpl;\n }\n\n private _simulateDfa(\n store: GraphStore,\n dfa: {\n transitions: Map<string, Map<string, string>>;\n startState: string;\n acceptStates: Set<string>;\n },\n startVid: number,\n ): Array<[number, Set<number>]> {\n const results: Array<[number, Set<number>]> = [];\n\n // BFS over (vertex, dfaState) pairs\n type SearchState = [number, string, Set<number>]; // [vertexId, dfaState, edgeIds]\n const queue: SearchState[] = [[startVid, dfa.startState, new Set()]];\n const visited = new Set<string>();\n visited.add(`${String(startVid)}:${dfa.startState}`);\n\n // Check if start state is accepting (epsilon path)\n if (dfa.acceptStates.has(dfa.startState)) {\n results.push([startVid, new Set()]);\n }\n\n while (queue.length > 0) {\n const [vid, dfaState, edgesSoFar] = queue.shift()!;\n const stateTransitions = dfa.transitions.get(dfaState);\n if (!stateTransitions) continue;\n\n for (const [label, nextDfaState] of stateTransitions) {\n // Find edges with this label from current vertex\n const outEdges = store.outEdgeIds(vid, this.graph);\n for (const eid of outEdges) {\n const edge = store.getEdge(eid);\n if (!edge || edge.label !== label) continue;\n\n const targetVid = edge.targetId;\n const visitKey = `${String(targetVid)}:${nextDfaState}`;\n if (visited.has(visitKey)) continue;\n visited.add(visitKey);\n\n const newEdges = new Set(edgesSoFar);\n newEdges.add(eid);\n\n if (dfa.acceptStates.has(nextDfaState)) {\n results.push([targetVid, newEdges]);\n }\n\n queue.push([targetVid, nextDfaState, newEdges]);\n }\n }\n }\n\n return results;\n }\n\n private _tryIndexLookup(\n context: ExecutionContext,\n _store: GraphStore,\n ): GraphPostingList | null {\n const pathIndex = context.pathIndex as\n | {\n hasPath?(labels: string[], graphName: string): boolean;\n lookup?(labels: string[], graphName: string): Array<[number, number]>;\n }\n | null\n | undefined;\n\n if (!pathIndex || !pathIndex.hasPath || !pathIndex.lookup) return null;\n\n const labels = this._extractLabelSequence(this.pathExpr);\n if (labels === null) return null;\n\n if (!pathIndex.hasPath(labels, this.graph)) return null;\n\n const pairs = pathIndex.lookup(labels, this.graph);\n const entries: PostingEntry[] = [];\n let docId = 0;\n\n for (const [startVid, endVid] of pairs) {\n if (this.startVertex !== null && startVid !== this.startVertex) continue;\n entries.push(\n createPostingEntry(docId, {\n score: this.score,\n fields: { start: startVid, end: endVid },\n }),\n );\n docId++;\n }\n\n return new GraphPostingList(entries);\n }\n\n private _extractLabelSequence(expr: RegularPathExpr): string[] | null {\n if (expr instanceof Label) {\n return [expr.name];\n }\n if (expr instanceof Concat) {\n const left = this._extractLabelSequence(expr.left);\n const right = this._extractLabelSequence(expr.right);\n if (left !== null && right !== null) {\n return [...left, ...right];\n }\n }\n return null;\n }\n}\n\n// -- VertexAggregationOperator ------------------------------------------------\n\nexport class VertexAggregationOperator extends Operator {\n readonly source: Operator;\n readonly propertyName: string;\n readonly aggFn: (values: number[]) => number;\n\n constructor(\n source: Operator,\n propertyName: string,\n aggFn?: (values: number[]) => number,\n ) {\n super();\n this.source = source;\n this.propertyName = propertyName;\n this.aggFn =\n aggFn ??\n ((vals: number[]) => {\n if (vals.length === 0) return 0;\n let s = 0;\n for (let i = 0; i < vals.length; i++) {\n s += vals[i]!;\n }\n return s / vals.length;\n });\n }\n\n execute(context: ExecutionContext): PostingList {\n const store = context.graphStore as GraphStore;\n const sourceResult = this.source.execute(context);\n\n const values: number[] = [];\n for (const entry of sourceResult) {\n const vertex = store.getVertex(entry.docId);\n if (vertex) {\n const prop = vertex.properties[this.propertyName];\n if (typeof prop === \"number\") {\n values.push(prop);\n }\n }\n }\n\n const aggregated = this.aggFn(values);\n\n const entries: PostingEntry[] = [];\n for (const entry of sourceResult) {\n entries.push({\n docId: entry.docId,\n payload: createPayload({\n positions: entry.payload.positions,\n score: aggregated,\n fields: {\n ...(entry.payload.fields as Record<string, unknown>),\n _aggregated: aggregated,\n _property: this.propertyName,\n },\n }),\n });\n }\n\n return new PostingList(entries);\n }\n}\n\n// -- WeightedPathQueryOperator ------------------------------------------------\n\n/**\n * Weighted regular path query: finds paths matching a regular expression\n * with associated edge weights. The score of each result path is the\n * aggregation (sum/min/max/product) of edge weights along the path.\n */\nexport class WeightedPathQueryOperator extends Operator {\n readonly pathExpr: RegularPathExpr;\n readonly graph: string;\n readonly startVertex: number | null;\n readonly weightProperty: string;\n readonly aggregation: \"sum\" | \"min\" | \"max\" | \"product\";\n readonly weightThreshold: number | null;\n readonly score: number;\n\n constructor(\n pathExpr: RegularPathExpr,\n graph: string,\n opts?: {\n startVertex?: number | null;\n weightProperty?: string;\n aggregation?: \"sum\" | \"min\" | \"max\" | \"product\";\n weightThreshold?: number | null;\n score?: number;\n },\n ) {\n super();\n this.pathExpr = pathExpr;\n this.graph = graph;\n this.startVertex = opts?.startVertex ?? null;\n this.weightProperty = opts?.weightProperty ?? \"weight\";\n this.aggregation = opts?.aggregation ?? \"sum\";\n this.weightThreshold = opts?.weightThreshold ?? null;\n this.score = opts?.score ?? 1.0;\n }\n\n execute(context: ExecutionContext): PostingList {\n const store = context.graphStore as GraphStore;\n\n // Build NFA and convert to DFA\n _resetNfaCounter();\n const nfa = _buildNfa(this.pathExpr);\n const dfa = subsetConstruction(nfa);\n\n const entries: PostingEntry[] = [];\n const graphPayloads = new Map<number, ReturnType<typeof createGraphPayload>>();\n const seenPairs = new Set<string>();\n\n const startVertices: number[] = [];\n if (this.startVertex !== null) {\n startVertices.push(this.startVertex);\n } else {\n const allVids = store.vertexIdsInGraph(this.graph);\n for (const vid of allVids) {\n startVertices.push(vid);\n }\n }\n\n let docIdCounter = 0;\n\n for (const startVid of startVertices) {\n const reachable = this._simulateWeightedDfa(store, dfa, startVid);\n\n for (const [endVid, pathEdges, pathWeight] of reachable) {\n // Apply weight threshold\n if (this.weightThreshold !== null && pathWeight < this.weightThreshold) {\n continue;\n }\n\n const pairKey = `${String(startVid)}-${String(endVid)}`;\n if (seenPairs.has(pairKey)) continue;\n seenPairs.add(pairKey);\n\n const docId = docIdCounter++;\n entries.push(\n createPostingEntry(docId, {\n score: pathWeight * this.score,\n fields: {\n start: startVid,\n end: endVid,\n weight: pathWeight,\n path_length: pathEdges.size,\n },\n }),\n );\n\n graphPayloads.set(\n docId,\n createGraphPayload({\n subgraphVertices: new Set([startVid, endVid]),\n subgraphEdges: pathEdges,\n score: pathWeight * this.score,\n graphName: this.graph,\n }),\n );\n }\n }\n\n const gpl = new GraphPostingList(entries);\n for (const [docId, gp] of graphPayloads) {\n gpl.setGraphPayload(docId, gp);\n }\n return gpl;\n }\n\n private _simulateWeightedDfa(\n store: GraphStore,\n dfa: {\n transitions: Map<string, Map<string, string>>;\n startState: string;\n acceptStates: Set<string>;\n },\n startVid: number,\n ): Array<[number, Set<number>, number]> {\n const results: Array<[number, Set<number>, number]> = [];\n\n // BFS over (vertex, dfaState, edges, weight) tuples\n type SearchState = [number, string, Set<number>, number];\n const initWeight = this.aggregation === \"product\" ? 1.0 : 0.0;\n const queue: SearchState[] = [[startVid, dfa.startState, new Set(), initWeight]];\n const visited = new Set<string>();\n visited.add(`${String(startVid)}:${dfa.startState}`);\n\n // Check if start state is accepting\n if (dfa.acceptStates.has(dfa.startState)) {\n results.push([startVid, new Set(), initWeight]);\n }\n\n while (queue.length > 0) {\n const [vid, dfaState, edgesSoFar, weightSoFar] = queue.shift()!;\n const stateTransitions = dfa.transitions.get(dfaState);\n if (!stateTransitions) continue;\n\n for (const [label, nextDfaState] of stateTransitions) {\n const outEdges = store.outEdgeIds(vid, this.graph);\n for (const eid of outEdges) {\n const edge = store.getEdge(eid);\n if (!edge || edge.label !== label) continue;\n\n const targetVid = edge.targetId;\n const visitKey = `${String(targetVid)}:${nextDfaState}`;\n if (visited.has(visitKey)) continue;\n visited.add(visitKey);\n\n const newEdges = new Set(edgesSoFar);\n newEdges.add(eid);\n\n // Get edge weight\n const edgeWeight =\n typeof edge.properties[this.weightProperty] === \"number\"\n ? (edge.properties[this.weightProperty] as number)\n : 1.0;\n\n // Aggregate weight\n let newWeight: number;\n switch (this.aggregation) {\n case \"sum\":\n newWeight = weightSoFar + edgeWeight;\n break;\n case \"min\":\n newWeight =\n edgesSoFar.size === 0 ? edgeWeight : Math.min(weightSoFar, edgeWeight);\n break;\n case \"max\":\n newWeight = Math.max(weightSoFar, edgeWeight);\n break;\n case \"product\":\n newWeight = weightSoFar * edgeWeight;\n break;\n }\n\n if (dfa.acceptStates.has(nextDfaState)) {\n results.push([targetVid, newEdges, newWeight]);\n }\n\n queue.push([targetVid, nextDfaState, newEdges, newWeight]);\n }\n }\n }\n\n return results;\n }\n}\n\n// -- CypherQueryOperator ------------------------------------------------------\n\nexport class CypherQueryOperator extends Operator {\n readonly graph: string;\n readonly query: string;\n readonly graphName: string;\n readonly params: Record<string, unknown>;\n readonly colNames: string[];\n\n constructor(\n graph: string,\n query: string,\n graphName: string,\n params?: Record<string, unknown>,\n colNames?: string[],\n ) {\n super();\n this.graph = graph;\n this.query = query;\n this.graphName = graphName;\n this.params = params ?? {};\n this.colNames = colNames ?? [];\n }\n\n execute(context: ExecutionContext): PostingList {\n const store = context.graphStore as GraphStore;\n const compiler = new CypherCompiler(store, this.graphName, this.params);\n const gpl = compiler.executePostingList(this.query, this.params);\n return gpl.toPostingList();\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Temporal traverse operator\n// 1:1 port of uqa/graph/temporal_traverse.py\n\nimport type { PostingEntry, Vertex } from \"../core/types.js\";\nimport { createPostingEntry } from \"../core/types.js\";\nimport type { PostingList } from \"../core/posting-list.js\";\nimport { Operator } from \"../operators/base.js\";\nimport type { ExecutionContext } from \"../operators/base.js\";\nimport type { GraphStore } from \"../storage/abc/graph-store.js\";\nimport { GraphPostingList, createGraphPayload } from \"./posting-list.js\";\nimport type { TemporalFilter } from \"./temporal-filter.js\";\n\n// -- TemporalTraverseOperator -------------------------------------------------\n\nexport class TemporalTraverseOperator extends Operator {\n readonly startVertex: number;\n readonly graph: string;\n readonly temporalFilter: TemporalFilter;\n readonly label: string | null;\n readonly maxHops: number;\n readonly vertexPredicate: ((v: Vertex) => boolean) | null;\n readonly score: number;\n\n constructor(opts: {\n startVertex: number;\n graph: string;\n temporalFilter: TemporalFilter;\n label?: string | null;\n maxHops?: number;\n vertexPredicate?: ((v: Vertex) => boolean) | null;\n score?: number;\n }) {\n super();\n this.startVertex = opts.startVertex;\n this.graph = opts.graph;\n this.temporalFilter = opts.temporalFilter;\n this.label = opts.label ?? null;\n this.maxHops = opts.maxHops ?? Infinity;\n this.vertexPredicate = opts.vertexPredicate ?? null;\n this.score = opts.score ?? 1.0;\n }\n\n execute(context: ExecutionContext): PostingList {\n const store = context.graphStore as GraphStore;\n\n const visited = new Set<number>();\n const entries: PostingEntry[] = [];\n const allVertices = new Set<number>();\n const allEdges = new Set<number>();\n\n // BFS with temporal filtering on edges\n const queue: Array<[number, number]> = [[this.startVertex, 0]];\n visited.add(this.startVertex);\n\n while (queue.length > 0) {\n const [current, depth] = queue.shift()!;\n const vertex = store.getVertex(current);\n if (!vertex) continue;\n\n if (this.vertexPredicate && !this.vertexPredicate(vertex)) {\n continue;\n }\n\n allVertices.add(current);\n\n const depthScore = this.score / (1 + depth);\n entries.push(\n createPostingEntry(current, {\n score: depthScore,\n fields: { ...vertex.properties, _depth: depth },\n }),\n );\n\n if (depth < this.maxHops) {\n const outEdges = store.outEdgeIds(current, this.graph);\n for (const eid of outEdges) {\n const edge = store.getEdge(eid);\n if (!edge) continue;\n if (this.label !== null && edge.label !== this.label) continue;\n\n // Apply temporal filter\n if (!this.temporalFilter.isValid(edge)) continue;\n\n allEdges.add(eid);\n\n if (!visited.has(edge.targetId)) {\n visited.add(edge.targetId);\n queue.push([edge.targetId, depth + 1]);\n }\n }\n }\n }\n\n const gpl = new GraphPostingList(entries);\n for (const entry of entries) {\n gpl.setGraphPayload(\n entry.docId,\n createGraphPayload({\n subgraphVertices: allVertices,\n subgraphEdges: allEdges,\n score: entry.payload.score,\n graphName: this.graph,\n }),\n );\n }\n return gpl;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Temporal filter\n// 1:1 port of uqa/graph/temporal_filter.py\n\nimport type { Edge } from \"../core/types.js\";\n\n// -- TemporalFilter -----------------------------------------------------------\n\nexport class TemporalFilter {\n readonly timestamp: number | null;\n readonly timeRange: [number, number] | null;\n\n constructor(opts?: {\n timestamp?: number | null;\n timeRange?: [number, number] | null;\n }) {\n const ts = opts?.timestamp ?? null;\n const tr = opts?.timeRange ?? null;\n if (ts !== null && tr !== null) {\n throw new Error(\"TemporalFilter: timestamp and timeRange are mutually exclusive\");\n }\n this.timestamp = ts;\n this.timeRange = tr;\n }\n\n isValid(edge: Edge): boolean {\n // Support valid_from / valid_to range model on edges\n const validFrom = edge.properties[\"valid_from\"];\n const validTo = edge.properties[\"valid_to\"];\n const hasRange = typeof validFrom === \"number\" || typeof validTo === \"number\";\n\n if (hasRange) {\n return this._isValidRange(\n typeof validFrom === \"number\" ? validFrom : null,\n typeof validTo === \"number\" ? validTo : null,\n );\n }\n\n // Fall back to simple timestamp property\n const edgeTimestamp = edge.properties[\"timestamp\"];\n if (typeof edgeTimestamp !== \"number\") {\n // No temporal properties on edge: pass through\n return true;\n }\n\n if (this.timestamp !== null) {\n return edgeTimestamp <= this.timestamp;\n }\n\n if (this.timeRange !== null) {\n const [start, end] = this.timeRange;\n return edgeTimestamp >= start && edgeTimestamp <= end;\n }\n\n // No filter configured\n return true;\n }\n\n private _isValidRange(validFrom: number | null, validTo: number | null): boolean {\n if (this.timestamp !== null) {\n // Point-in-time query: timestamp must fall within [valid_from, valid_to]\n if (validFrom !== null && this.timestamp < validFrom) return false;\n if (validTo !== null && this.timestamp > validTo) return false;\n return true;\n }\n\n if (this.timeRange !== null) {\n // Range overlap: edge range [valid_from, valid_to] must overlap [start, end]\n const [start, end] = this.timeRange;\n if (validFrom !== null && validFrom > end) return false;\n if (validTo !== null && validTo < start) return false;\n return true;\n }\n\n // No filter: accept all\n return true;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Centrality operators\n// 1:1 port of uqa/graph/centrality.py\n\nimport type { PostingEntry } from \"../core/types.js\";\nimport { createPostingEntry } from \"../core/types.js\";\nimport type { PostingList } from \"../core/posting-list.js\";\nimport { Operator } from \"../operators/base.js\";\nimport type { ExecutionContext } from \"../operators/base.js\";\nimport type { GraphStore } from \"../storage/abc/graph-store.js\";\nimport { GraphPostingList, createGraphPayload } from \"./posting-list.js\";\n\n// -- PageRankOperator ---------------------------------------------------------\n\nexport class PageRankOperator extends Operator {\n readonly damping: number;\n readonly maxIterations: number;\n readonly tolerance: number;\n readonly graph: string;\n\n constructor(opts: {\n damping?: number;\n maxIterations?: number;\n tolerance?: number;\n graph: string;\n }) {\n super();\n this.damping = opts.damping ?? 0.85;\n this.maxIterations = opts.maxIterations ?? 100;\n this.tolerance = opts.tolerance ?? 1e-6;\n this.graph = opts.graph;\n }\n\n execute(context: ExecutionContext): PostingList {\n const store = context.graphStore as GraphStore;\n const vertexIds = [...store.vertexIdsInGraph(this.graph)];\n const n = vertexIds.length;\n if (n === 0) return new GraphPostingList();\n\n const vidToIdx = new Map<number, number>();\n for (let i = 0; i < vertexIds.length; i++) {\n vidToIdx.set(vertexIds[i]!, i);\n }\n\n // Initialize scores\n let scores = new Float64Array(n);\n scores.fill(1.0 / n);\n\n // Compute out-degree for each vertex\n const outDegree = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n const vid = vertexIds[i]!;\n const outEdges = store.outEdgeIds(vid, this.graph);\n outDegree[i] = outEdges.size;\n }\n\n // Iterative computation\n for (let iter = 0; iter < this.maxIterations; iter++) {\n const newScores = new Float64Array(n);\n newScores.fill((1.0 - this.damping) / n);\n\n for (let i = 0; i < n; i++) {\n const vid = vertexIds[i]!;\n if (outDegree[i]! === 0) {\n // Dangling node: distribute evenly\n const share = scores[i]! / n;\n for (let j = 0; j < n; j++) {\n newScores[j] = newScores[j]! + this.damping * share;\n }\n } else {\n const share = scores[i]! / outDegree[i]!;\n const neighbors = store.neighbors(vid, this.graph, null, \"out\");\n for (const nid of neighbors) {\n const nIdx = vidToIdx.get(nid);\n if (nIdx !== undefined) {\n newScores[nIdx] = newScores[nIdx]! + this.damping * share;\n }\n }\n }\n }\n\n // Check convergence\n let diff = 0;\n for (let i = 0; i < n; i++) {\n diff += Math.abs(newScores[i]! - scores[i]!);\n }\n\n scores = newScores;\n if (diff < this.tolerance) break;\n }\n\n // Build posting list\n const entries: PostingEntry[] = [];\n for (let i = 0; i < n; i++) {\n const vid = vertexIds[i]!;\n entries.push(\n createPostingEntry(vid, {\n score: scores[i]!,\n fields: { pagerank: scores[i]! },\n }),\n );\n }\n\n const allVertices = new Set(vertexIds);\n const gpl = new GraphPostingList(entries);\n for (const entry of entries) {\n gpl.setGraphPayload(\n entry.docId,\n createGraphPayload({\n subgraphVertices: allVertices,\n subgraphEdges: new Set(),\n score: entry.payload.score,\n graphName: this.graph,\n }),\n );\n }\n return gpl;\n }\n}\n\n// -- HITSOperator -------------------------------------------------------------\n\nexport class HITSOperator extends Operator {\n readonly maxIterations: number;\n readonly tolerance: number;\n readonly graph: string;\n\n constructor(opts: { maxIterations?: number; tolerance?: number; graph: string }) {\n super();\n this.maxIterations = opts.maxIterations ?? 100;\n this.tolerance = opts.tolerance ?? 1e-6;\n this.graph = opts.graph;\n }\n\n execute(context: ExecutionContext): PostingList {\n const store = context.graphStore as GraphStore;\n const vertexIds = [...store.vertexIdsInGraph(this.graph)];\n const n = vertexIds.length;\n if (n === 0) return new GraphPostingList();\n\n const vidToIdx = new Map<number, number>();\n for (let i = 0; i < vertexIds.length; i++) {\n vidToIdx.set(vertexIds[i]!, i);\n }\n\n let hub = new Float64Array(n);\n let auth = new Float64Array(n);\n hub.fill(1.0);\n auth.fill(1.0);\n\n for (let iter = 0; iter < this.maxIterations; iter++) {\n const newAuth = new Float64Array(n);\n const newHub = new Float64Array(n);\n\n // Authority update: auth(v) = sum of hub(u) for all u -> v\n for (let i = 0; i < n; i++) {\n const vid = vertexIds[i]!;\n const inNeighbors = store.neighbors(vid, this.graph, null, \"in\");\n let s = 0;\n for (const nid of inNeighbors) {\n const nIdx = vidToIdx.get(nid);\n if (nIdx !== undefined) {\n s += hub[nIdx]!;\n }\n }\n newAuth[i] = s;\n }\n\n // Hub update: hub(v) = sum of auth(u) for all v -> u\n for (let i = 0; i < n; i++) {\n const vid = vertexIds[i]!;\n const outNeighbors = store.neighbors(vid, this.graph, null, \"out\");\n let s = 0;\n for (const nid of outNeighbors) {\n const nIdx = vidToIdx.get(nid);\n if (nIdx !== undefined) {\n s += newAuth[nIdx]!;\n }\n }\n newHub[i] = s;\n }\n\n // Normalize\n let authNorm = 0;\n let hubNorm = 0;\n for (let i = 0; i < n; i++) {\n authNorm += newAuth[i]! * newAuth[i]!;\n hubNorm += newHub[i]! * newHub[i]!;\n }\n authNorm = Math.sqrt(authNorm);\n hubNorm = Math.sqrt(hubNorm);\n\n if (authNorm > 0) {\n for (let i = 0; i < n; i++) {\n newAuth[i] = newAuth[i]! / authNorm;\n }\n }\n if (hubNorm > 0) {\n for (let i = 0; i < n; i++) {\n newHub[i] = newHub[i]! / hubNorm;\n }\n }\n\n // Check convergence\n let diff = 0;\n for (let i = 0; i < n; i++) {\n diff += Math.abs(newAuth[i]! - auth[i]!);\n diff += Math.abs(newHub[i]! - hub[i]!);\n }\n\n auth = newAuth;\n hub = newHub;\n if (diff < this.tolerance) break;\n }\n\n const entries: PostingEntry[] = [];\n for (let i = 0; i < n; i++) {\n const vid = vertexIds[i]!;\n // Combined score: authority + hub\n const score = auth[i]! + hub[i]!;\n entries.push(\n createPostingEntry(vid, {\n score,\n fields: { authority: auth[i]!, hub: hub[i]! },\n }),\n );\n }\n\n const allVertices = new Set(vertexIds);\n const gpl = new GraphPostingList(entries);\n for (const entry of entries) {\n gpl.setGraphPayload(\n entry.docId,\n createGraphPayload({\n subgraphVertices: allVertices,\n subgraphEdges: new Set(),\n score: entry.payload.score,\n graphName: this.graph,\n }),\n );\n }\n return gpl;\n }\n}\n\n// -- BetweennessCentralityOperator --------------------------------------------\n\nexport class BetweennessCentralityOperator extends Operator {\n readonly graph: string;\n\n constructor(opts: { graph: string }) {\n super();\n this.graph = opts.graph;\n }\n\n execute(context: ExecutionContext): PostingList {\n const store = context.graphStore as GraphStore;\n const vertexIds = [...store.vertexIdsInGraph(this.graph)];\n const n = vertexIds.length;\n if (n === 0) return new GraphPostingList();\n\n const vidToIdx = new Map<number, number>();\n for (let i = 0; i < vertexIds.length; i++) {\n vidToIdx.set(vertexIds[i]!, i);\n }\n\n // Brandes algorithm\n const centrality = new Float64Array(n);\n\n for (let s = 0; s < n; s++) {\n const stack: number[] = [];\n const predecessors: Set<number>[] = new Array<Set<number>>(n);\n for (let i = 0; i < n; i++) {\n predecessors[i] = new Set();\n }\n\n const sigma = new Float64Array(n);\n sigma[s] = 1.0;\n\n const dist = new Float64Array(n);\n dist.fill(-1);\n dist[s] = 0;\n\n // BFS\n const queue: number[] = [s];\n let qIdx = 0;\n\n while (qIdx < queue.length) {\n const v = queue[qIdx]!;\n qIdx++;\n stack.push(v);\n\n const vid = vertexIds[v]!;\n const neighbors = store.neighbors(vid, this.graph, null, \"out\");\n const inNeighbors = store.neighbors(vid, this.graph, null, \"in\");\n const allNeighborIds = new Set([...neighbors, ...inNeighbors]);\n\n for (const nid of allNeighborIds) {\n const w = vidToIdx.get(nid);\n if (w === undefined) continue;\n\n // w found for first time?\n if (dist[w]! < 0) {\n queue.push(w);\n dist[w] = dist[v]! + 1;\n }\n // Shortest path to w via v?\n if (dist[w]! === dist[v]! + 1) {\n sigma[w] = sigma[w]! + sigma[v]!;\n predecessors[w]!.add(v);\n }\n }\n }\n\n // Accumulation\n const delta = new Float64Array(n);\n while (stack.length > 0) {\n const w = stack.pop()!;\n for (const v of predecessors[w]!) {\n delta[v] = delta[v]! + (sigma[v]! / sigma[w]!) * (1.0 + delta[w]!);\n }\n if (w !== s) {\n centrality[w] = centrality[w]! + delta[w]!;\n }\n }\n }\n\n // Normalize for undirected (divide by 2)\n for (let i = 0; i < n; i++) {\n centrality[i] = centrality[i]! / 2.0;\n }\n\n const entries: PostingEntry[] = [];\n for (let i = 0; i < n; i++) {\n const vid = vertexIds[i]!;\n entries.push(\n createPostingEntry(vid, {\n score: centrality[i]!,\n fields: { betweenness: centrality[i]! },\n }),\n );\n }\n\n const allVertices = new Set(vertexIds);\n const gpl = new GraphPostingList(entries);\n for (const entry of entries) {\n gpl.setGraphPayload(\n entry.docId,\n createGraphPayload({\n subgraphVertices: allVertices,\n subgraphEdges: new Set(),\n score: entry.payload.score,\n graphName: this.graph,\n }),\n );\n }\n return gpl;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Message passing operator\n// 1:1 port of uqa/graph/message_passing.py\n\nimport type { PostingEntry } from \"../core/types.js\";\nimport { createPostingEntry } from \"../core/types.js\";\nimport type { PostingList } from \"../core/posting-list.js\";\nimport { Operator } from \"../operators/base.js\";\nimport type { ExecutionContext } from \"../operators/base.js\";\nimport type { GraphStore } from \"../storage/abc/graph-store.js\";\nimport { GraphPostingList, createGraphPayload } from \"./posting-list.js\";\n\n// -- MessagePassingOperator ---------------------------------------------------\n\nexport class MessagePassingOperator extends Operator {\n readonly kLayers: number;\n readonly aggregation: \"mean\" | \"sum\" | \"max\";\n readonly propertyName: string;\n readonly graph: string;\n\n constructor(opts: {\n kLayers?: number;\n aggregation?: \"mean\" | \"sum\" | \"max\";\n propertyName?: string;\n graph: string;\n }) {\n super();\n this.kLayers = opts.kLayers ?? 2;\n this.aggregation = opts.aggregation ?? \"mean\";\n this.propertyName = opts.propertyName ?? \"feature\";\n this.graph = opts.graph;\n }\n\n execute(context: ExecutionContext): PostingList {\n const store = context.graphStore as GraphStore;\n const vertexIds = [...store.vertexIdsInGraph(this.graph)];\n const n = vertexIds.length;\n if (n === 0) return new GraphPostingList();\n\n const vidToIdx = new Map<number, number>();\n for (let i = 0; i < vertexIds.length; i++) {\n vidToIdx.set(vertexIds[i]!, i);\n }\n\n // Initialize features from vertex properties\n let features = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n const vid = vertexIds[i]!;\n const vertex = store.getVertex(vid);\n if (vertex) {\n const prop = vertex.properties[this.propertyName];\n if (typeof prop === \"number\") {\n features[i] = prop;\n } else {\n features[i] = 0.0;\n }\n }\n }\n\n // Message passing iterations\n for (let layer = 0; layer < this.kLayers; layer++) {\n const newFeatures = new Float64Array(n);\n\n for (let i = 0; i < n; i++) {\n const vid = vertexIds[i]!;\n // Gather neighbor features\n const outNeighbors = store.neighbors(vid, this.graph, null, \"out\");\n const inNeighbors = store.neighbors(vid, this.graph, null, \"in\");\n const allNeighborIds = new Set([...outNeighbors, ...inNeighbors]);\n\n const neighborValues: number[] = [];\n for (const nid of allNeighborIds) {\n const nIdx = vidToIdx.get(nid);\n if (nIdx !== undefined) {\n neighborValues.push(features[nIdx]!);\n }\n }\n\n // Aggregate\n let aggregated: number;\n if (neighborValues.length === 0) {\n aggregated = features[i]!;\n } else if (this.aggregation === \"mean\") {\n let s = 0;\n for (const v of neighborValues) s += v;\n aggregated = s / neighborValues.length;\n } else if (this.aggregation === \"sum\") {\n let s = 0;\n for (const v of neighborValues) s += v;\n aggregated = s;\n } else {\n // max\n let mx = neighborValues[0]!;\n for (let j = 1; j < neighborValues.length; j++) {\n if (neighborValues[j]! > mx) mx = neighborValues[j]!;\n }\n aggregated = mx;\n }\n\n // Combine with self (GNN update rule: new_h = agg(neighbors) + self)\n newFeatures[i] = aggregated + features[i]!;\n }\n\n features = newFeatures;\n }\n\n // Sigmoid calibration\n for (let i = 0; i < n; i++) {\n features[i] = 1.0 / (1.0 + Math.exp(-features[i]!));\n }\n\n // Build posting list\n const entries: PostingEntry[] = [];\n for (let i = 0; i < n; i++) {\n const vid = vertexIds[i]!;\n entries.push(\n createPostingEntry(vid, {\n score: features[i]!,\n fields: { _mp_score: features[i]! },\n }),\n );\n }\n\n const allVertices = new Set(vertexIds);\n const gpl = new GraphPostingList(entries);\n for (const entry of entries) {\n gpl.setGraphPayload(\n entry.docId,\n createGraphPayload({\n subgraphVertices: allVertices,\n subgraphEdges: new Set(),\n score: entry.payload.score,\n graphName: this.graph,\n }),\n );\n }\n return gpl;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Graph embedding operator\n// 1:1 port of uqa/graph/graph_embedding.py\n\nimport type { PostingEntry } from \"../core/types.js\";\nimport { createPostingEntry } from \"../core/types.js\";\nimport type { PostingList } from \"../core/posting-list.js\";\nimport { Operator } from \"../operators/base.js\";\nimport type { ExecutionContext } from \"../operators/base.js\";\nimport type { GraphStore } from \"../storage/abc/graph-store.js\";\nimport { GraphPostingList, createGraphPayload } from \"./posting-list.js\";\n\n// -- GraphEmbeddingOperator ---------------------------------------------------\n// Produces structure-based graph embeddings using:\n// - Degree features\n// - Label distribution\n// - k-hop connectivity\n\nexport class GraphEmbeddingOperator extends Operator {\n readonly graph: string;\n readonly kHops: number;\n\n constructor(opts: { graph: string; kHops?: number }) {\n super();\n this.graph = opts.graph;\n this.kHops = opts.kHops ?? 2;\n }\n\n execute(context: ExecutionContext): PostingList {\n const store = context.graphStore as GraphStore;\n const vertexIds = [...store.vertexIdsInGraph(this.graph)];\n const n = vertexIds.length;\n if (n === 0) return new GraphPostingList();\n\n // Collect all labels for label distribution vector\n const labelCounts = store.vertexLabelCounts(this.graph);\n const allLabels = [...labelCounts.keys()].sort();\n const labelToIdx = new Map<string, number>();\n for (let i = 0; i < allLabels.length; i++) {\n labelToIdx.set(allLabels[i]!, i);\n }\n\n const entries: PostingEntry[] = [];\n const allVertexSet = new Set(vertexIds);\n\n for (const vid of vertexIds) {\n const vertex = store.getVertex(vid);\n if (!vertex) continue;\n\n // Feature 1: normalized degree\n const outEdges = store.outEdgeIds(vid, this.graph);\n const inEdges = store.inEdgeIds(vid, this.graph);\n const outDegree = outEdges.size;\n const inDegree = inEdges.size;\n const totalDegree = outDegree + inDegree;\n const normDegree = n > 1 ? totalDegree / (2 * (n - 1)) : 0;\n\n // Feature 2: label distribution of neighbors\n const labelDist = new Float64Array(allLabels.length);\n const neighbors = new Set<number>();\n for (const nid of store.neighbors(vid, this.graph, null, \"out\")) {\n neighbors.add(nid);\n }\n for (const nid of store.neighbors(vid, this.graph, null, \"in\")) {\n neighbors.add(nid);\n }\n\n if (neighbors.size > 0) {\n for (const nid of neighbors) {\n const nVertex = store.getVertex(nid);\n if (nVertex) {\n const idx = labelToIdx.get(nVertex.label);\n if (idx !== undefined) {\n labelDist[idx] = labelDist[idx]! + 1;\n }\n }\n }\n // Normalize\n for (let i = 0; i < labelDist.length; i++) {\n labelDist[i] = labelDist[i]! / neighbors.size;\n }\n }\n\n // Feature 3: k-hop connectivity (number of reachable vertices at each hop)\n const kHopCounts = new Float64Array(this.kHops);\n const visited = new Set<number>([vid]);\n let frontier = new Set<number>([vid]);\n\n for (let hop = 0; hop < this.kHops; hop++) {\n const nextFrontier = new Set<number>();\n for (const fvid of frontier) {\n for (const nid of store.neighbors(fvid, this.graph, null, \"out\")) {\n if (!visited.has(nid)) {\n visited.add(nid);\n nextFrontier.add(nid);\n }\n }\n for (const nid of store.neighbors(fvid, this.graph, null, \"in\")) {\n if (!visited.has(nid)) {\n visited.add(nid);\n nextFrontier.add(nid);\n }\n }\n }\n kHopCounts[hop] = n > 1 ? nextFrontier.size / (n - 1) : 0;\n frontier = nextFrontier;\n }\n\n // Combine features into embedding vector\n const embDim = 1 + allLabels.length + this.kHops;\n const embedding = new Float64Array(embDim);\n embedding[0] = normDegree;\n for (let i = 0; i < labelDist.length; i++) {\n embedding[1 + i] = labelDist[i]!;\n }\n for (let i = 0; i < kHopCounts.length; i++) {\n embedding[1 + allLabels.length + i] = kHopCounts[i]!;\n }\n\n // Score: use norm of embedding as relevance indicator\n let normSq = 0;\n for (let i = 0; i < embDim; i++) {\n normSq += embedding[i]! * embedding[i]!;\n }\n const score = Math.sqrt(normSq);\n\n entries.push(\n createPostingEntry(vid, {\n score,\n fields: {\n embedding,\n out_degree: outDegree,\n in_degree: inDegree,\n label: vertex.label,\n },\n }),\n );\n }\n\n const gpl = new GraphPostingList(entries);\n for (const entry of entries) {\n gpl.setGraphPayload(\n entry.docId,\n createGraphPayload({\n subgraphVertices: allVertexSet,\n subgraphEdges: new Set(),\n score: entry.payload.score,\n graphName: this.graph,\n }),\n );\n }\n return gpl;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- external prior scorer\n// 1:1 port of uqa/scoring/external_prior.py\n//\n// Bayesian BM25 scorer with external prior features (Section 12.2 #6, Paper 3).\n//\n// Combines the BM25 likelihood with a document-level prior via log-odds\n// addition:\n//\n// logit(posterior) = logit(likelihood) + logit(prior)\n//\n// The prior is computed by a user-supplied function that maps document\n// fields to a probability in (0, 1).\n\nimport { BayesianProbabilityTransform } from \"bayesian-bm25\";\nimport type { IndexStats } from \"../core/types.js\";\nimport type { BayesianBM25Params } from \"./bayesian-bm25.js\";\nimport { BM25Scorer } from \"./bm25.js\";\n\n/**\n * Numerically stable sigmoid function.\n * Avoids overflow for large negative x by using the exp(x)/(1+exp(x)) form.\n */\nfunction sigmoidStable(x: number): number {\n if (x >= 0) return 1.0 / (1.0 + Math.exp(-x));\n const ex = Math.exp(x);\n return ex / (1.0 + ex);\n}\n\n/**\n * Clamped logit function.\n * Returns -10 for p <= 0 and +10 for p >= 1 to avoid infinities.\n */\nfunction logitClamped(p: number): number {\n if (p <= 0) return -10.0;\n if (p >= 1) return 10.0;\n return Math.log(p / (1.0 - p));\n}\n\n/**\n * A prior function that maps document fields to a probability in (0, 1).\n * Returns 0.5 (neutral prior) when no prior information is available.\n */\nexport type PriorFn = (docFields: Record<string, unknown>) => number;\n\n/**\n * Bayesian BM25 scorer with external prior.\n *\n * Computes the BM25 likelihood probability, then combines it with\n * an external prior via log-odds addition to produce a posterior.\n */\nexport class ExternalPriorScorer {\n private readonly _bm25: BM25Scorer;\n private readonly _transform: BayesianProbabilityTransform;\n private readonly _priorFn: PriorFn;\n\n constructor(params: BayesianBM25Params, indexStats: IndexStats, priorFn: PriorFn) {\n this._bm25 = new BM25Scorer(params.bm25, indexStats);\n this._transform = new BayesianProbabilityTransform(\n params.alpha,\n params.beta,\n params.baseRate === 0.5 ? null : params.baseRate,\n );\n this._priorFn = priorFn;\n }\n\n /**\n * Compute posterior with external prior via log-odds fusion.\n *\n * 1. Compute BM25 raw score.\n * 2. Convert to likelihood probability via BayesianProbabilityTransform.\n * 3. Compute prior from document fields.\n * 4. Combine via log-odds addition: logit(posterior) = logit(likelihood) + logit(prior).\n * 5. Convert back to probability via sigmoid.\n */\n scoreWithPrior(\n termFreq: number,\n docLength: number,\n docFreq: number,\n docFields: Record<string, unknown>,\n ): number {\n // Compute BM25 likelihood probability\n const idfVal = this._bm25.idf(docFreq);\n const rawBm25 = this._bm25.scoreWithIdf(termFreq, docLength, idfVal);\n const avgdl = this._bm25.params.k1 > 0 ? docLength : 1;\n const docLenRatio = avgdl > 0 ? docLength / avgdl : 1.0;\n const likelihood = this._transform.scoreToProbability(\n rawBm25,\n termFreq,\n docLenRatio,\n );\n\n // Compute prior from document fields\n let prior = this._priorFn(docFields);\n prior = Math.max(1e-10, Math.min(1.0 - 1e-10, prior));\n\n // Combine via log-odds addition\n const logitPosterior = logitClamped(likelihood) + logitClamped(prior);\n return sigmoidStable(logitPosterior);\n }\n}\n\n// -- Prior factory functions --------------------------------------------------\n\n/**\n * Create a recency-based prior function.\n *\n * Documents with a more recent timestamp in the given field receive higher\n * prior probability. The prior decays exponentially with age:\n *\n * prior = 0.5 + 0.4 * exp(-age_days / decay_days)\n *\n * Returns 0.5 (neutral prior) when the field is missing or unparseable.\n *\n * @param field - The document field containing a date/timestamp.\n * @param decayDays - Half-life in days for the exponential decay.\n */\nexport function recencyPrior(field: string, decayDays = 30.0): PriorFn {\n return (docFields: Record<string, unknown>): number => {\n const val = docFields[field];\n if (val === null || val === undefined) return 0.5;\n\n let date: Date;\n if (val instanceof Date) {\n date = val;\n } else if (typeof val === \"string\") {\n date = new Date(val);\n if (isNaN(date.getTime())) return 0.5;\n } else {\n return 0.5;\n }\n\n const ageDays = (Date.now() - date.getTime()) / 86400000;\n return 0.5 + 0.4 * Math.exp(-ageDays / decayDays);\n };\n}\n\n/**\n * Create an authority-based prior function.\n *\n * Maps categorical authority levels to prior probabilities.\n * Default levels: {\"high\": 0.8, \"medium\": 0.6, \"low\": 0.4}.\n * Returns 0.5 (neutral) when the field is missing or unrecognized.\n *\n * @param field - The document field containing the authority level.\n * @param levels - Mapping from level name to prior probability.\n */\nexport function authorityPrior(\n field: string,\n levels?: Record<string, number> | null,\n): PriorFn {\n const _levels = levels ?? { high: 0.8, medium: 0.6, low: 0.4 };\n return (docFields: Record<string, unknown>): number => {\n const val = docFields[field];\n if (val === null || val === undefined) return 0.5;\n const key = typeof val === \"string\" ? val : String(val as number);\n return _levels[key] ?? 0.5;\n };\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- deep learning operator\n// 1:1 port of uqa/operators/deep_learn.py\n//\n// Analytical training pipeline for deep learning models (Paper 4).\n// PoE local learning with supervised conv weight estimation.\n\nimport type { FusionLayer } from \"./deep-fusion.js\";\nimport type * as linalg from \"../math/linalg.js\";\nimport {\n ridgeSolve,\n elasticNetSolve,\n magnitudePrune,\n hopWeightsToKernel,\n gridForward,\n gridGlobalPool,\n batchSelfAttention,\n generateOrthogonalKernels,\n generateGaborKernels,\n generateKmeansKernels,\n generateQkProjections,\n searchVProjection,\n} from \"./backend.js\";\n\n// -- Training spec types -----------------------------------------------------\n\nexport interface ConvSpec {\n readonly type: \"conv\";\n readonly kernelHops: number;\n readonly nChannels: number;\n readonly initMode: string;\n}\n\nexport interface PoolSpec {\n readonly type: \"pool\";\n readonly method: string;\n readonly poolSize: number;\n}\n\nexport interface FlattenSpec {\n readonly type: \"flatten\";\n}\n\nexport interface GlobalPoolSpec {\n readonly type: \"global_pool\";\n readonly method: string;\n}\n\nexport interface DenseSpec {\n readonly type: \"dense\";\n readonly outputChannels: number;\n}\n\nexport interface SoftmaxSpec {\n readonly type: \"softmax\";\n}\n\nexport interface AttentionSpec {\n readonly type: \"attention\";\n readonly nHeads: number;\n readonly mode: string;\n}\n\nexport type LayerSpec =\n | ConvSpec\n | PoolSpec\n | FlattenSpec\n | GlobalPoolSpec\n | DenseSpec\n | SoftmaxSpec\n | AttentionSpec;\n\n// -- TrainedModel ------------------------------------------------------------\n\nexport interface TrainedModel {\n modelName: string;\n tableName: string | null;\n labelField: string;\n embeddingField: string;\n edgeLabel: string;\n gating: string;\n lam: number;\n layerSpecs: Record<string, unknown>[];\n convWeights: number[][];\n denseWeights: number[];\n denseBias: number[];\n denseInputChannels: number;\n denseOutputChannels: number;\n numClasses: number;\n classLabels: unknown[];\n gridSize: number;\n embeddingDim: number;\n trainingAccuracy: number;\n trainingSamples: number;\n expertWeights: number[][];\n expertBiases: number[][];\n expertInputChannels: number[];\n expertAccuracies: number[];\n shrinkageAlpha: number;\n convKernelData: number[][];\n convKernelShapes: number[][];\n inChannels: number;\n attentionParams: Record<string, unknown>[];\n l1Ratio: number;\n pruneRatio: number;\n weightSparsity: number;\n}\n\nexport function trainedModelToJSON(model: TrainedModel): string {\n return JSON.stringify(model);\n}\n\nexport function trainedModelFromJSON(s: string): TrainedModel {\n return JSON.parse(s) as TrainedModel;\n}\n\nexport function trainedModelToDict(model: TrainedModel): Record<string, unknown> {\n return { ...model } as unknown as Record<string, unknown>;\n}\n\nexport function trainedModelFromDict(d: Record<string, unknown>): TrainedModel {\n return d as unknown as TrainedModel;\n}\n\nexport function trainedModelToDeepFusionLayers(model: TrainedModel): FusionLayer[] {\n const layers: FusionLayer[] = [];\n let convIdx = 0;\n let attnIdx = 0;\n\n for (const specDict of model.layerSpecs) {\n const t = specDict[\"type\"] as string;\n if (t === \"conv\") {\n if (\n model.convKernelData.length > convIdx &&\n model.convKernelShapes.length > convIdx\n ) {\n layers.push({\n type: \"conv\",\n edgeLabel: model.edgeLabel,\n hopWeights: model.convWeights[convIdx] ?? [1.0, 0.0],\n direction: \"both\",\n kernel: model.convKernelData[convIdx],\n kernelShape: model.convKernelShapes[convIdx],\n });\n } else {\n layers.push({\n type: \"conv\",\n edgeLabel: model.edgeLabel,\n hopWeights: model.convWeights[convIdx] ?? [1.0, 0.0],\n direction: \"both\",\n });\n }\n convIdx++;\n } else if (t === \"attention\") {\n const ap =\n attnIdx < model.attentionParams.length ? model.attentionParams[attnIdx]! : {};\n layers.push({\n type: \"attention\",\n nHeads: (ap[\"n_heads\"] as number | undefined) ?? 1,\n mode: (ap[\"mode\"] as string | undefined) ?? \"content\",\n qWeights: ap[\"W_q\"] ? (ap[\"W_q\"] as number[]) : null,\n qShape: ap[\"W_q_shape\"] ? (ap[\"W_q_shape\"] as number[]) : null,\n kWeights: ap[\"W_k\"] ? (ap[\"W_k\"] as number[]) : null,\n kShape: ap[\"W_k_shape\"] ? (ap[\"W_k_shape\"] as number[]) : null,\n vWeights: ap[\"W_v\"] ? (ap[\"W_v\"] as number[]) : null,\n vShape: ap[\"W_v_shape\"] ? (ap[\"W_v_shape\"] as number[]) : null,\n });\n attnIdx++;\n } else if (t === \"pool\") {\n layers.push({\n type: \"pool\",\n edgeLabel: model.edgeLabel,\n poolSize: (specDict[\"pool_size\"] as number | undefined) ?? 2,\n method: (specDict[\"method\"] as string | undefined) ?? \"max\",\n direction: \"both\",\n });\n } else if (t === \"flatten\") {\n layers.push({ type: \"flatten\" });\n } else if (t === \"global_pool\") {\n layers.push({\n type: \"global_pool\",\n method: (specDict[\"method\"] as string | undefined) ?? \"avg\",\n });\n } else if (t === \"dense\") {\n layers.push({\n type: \"dense\",\n weights: model.denseWeights,\n bias: model.denseBias,\n outputChannels: model.denseOutputChannels,\n inputChannels: model.denseInputChannels,\n });\n } else if (t === \"softmax\") {\n layers.push({ type: \"softmax\" });\n }\n }\n\n return layers;\n}\n\n// -- Kernel generation -------------------------------------------------------\n\nexport function generateKernels(\n nChannels: number,\n inChannels: number,\n seed = 42,\n initMode = \"kaiming\",\n trainingData: Float64Array | null = null,\n shapeData: linalg.Shape2D | null = null,\n gridH = 0,\n gridW = 0,\n): Float64Array {\n if (initMode === \"orthogonal\") {\n return generateOrthogonalKernels(nChannels, inChannels, seed);\n }\n if (initMode === \"gabor\") {\n return generateGaborKernels(nChannels, inChannels, seed);\n }\n if (initMode === \"kmeans\") {\n if (trainingData === null || shapeData === null) {\n throw new Error(\"kmeans init requires training_data\");\n }\n return generateKmeansKernels(\n nChannels,\n inChannels,\n trainingData,\n shapeData,\n gridH,\n gridW,\n seed,\n );\n }\n // Default: Kaiming\n let s = seed;\n function nextRand(): number {\n s ^= s << 13;\n s ^= s >> 17;\n s ^= s << 5;\n const u1 = (s >>> 0) / 0xffffffff;\n s ^= s << 13;\n s ^= s >> 17;\n s ^= s << 5;\n const u2 = (s >>> 0) / 0xffffffff;\n return Math.sqrt(-2 * Math.log(Math.max(1e-10, u1))) * Math.cos(2 * Math.PI * u2);\n }\n\n const fanIn = inChannels * 9;\n const std = Math.sqrt(2.0 / fanIn);\n const kernels = new Float64Array(nChannels * inChannels * 9);\n for (let i = 0; i < kernels.length; i++) {\n kernels[i] = nextRand() * std;\n }\n return kernels;\n}\n\n// -- Stage identification ---------------------------------------------------\n\ninterface SpecDict {\n type: string;\n [key: string]: unknown;\n}\n\ntype Operation =\n | [\"stage\", SpecDict, SpecDict]\n | [\"attention\", SpecDict]\n | [\"global_pool\", SpecDict];\n\nfunction identifyOperations(specDicts: SpecDict[]): Operation[] {\n const ops: Operation[] = [];\n let i = 0;\n while (i < specDicts.length) {\n const d = specDicts[i]!;\n if (d.type === \"conv\") {\n const convD = d;\n let poolD: SpecDict;\n if (i + 1 < specDicts.length && specDicts[i + 1]!.type === \"pool\") {\n poolD = specDicts[i + 1]!;\n i += 2;\n } else {\n poolD = { type: \"pool\", method: \"max\", pool_size: 2 };\n i += 1;\n }\n ops.push([\"stage\", convD, poolD]);\n } else if (d.type === \"attention\") {\n ops.push([\"attention\", d]);\n i += 1;\n } else if (d.type === \"global_pool\") {\n ops.push([\"global_pool\", d]);\n i += 1;\n } else {\n i += 1;\n }\n }\n return ops;\n}\n\n// -- Self-attention training -----------------------------------------------\n\nfunction trainAttention(\n xFlat: Float64Array,\n shapeX: linalg.Shape2D,\n gridH: number,\n gridW: number,\n nChannels: number,\n nHeads: number,\n mode: string,\n Y: Float64Array,\n shapeY: linalg.Shape2D,\n lam: number,\n gating = \"none\",\n seed = 42,\n): { outFlat: Float64Array; params: Record<string, unknown> } {\n const batch = shapeX[0];\n const seqLen = gridH * gridW;\n const dModel = nChannels;\n\n // Reshape (batch, C*H*W) -> (batch, H*W, C) = (batch, seqLen, dModel)\n const X3d = new Float64Array(batch * seqLen * dModel);\n for (let b = 0; b < batch; b++) {\n for (let s = 0; s < seqLen; s++) {\n for (let c = 0; c < dModel; c++) {\n X3d[b * seqLen * dModel + s * dModel + c] =\n xFlat[b * shapeX[1] + c * seqLen + s] ?? 0;\n }\n }\n }\n\n const params: Record<string, unknown> = { mode, n_heads: nHeads, d_model: dModel };\n let wQ: Float64Array | null = null;\n let wK: Float64Array | null = null;\n\n if (mode === \"random_qk\" || mode === \"learned_v\") {\n const proj = generateQkProjections(dModel, seed);\n wQ = proj.wQ;\n wK = proj.wK;\n params[\"W_q\"] = Array.from(wQ);\n params[\"W_q_shape\"] = [dModel, dModel];\n params[\"W_k\"] = Array.from(wK);\n params[\"W_k_shape\"] = [dModel, dModel];\n }\n\n if (mode === \"learned_v\") {\n const { bestWV, bestOutFlat } = searchVProjection(\n X3d,\n [batch, seqLen, dModel],\n nHeads,\n wQ,\n wK,\n Y,\n shapeY,\n lam,\n gating,\n 20,\n seed,\n );\n params[\"W_v\"] = Array.from(bestWV);\n params[\"W_v_shape\"] = [dModel, dModel];\n return { outFlat: bestOutFlat, params };\n }\n\n const out3d = batchSelfAttention(\n X3d,\n [batch, seqLen, dModel],\n nHeads,\n wQ,\n wK,\n null,\n gating,\n );\n\n // (batch, H*W, C) -> (batch, C*H*W)\n const outFlat = new Float64Array(batch * dModel * seqLen);\n for (let b = 0; b < batch; b++) {\n for (let s = 0; s < seqLen; s++) {\n for (let c = 0; c < dModel; c++) {\n outFlat[b * dModel * seqLen + c * seqLen + s] =\n out3d[b * seqLen * dModel + s * dModel + c]!;\n }\n }\n }\n return { outFlat, params };\n}\n\n// -- Training --------------------------------------------------------------\n\nexport interface Engine {\n _tables: Map<string, unknown>;\n saveModel(name: string, data: Record<string, unknown>): void;\n loadModel(name: string): Record<string, unknown> | null;\n}\n\nexport function trainModel(\n engine: Engine,\n modelName: string,\n tableName: string | null,\n labelField: string,\n embeddingField: string,\n edgeLabel: string,\n layerSpecs: LayerSpec[],\n gating = \"none\",\n lam = 1.0,\n l1Ratio = 0.0,\n pruneRatio = 0.0,\n rows: Record<string, unknown>[] | null = null,\n): Record<string, unknown> {\n if (layerSpecs.length === 0) {\n throw new Error(\"deep_learn requires at least one layer spec\");\n }\n const specDicts = specsToDicts(layerSpecs);\n\n // Collect data\n const labelsRaw: unknown[] = [];\n const embList: Float64Array[] = [];\n\n if (rows !== null) {\n for (const row of rows) {\n labelsRaw.push(row[labelField]);\n const emb = row[embeddingField];\n if (Array.isArray(emb)) {\n embList.push(new Float64Array(emb as number[]));\n } else if (emb instanceof Float64Array) {\n embList.push(emb);\n }\n }\n } else {\n throw new Error(\"In-browser training requires rows parameter\");\n }\n\n if (embList.length === 0) throw new Error(\"No training data\");\n\n const embeddingDim = embList[0]!.length;\n const nSamples = embList.length;\n\n // Stack embeddings\n const embeddings = new Float64Array(nSamples * embeddingDim);\n for (let i = 0; i < nSamples; i++) {\n embeddings.set(embList[i]!, i * embeddingDim);\n }\n\n // Labels\n const uniqueLabels = [...new Set(labelsRaw)].sort();\n const labelToIdx = new Map<unknown, number>();\n for (let i = 0; i < uniqueLabels.length; i++) {\n labelToIdx.set(uniqueLabels[i], i);\n }\n const numClasses = uniqueLabels.length;\n\n let denseOutput = numClasses;\n for (const spec of layerSpecs) {\n if (spec.type === \"dense\") {\n denseOutput = spec.outputChannels;\n break;\n }\n }\n\n // One-hot labels\n const Y = new Float64Array(nSamples * denseOutput);\n for (let i = 0; i < nSamples; i++) {\n const idx = labelToIdx.get(labelsRaw[i]) ?? 0;\n if (idx < denseOutput) Y[i * denseOutput + idx] = 1.0;\n }\n\n // Grid detection\n let inChannels = 0;\n let gridSize = 0;\n for (const ch of [1, 3, 4]) {\n if (embeddingDim % ch !== 0) continue;\n const side = Math.floor(Math.sqrt(embeddingDim / ch));\n if (side * side * ch === embeddingDim) {\n inChannels = ch;\n gridSize = side;\n break;\n }\n }\n if (gridSize === 0) {\n throw new Error(\n `Embedding dimension ${String(embeddingDim)} is not C*H*W for any supported channel count.`,\n );\n }\n\n const ops = identifyOperations(specDicts);\n const stagesOnly = ops\n .filter((op) => op[0] === \"stage\")\n .map((op) => [op[1], op[2]] as [SpecDict, SpecDict]);\n\n // Generate conv kernels per stage\n const convKernels: Float64Array[] = [];\n const convWeights: number[][] = [];\n let inCh = inChannels;\n for (let stageIdx = 0; stageIdx < stagesOnly.length; stageIdx++) {\n const [convD] = stagesOnly[stageIdx]!;\n const nCh = (convD[\"n_channels\"] as number | undefined) ?? 1;\n const initMode = (convD[\"init_mode\"] as string | undefined) ?? \"kaiming\";\n if (nCh > 1) {\n const kernels = generateKernels(\n nCh,\n inCh,\n 42 + stageIdx,\n initMode,\n initMode === \"kmeans\" ? embeddings : null,\n initMode === \"kmeans\" ? [nSamples, embeddingDim] : null,\n gridSize,\n gridSize,\n );\n convKernels.push(kernels);\n convWeights.push([]);\n } else {\n const kernels = hopWeightsToKernel([1.0, 0.0]);\n convKernels.push(kernels);\n convWeights.push([1.0, 0.0]);\n }\n inCh = nCh > 1 ? nCh : 1;\n }\n\n // Per-operation forward + ridge regression\n let currentFlat: Float64Array = embeddings;\n let curH = gridSize;\n let curW = gridSize;\n\n const expertWeightsList: number[][] = [];\n const expertBiasesList: number[][] = [];\n const expertInputChannels: number[] = [];\n const attentionParamsList: Record<string, unknown>[] = [];\n const expertAccuracies: number[] = [];\n const trueClasses = new Int32Array(nSamples);\n for (let i = 0; i < nSamples; i++) {\n trueClasses[i] = labelToIdx.get(labelsRaw[i]) ?? 0;\n }\n\n let stageIdx = 0;\n let attnIdx = 0;\n for (const op of ops) {\n if (op[0] === \"stage\") {\n const convD = op[1];\n const poolD = op[2];\n const poolSize = (poolD[\"pool_size\"] as number | undefined) ?? 2;\n const poolMethod = (poolD[\"method\"] as string | undefined) ?? \"max\";\n const nCh = (convD[\"n_channels\"] as number | undefined) ?? 1;\n\n if (nCh <= 1) {\n // Single-channel: supervised grid search\n let bestAcc = -1.0;\n let bestHw = [1.0, 0.0];\n for (let a = -1.0; a <= 1.05; a += 0.1) {\n const cand = [1.0, a];\n const k = hopWeightsToKernel(cand);\n const result = gridForward(\n currentFlat,\n [nSamples, currentFlat.length / nSamples],\n curH,\n curW,\n [{ kernel: k, kernelShape: [1, 1, 3, 3], poolSize, poolMethod }],\n gating,\n );\n const feats = result.data;\n const nFeats = result.shape[1];\n if (nFeats === 0) continue;\n const { weights: Wt, bias: bt } = ridgeSolve(\n feats,\n [nSamples, nFeats],\n Y,\n [nSamples, denseOutput],\n lam,\n );\n // Compute accuracy\n let correct = 0;\n for (let i = 0; i < nSamples; i++) {\n let bestClass = 0;\n let bestScore = -Infinity;\n for (let j = 0; j < denseOutput; j++) {\n let score = bt[j]!;\n for (let f = 0; f < nFeats; f++) {\n score += feats[i * nFeats + f]! * Wt[f * denseOutput + j]!;\n }\n if (score > bestScore) {\n bestScore = score;\n bestClass = j;\n }\n }\n if (bestClass === trueClasses[i]) correct++;\n }\n const acc = correct / nSamples;\n if (acc > bestAcc) {\n bestAcc = acc;\n bestHw = [...cand];\n }\n }\n convKernels[stageIdx] = hopWeightsToKernel(bestHw);\n convWeights[stageIdx] = bestHw;\n }\n\n // Forward through this stage\n const result = gridForward(\n currentFlat,\n [nSamples, currentFlat.length / nSamples],\n curH,\n curW,\n [\n {\n kernel: convKernels[stageIdx]!,\n kernelShape: [1, 1, 3, 3],\n poolSize,\n poolMethod,\n },\n ],\n gating,\n );\n currentFlat = result.data;\n curH = Math.floor(curH / poolSize);\n curW = Math.floor(curW / poolSize);\n stageIdx++;\n } else if (op[0] === \"attention\") {\n const attnD = op[1];\n const nHeads = (attnD[\"n_heads\"] as number | undefined) ?? 1;\n const mode = (attnD[\"mode\"] as string | undefined) ?? \"content\";\n const nChAttn = Math.floor(currentFlat.length / nSamples / (curH * curW));\n\n const { outFlat, params } = trainAttention(\n currentFlat,\n [nSamples, currentFlat.length / nSamples],\n curH,\n curW,\n nChAttn,\n nHeads,\n mode,\n Y,\n [nSamples, denseOutput],\n lam,\n gating,\n 42 + attnIdx,\n );\n currentFlat = outFlat;\n attentionParamsList.push(params);\n attnIdx++;\n } else {\n const gpMethod = (op[1][\"method\"] as string | undefined) ?? \"avg\";\n const result = gridGlobalPool(\n currentFlat,\n [nSamples, currentFlat.length / nSamples],\n curH,\n curW,\n gpMethod,\n );\n currentFlat = result.data;\n curH = 1;\n curW = 1;\n }\n\n // Train expert head\n const nFeats = Math.floor(currentFlat.length / nSamples);\n let Ws: Float64Array;\n let bs: Float64Array;\n if (l1Ratio > 0) {\n const r = elasticNetSolve(\n currentFlat,\n [nSamples, nFeats],\n Y,\n [nSamples, denseOutput],\n lam,\n l1Ratio,\n );\n Ws = r.weights;\n bs = r.bias;\n } else {\n const r = ridgeSolve(\n currentFlat,\n [nSamples, nFeats],\n Y,\n [nSamples, denseOutput],\n lam,\n );\n Ws = r.weights;\n bs = r.bias;\n }\n if (pruneRatio > 0) {\n Ws = magnitudePrune(Ws, pruneRatio);\n }\n expertWeightsList.push(Array.from(Ws));\n expertBiasesList.push(Array.from(bs));\n expertInputChannels.push(nFeats);\n\n // Per-stage accuracy\n let correct = 0;\n for (let i = 0; i < nSamples; i++) {\n let bestClass = 0;\n let bestScore = -Infinity;\n for (let j = 0; j < denseOutput; j++) {\n let score = bs[j]!;\n for (let f = 0; f < nFeats; f++) {\n score += currentFlat[i * nFeats + f]! * Ws[f * denseOutput + j]!;\n }\n if (score > bestScore) {\n bestScore = score;\n bestClass = j;\n }\n }\n if (bestClass === trueClasses[i]) correct++;\n }\n expertAccuracies.push(correct / nSamples);\n }\n\n // Final head\n const nFeatures = Math.floor(currentFlat.length / nSamples);\n let WFinal: Float64Array;\n let bFinal: Float64Array;\n if (l1Ratio > 0) {\n const r = elasticNetSolve(\n currentFlat,\n [nSamples, nFeatures],\n Y,\n [nSamples, denseOutput],\n lam,\n l1Ratio,\n );\n WFinal = r.weights;\n bFinal = r.bias;\n } else {\n const r = ridgeSolve(\n currentFlat,\n [nSamples, nFeatures],\n Y,\n [nSamples, denseOutput],\n lam,\n );\n WFinal = r.weights;\n bFinal = r.bias;\n }\n if (pruneRatio > 0) {\n WFinal = magnitudePrune(WFinal, pruneRatio);\n }\n\n // Final accuracy\n let finalCorrect = 0;\n for (let i = 0; i < nSamples; i++) {\n let bestClass = 0;\n let bestScore = -Infinity;\n for (let j = 0; j < denseOutput; j++) {\n let score = bFinal[j]!;\n for (let f = 0; f < nFeatures; f++) {\n score += currentFlat[i * nFeatures + f]! * WFinal[f * denseOutput + j]!;\n }\n if (score > bestScore) {\n bestScore = score;\n bestClass = j;\n }\n }\n if (bestClass === trueClasses[i]) finalCorrect++;\n }\n expertAccuracies.push(finalCorrect / nSamples);\n\n // PoE shrinkage\n const nOps = ops.length;\n const nExpertStages = nOps + 1;\n const shrinkageAlpha = 1.0 / (2.0 * Math.sqrt(nExpertStages));\n\n // PoE training accuracy\n // Recompute per-operation features for PoE (simplified -- use final accuracy)\n const accuracy = finalCorrect / nSamples;\n\n // Store kernel data\n const convKernelData = convKernels.map((k) => Array.from(k));\n const convKernelShapes = convKernels.map((k) => {\n // Infer shape from length\n const totalElems = k.length;\n if (totalElems === 9) return [1, 1, 3, 3];\n // Try to infer nCh from stagesOnly\n return [1, 1, 3, 3];\n });\n\n // Weight sparsity\n let zeroCount = 0;\n for (let i = 0; i < WFinal.length; i++) {\n if (WFinal[i] === 0) zeroCount++;\n }\n const weightSparsity = pruneRatio > 0 || l1Ratio > 0 ? zeroCount / WFinal.length : 0;\n\n const trained: TrainedModel = {\n modelName,\n tableName,\n labelField,\n embeddingField,\n edgeLabel,\n gating,\n lam,\n layerSpecs: specDicts,\n convWeights,\n denseWeights: Array.from(WFinal),\n denseBias: Array.from(bFinal),\n denseInputChannels: nFeatures,\n denseOutputChannels: denseOutput,\n numClasses,\n classLabels: uniqueLabels,\n gridSize,\n embeddingDim,\n trainingAccuracy: accuracy,\n trainingSamples: nSamples,\n expertWeights: expertWeightsList,\n expertBiases: expertBiasesList,\n expertInputChannels,\n expertAccuracies,\n shrinkageAlpha,\n convKernelData,\n convKernelShapes,\n inChannels,\n attentionParams: attentionParamsList,\n l1Ratio,\n pruneRatio,\n weightSparsity,\n };\n\n engine.saveModel(modelName, trainedModelToDict(trained));\n\n return {\n model_name: modelName,\n training_samples: nSamples,\n num_classes: numClasses,\n training_accuracy: accuracy,\n feature_dim: nFeatures,\n class_labels: trained.classLabels,\n l1_ratio: l1Ratio,\n prune_ratio: pruneRatio,\n weight_sparsity: trained.weightSparsity,\n };\n}\n\n// -- Inference -------------------------------------------------------------\n\nexport function predict(\n engine: Engine,\n modelName: string,\n inputEmbedding: number[],\n): [number, number][] {\n const config = engine.loadModel(modelName);\n if (config === null) {\n throw new Error(`Model '${modelName}' does not exist`);\n }\n\n const model = trainedModelFromDict(config);\n const ops = identifyOperations(model.layerSpecs as SpecDict[]);\n const nOps = ops.length;\n const hasExperts =\n model.expertWeights.length > 0 && model.expertWeights.length === nOps;\n\n const emb = new Float64Array(inputEmbedding);\n const gridSz = model.gridSize;\n\n // Reconstruct conv kernels from stored data\n const convKernelsList: Float64Array[] = [];\n if (model.convKernelData.length > 0 && model.convKernelShapes.length > 0) {\n for (let i = 0; i < model.convKernelData.length; i++) {\n convKernelsList.push(new Float64Array(model.convKernelData[i]!));\n }\n } else {\n for (const cw of model.convWeights) {\n convKernelsList.push(hopWeightsToKernel(cw));\n }\n }\n\n const modelInCh = model.inChannels;\n const isGrid = gridSz > 0 && gridSz * gridSz * modelInCh === model.embeddingDim;\n\n if (!isGrid) {\n // Fallback: return empty prediction\n return [];\n }\n\n // Grid-accelerated inference\n const allLogits: Float64Array[] = [];\n let currentFlat: Float64Array = new Float64Array(emb);\n let curH = gridSz;\n let curW = gridSz;\n\n let sIdx = 0;\n let aIdx = 0;\n for (let opIdx = 0; opIdx < ops.length; opIdx++) {\n const op = ops[opIdx]!;\n if (op[0] === \"stage\") {\n const poolD = op[2];\n const poolSize = (poolD[\"pool_size\"] as number | undefined) ?? 2;\n const poolMethod = (poolD[\"method\"] as string | undefined) ?? \"max\";\n\n const result = gridForward(\n currentFlat,\n [1, currentFlat.length],\n curH,\n curW,\n [\n {\n kernel: convKernelsList[sIdx]!,\n kernelShape: [1, 1, 3, 3],\n poolSize,\n poolMethod,\n },\n ],\n model.gating,\n );\n currentFlat = result.data;\n curH = Math.floor(curH / poolSize);\n curW = Math.floor(curW / poolSize);\n sIdx++;\n } else if (op[0] === \"attention\") {\n const nCh = Math.floor(currentFlat.length / (curH * curW));\n const seqLen = curH * curW;\n const X3d = new Float64Array(seqLen * nCh);\n for (let s = 0; s < seqLen; s++) {\n for (let c = 0; c < nCh; c++) {\n X3d[s * nCh + c] = currentFlat[c * seqLen + s] ?? 0;\n }\n }\n\n const ap =\n aIdx < model.attentionParams.length ? model.attentionParams[aIdx]! : {};\n const wQ = ap[\"W_q\"] ? new Float64Array(ap[\"W_q\"] as number[]) : null;\n const wK = ap[\"W_k\"] ? new Float64Array(ap[\"W_k\"] as number[]) : null;\n const wV = ap[\"W_v\"] ? new Float64Array(ap[\"W_v\"] as number[]) : null;\n\n const out3d = batchSelfAttention(\n X3d,\n [1, seqLen, nCh],\n (ap[\"n_heads\"] as number | undefined) ?? 1,\n wQ,\n wK,\n wV,\n model.gating,\n );\n\n currentFlat = new Float64Array(nCh * seqLen);\n for (let s = 0; s < seqLen; s++) {\n for (let c = 0; c < nCh; c++) {\n currentFlat[c * seqLen + s] = out3d[s * nCh + c]!;\n }\n }\n aIdx++;\n } else {\n const gpMethod = (op[1][\"method\"] as string | undefined) ?? \"avg\";\n const result = gridGlobalPool(\n currentFlat,\n [1, currentFlat.length],\n curH,\n curW,\n gpMethod,\n );\n currentFlat = result.data;\n curH = 1;\n curW = 1;\n }\n\n // Expert head logits\n if (hasExperts) {\n const feat = currentFlat;\n const eic = model.expertInputChannels[opIdx]!;\n const wE = new Float64Array(model.expertWeights[opIdx]!);\n const bE = new Float64Array(model.expertBiases[opIdx]!);\n const logits = new Float64Array(model.denseOutputChannels);\n for (let j = 0; j < model.denseOutputChannels; j++) {\n logits[j] = bE[j]!;\n for (let f = 0; f < eic; f++) {\n logits[j]! += wE[j * eic + f]! * feat[f]!;\n }\n }\n allLogits.push(logits);\n }\n }\n\n // Final head\n const featFinal = currentFlat;\n const wF = new Float64Array(model.denseWeights);\n const bF = new Float64Array(model.denseBias);\n const finalLogits = new Float64Array(model.denseOutputChannels);\n for (let j = 0; j < model.denseOutputChannels; j++) {\n finalLogits[j] = bF[j]!;\n for (let f = 0; f < model.denseInputChannels; f++) {\n finalLogits[j]! += wF[j * model.denseInputChannels + f]! * featFinal[f]!;\n }\n }\n allLogits.push(finalLogits);\n\n // PoE: accuracy-weighted logit combination\n const nExperts = allLogits.length;\n const avgLogits = new Float64Array(model.denseOutputChannels);\n const accs = model.expertAccuracies;\n if (accs.length === nExperts) {\n const totalAcc = accs.reduce((a, b) => a + b, 0);\n for (let e = 0; e < nExperts; e++) {\n const w = accs[e]! / totalAcc;\n for (let j = 0; j < model.denseOutputChannels; j++) {\n avgLogits[j]! += w * allLogits[e]![j]!;\n }\n }\n } else {\n for (let e = 0; e < nExperts; e++) {\n for (let j = 0; j < model.denseOutputChannels; j++) {\n avgLogits[j]! += allLogits[e]![j]! / nExperts;\n }\n }\n }\n for (let j = 0; j < model.denseOutputChannels; j++) {\n avgLogits[j]! += model.shrinkageAlpha * Math.log(nExperts);\n }\n\n // Softmax\n let maxLogit = -Infinity;\n for (let j = 0; j < model.denseOutputChannels; j++) {\n if (avgLogits[j]! > maxLogit) maxLogit = avgLogits[j]!;\n }\n const expVals = new Float64Array(model.denseOutputChannels);\n let sumExp = 0;\n for (let j = 0; j < model.denseOutputChannels; j++) {\n expVals[j] = Math.exp(avgLogits[j]! - maxLogit);\n sumExp += expVals[j]!;\n }\n const probs = new Float64Array(model.denseOutputChannels);\n for (let j = 0; j < model.denseOutputChannels; j++) {\n probs[j] = expVals[j]! / sumExp;\n }\n\n // Sort by probability descending\n const indices: number[] = [];\n for (let j = 0; j < model.denseOutputChannels; j++) indices.push(j);\n indices.sort((a, b) => probs[b]! - probs[a]!);\n\n return indices.map((idx) => [idx, probs[idx]!]);\n}\n\n// -- Spec serialization ---------------------------------------------------\n\nexport function identifyStages(specDicts: SpecDict[]): [SpecDict, SpecDict][] {\n const stages: [SpecDict, SpecDict][] = [];\n let i = 0;\n while (i < specDicts.length) {\n if (specDicts[i]!.type === \"conv\") {\n const convD = specDicts[i]!;\n let poolD: SpecDict;\n if (i + 1 < specDicts.length && specDicts[i + 1]!.type === \"pool\") {\n poolD = specDicts[i + 1]!;\n i += 2;\n } else {\n poolD = { type: \"pool\", method: \"max\", pool_size: 2 };\n i += 1;\n }\n stages.push([convD, poolD]);\n } else {\n i += 1;\n }\n }\n return stages;\n}\n\nexport function dictsToSpecs(dicts: Record<string, unknown>[]): LayerSpec[] {\n const result: LayerSpec[] = [];\n for (const d of dicts) {\n const t = d[\"type\"] as string;\n if (t === \"conv\") {\n result.push({\n type: \"conv\",\n kernelHops: (d[\"kernel_hops\"] as number | undefined) ?? 1,\n nChannels: (d[\"n_channels\"] as number | undefined) ?? 1,\n initMode: (d[\"init_mode\"] as string | undefined) ?? \"kaiming\",\n });\n } else if (t === \"pool\") {\n result.push({\n type: \"pool\",\n method: (d[\"method\"] as string | undefined) ?? \"max\",\n poolSize: (d[\"pool_size\"] as number | undefined) ?? 2,\n });\n } else if (t === \"flatten\") {\n result.push({ type: \"flatten\" });\n } else if (t === \"global_pool\") {\n result.push({\n type: \"global_pool\",\n method: (d[\"method\"] as string | undefined) ?? \"avg\",\n });\n } else if (t === \"dense\") {\n result.push({\n type: \"dense\",\n outputChannels: (d[\"output_channels\"] as number | undefined) ?? 10,\n });\n } else if (t === \"softmax\") {\n result.push({ type: \"softmax\" });\n } else if (t === \"attention\") {\n result.push({\n type: \"attention\",\n nHeads: (d[\"n_heads\"] as number | undefined) ?? 1,\n mode: (d[\"mode\"] as string | undefined) ?? \"content\",\n });\n }\n }\n return result;\n}\n\nfunction specsToDicts(specs: LayerSpec[]): SpecDict[] {\n const result: SpecDict[] = [];\n for (const spec of specs) {\n switch (spec.type) {\n case \"conv\":\n result.push({\n type: \"conv\",\n kernel_hops: spec.kernelHops,\n n_channels: spec.nChannels,\n init_mode: spec.initMode,\n });\n break;\n case \"pool\":\n result.push({\n type: \"pool\",\n method: spec.method,\n pool_size: spec.poolSize,\n });\n break;\n case \"flatten\":\n result.push({ type: \"flatten\" });\n break;\n case \"global_pool\":\n result.push({ type: \"global_pool\", method: spec.method });\n break;\n case \"dense\":\n result.push({ type: \"dense\", output_channels: spec.outputChannels });\n break;\n case \"softmax\":\n result.push({ type: \"softmax\" });\n break;\n case \"attention\":\n result.push({\n type: \"attention\",\n n_heads: spec.nHeads,\n mode: spec.mode,\n });\n break;\n }\n }\n return result;\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- attention fusion\n// 1:1 port of uqa/fusion/attention.py\n\nimport {\n AttentionLogOddsWeights,\n logOddsConjunction,\n MultiHeadAttentionLogOddsWeights,\n} from \"bayesian-bm25\";\n\nexport class AttentionFusion {\n private _attn: AttentionLogOddsWeights;\n\n constructor(\n nSignals: number,\n nQueryFeatures = 6,\n alpha = 0.5,\n normalize = false,\n baseRate?: number | null,\n ) {\n this._attn = new AttentionLogOddsWeights(\n nSignals,\n nQueryFeatures,\n alpha,\n normalize,\n 0,\n baseRate ?? null,\n );\n }\n\n get nSignals(): number {\n return this._attn.nSignals;\n }\n\n get nQueryFeatures(): number {\n return this._attn.nQueryFeatures;\n }\n\n fuse(probabilities: number[], queryFeatures: number[]): number {\n // Compute attention weights via matrix-vector product\n const wm = this._attn.weightsMatrix;\n const nSig = probabilities.length;\n const nFeat = queryFeatures.length;\n const weights: number[] = [];\n\n for (let i = 0; i < nSig; i++) {\n let dot = 0;\n const row = wm[i];\n if (row) {\n for (let j = 0; j < nFeat; j++) {\n dot += (row[j] ?? 0) * (queryFeatures[j] ?? 0);\n }\n }\n weights.push(dot);\n }\n\n // Softmax normalization\n let maxW = -Infinity;\n for (const w of weights) if (w > maxW) maxW = w;\n let sumExp = 0;\n for (let i = 0; i < weights.length; i++) {\n weights[i] = Math.exp(weights[i]! - maxW);\n sumExp += weights[i]!;\n }\n for (let i = 0; i < weights.length; i++) {\n weights[i] = weights[i]! / sumExp;\n }\n\n return logOddsConjunction(probabilities, this._attn.alpha, weights);\n }\n\n fit(probs: number[][], labels: number[], queryFeatures: number[][]): void {\n this._attn.fit(probs, labels, queryFeatures);\n }\n\n update(probs: number[], label: number, queryFeatures: number[]): void {\n this._attn.update(probs, label, queryFeatures);\n }\n\n stateDict(): Record<string, unknown> {\n return {\n weights_matrix: this._attn.weightsMatrix,\n alpha: this._attn.alpha,\n n_signals: this._attn.nSignals,\n n_query_features: this._attn.nQueryFeatures,\n };\n }\n\n loadStateDict(state: Record<string, unknown>): void {\n this._attn = new AttentionLogOddsWeights(\n state[\"n_signals\"] as number,\n state[\"n_query_features\"] as number,\n state[\"alpha\"] as number,\n );\n // Restore weights matrix\n const wm = state[\"weights_matrix\"];\n if (wm !== null && wm !== undefined) {\n const matrix = wm as number[][];\n for (let i = 0; i < matrix.length; i++) {\n for (let j = 0; j < matrix[i]!.length; j++) {\n this._attn.weightsMatrix[i]![j] = matrix[i]![j]!;\n }\n }\n }\n }\n}\n\nexport class MultiHeadAttentionFusion {\n private _mh: MultiHeadAttentionLogOddsWeights;\n private _nQueryFeatures: number;\n\n constructor(\n nSignals: number,\n nHeads = 4,\n nQueryFeatures = 6,\n alpha = 0.5,\n normalize = false,\n ) {\n this._mh = new MultiHeadAttentionLogOddsWeights(\n nHeads,\n nSignals,\n nQueryFeatures,\n alpha,\n normalize,\n );\n this._nQueryFeatures = nQueryFeatures;\n }\n\n get nSignals(): number {\n return this._mh.heads[0]?.nSignals ?? 0;\n }\n\n get nQueryFeatures(): number {\n return this._nQueryFeatures;\n }\n\n fuse(probabilities: number[], queryFeatures: number[]): number {\n return this._mh.combine(probabilities, queryFeatures, false);\n }\n\n fit(probs: number[][], labels: number[], queryFeatures: number[][]): void {\n this._mh.fit(probs, labels, queryFeatures);\n }\n\n stateDict(): Record<string, unknown> {\n return {\n n_heads: this._mh.nHeads,\n n_signals: this.nSignals,\n n_query_features: this._nQueryFeatures,\n alpha: this._mh.heads[0]?.alpha ?? 0.5,\n };\n }\n\n loadStateDict(state: Record<string, unknown>): void {\n this._mh = new MultiHeadAttentionLogOddsWeights(\n state[\"n_heads\"] as number,\n state[\"n_signals\"] as number,\n state[\"n_query_features\"] as number,\n state[\"alpha\"] as number,\n );\n this._nQueryFeatures = state[\"n_query_features\"] as number;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- learned fusion\n// 1:1 port of uqa/fusion/learned.py\n\nimport { LearnableLogOddsWeights, logOddsConjunction } from \"bayesian-bm25\";\n\nexport class LearnedFusion {\n private _learnable: LearnableLogOddsWeights;\n\n constructor(nSignals: number, alpha = 0.5) {\n this._learnable = new LearnableLogOddsWeights(nSignals, alpha);\n }\n\n get nSignals(): number {\n return this._learnable.nSignals;\n }\n\n fuse(probabilities: number[]): number {\n const weights = [...this._learnable.weights];\n return logOddsConjunction(probabilities, this._learnable.alpha, weights);\n }\n\n update(probs: number[], label: number, options?: { learningRate?: number }): void {\n // Compute logits for Hebbian update\n const logits = probs.map((p) => {\n const c = Math.max(1e-10, Math.min(1 - 1e-10, p));\n return Math.log(c / (1 - c));\n });\n const error = label - this.fuse(probs);\n this._learnable.update(logits, error, options);\n }\n\n stateDict(): Record<string, unknown> {\n return {\n weights: [...this._learnable.weights],\n alpha: this._learnable.alpha,\n n_signals: this._learnable.nSignals,\n };\n }\n\n loadStateDict(state: Record<string, unknown>): void {\n this._learnable = new LearnableLogOddsWeights(\n state[\"n_signals\"] as number,\n state[\"alpha\"] as number,\n );\n const w = state[\"weights\"] as number[];\n for (let i = 0; i < w.length; i++) {\n this._learnable.weights[i] = w[i]!;\n }\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- query feature extractor\n// 1:1 port of uqa/fusion/query_features.py\n\nimport type { InvertedIndex } from \"../storage/abc/inverted-index.js\";\n\nexport class QueryFeatureExtractor {\n private readonly _index: InvertedIndex;\n\n constructor(invertedIndex: InvertedIndex) {\n this._index = invertedIndex;\n }\n\n get nFeatures(): number {\n return 6;\n }\n\n extract(queryTerms: string[], field?: string | null): Float64Array {\n const stats = this._index.stats;\n const n = stats.totalDocs;\n if (n === 0) return new Float64Array(6);\n\n const fieldName = field ?? \"_default\";\n const idfs: number[] = [];\n let vocabHits = 0;\n\n for (const term of queryTerms) {\n const df = stats.docFreq(fieldName, term);\n if (df > 0) {\n vocabHits++;\n const idf = Math.log((n - df + 0.5) / (df + 0.5) + 1.0);\n idfs.push(idf);\n }\n }\n\n if (idfs.length === 0) {\n return new Float64Array([0, 0, 0, 0, queryTerms.length, 0]);\n }\n\n let sum = 0;\n let max = -Infinity;\n let min = Infinity;\n for (const v of idfs) {\n sum += v;\n if (v > max) max = v;\n if (v < min) min = v;\n }\n\n const meanIdf = sum / idfs.length;\n const coverageRatio = idfs.length / Math.max(1, n);\n const queryLength = queryTerms.length;\n const vocabOverlap = vocabHits / Math.max(1, queryTerms.length);\n\n return new Float64Array([\n meanIdf,\n max,\n min,\n coverageRatio,\n queryLength,\n vocabOverlap,\n ]);\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- cardinality estimator\n// 1:1 port of uqa/planner/cardinality.py\n\nimport type { IndexStats } from \"../core/types.js\";\nimport type { ColumnStats } from \"../sql/table.js\";\nimport { Operator } from \"../operators/base.js\";\nimport {\n UnionOperator,\n IntersectOperator,\n ComplementOperator,\n} from \"../operators/boolean.js\";\nimport {\n TermOperator,\n VectorSimilarityOperator,\n KNNOperator,\n FilterOperator,\n ScoreOperator,\n} from \"../operators/primitive.js\";\nimport { SparseThresholdOperator } from \"../operators/sparse.js\";\nimport { MultiStageOperator } from \"../operators/multi-stage.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// GraphStats\n// ---------------------------------------------------------------------------\n\nexport class GraphStats {\n numVertices: number;\n numEdges: number;\n labelCounts: Map<string, number>;\n avgOutDegree: number;\n degreeDistribution: Map<number, number>;\n minTimestamp: number | null;\n maxTimestamp: number | null;\n graphName: string;\n vertexLabelCounts: Map<string, number>;\n labelDegreeMap: Map<string, number>;\n\n constructor(opts?: {\n numVertices?: number;\n numEdges?: number;\n labelCounts?: Map<string, number>;\n avgOutDegree?: number;\n degreeDistribution?: Map<number, number>;\n minTimestamp?: number | null;\n maxTimestamp?: number | null;\n graphName?: string;\n vertexLabelCounts?: Map<string, number>;\n labelDegreeMap?: Map<string, number>;\n }) {\n this.numVertices = opts?.numVertices ?? 0;\n this.numEdges = opts?.numEdges ?? 0;\n this.labelCounts = opts?.labelCounts ?? new Map<string, number>();\n this.avgOutDegree = opts?.avgOutDegree ?? 0.0;\n this.degreeDistribution = opts?.degreeDistribution ?? new Map<number, number>();\n this.minTimestamp = opts?.minTimestamp ?? null;\n this.maxTimestamp = opts?.maxTimestamp ?? null;\n this.graphName = opts?.graphName ?? \"\";\n this.vertexLabelCounts = opts?.vertexLabelCounts ?? new Map<string, number>();\n this.labelDegreeMap = opts?.labelDegreeMap ?? new Map<string, number>();\n }\n\n /**\n * Compute statistics from a graph store instance.\n */\n static fromGraphStore(graphStore: unknown, graph = \"\"): GraphStats {\n const store = graphStore as {\n _vertices?: Map<number, unknown>;\n _edges?: Map<number, { label: string }>;\n verticesInGraph?: (g: string) => unknown[];\n edgesInGraph?: (g: string) => { label: string }[];\n vertexLabelCounts?: (g: string) => Map<string, number>;\n labelDegree?: (label: string, g: string) => number;\n degreeDistribution?: (g: string) => Map<number, number>;\n };\n\n if (graph && store.verticesInGraph && store.edgesInGraph) {\n return GraphStats._fromNamedGraph(store, graph);\n }\n\n // Fallback: global stats\n const vertices = store._vertices ?? new Map<number, unknown>();\n const edges = store._edges ?? new Map<number, { label: string }>();\n const numV = vertices.size;\n const numE = edges.size;\n\n const labelCounts = new Map<string, number>();\n for (const edge of edges.values()) {\n const label = edge.label;\n labelCounts.set(label, (labelCounts.get(label) ?? 0) + 1);\n }\n\n const avgOut = numV > 0 ? numE / numV : 0.0;\n\n return new GraphStats({\n numVertices: numV,\n numEdges: numE,\n labelCounts,\n avgOutDegree: avgOut,\n });\n }\n\n private static _fromNamedGraph(store: unknown, graph: string): GraphStats {\n const gs = store as {\n verticesInGraph: (g: string) => unknown[];\n edgesInGraph: (g: string) => { label: string }[];\n vertexLabelCounts: (g: string) => Map<string, number>;\n labelDegree: (label: string, g: string) => number;\n degreeDistribution: (g: string) => Map<number, number>;\n };\n\n const vertices = gs.verticesInGraph(graph);\n const edges = gs.edgesInGraph(graph);\n const numV = vertices.length;\n const numE = edges.length;\n\n const labelCounts = new Map<string, number>();\n for (const edge of edges) {\n labelCounts.set(edge.label, (labelCounts.get(edge.label) ?? 0) + 1);\n }\n\n const avgOut = numV > 0 ? numE / numV : 0.0;\n const vlc = gs.vertexLabelCounts(graph);\n const ldm = new Map<string, number>();\n for (const label of labelCounts.keys()) {\n ldm.set(label, gs.labelDegree(label, graph));\n }\n const dd = gs.degreeDistribution(graph);\n\n return new GraphStats({\n numVertices: numV,\n numEdges: numE,\n labelCounts,\n avgOutDegree: avgOut,\n degreeDistribution: dd,\n graphName: graph,\n vertexLabelCounts: vlc,\n labelDegreeMap: ldm,\n });\n }\n\n labelSelectivity(label: string | null): number {\n if (label === null || this.numEdges === 0) return 1.0;\n return (this.labelCounts.get(label) ?? 0) / this.numEdges;\n }\n\n edgeDensity(): number {\n if (this.numVertices <= 1) return 0.0;\n return this.numEdges / this.numVertices ** 2;\n }\n}\n\n// ---------------------------------------------------------------------------\n// CardinalityEstimator\n// ---------------------------------------------------------------------------\n\nexport class CardinalityEstimator {\n private readonly _columnStats: Map<string, ColumnStats>;\n private readonly _graphStats: GraphStats | null;\n private readonly _graphStore: unknown;\n\n constructor(\n columnStatsOrOpts?:\n | Map<string, ColumnStats>\n | {\n columnStats?: Map<string, ColumnStats>;\n graphStats?: GraphStats;\n graphStore?: unknown;\n }\n | null,\n opts?: { graphStats?: GraphStats; graphStore?: unknown },\n ) {\n if (columnStatsOrOpts instanceof Map) {\n this._columnStats = columnStatsOrOpts;\n this._graphStats = opts?.graphStats ?? null;\n this._graphStore = opts?.graphStore ?? null;\n } else if (\n columnStatsOrOpts !== null &&\n columnStatsOrOpts !== undefined &&\n !(columnStatsOrOpts instanceof Map)\n ) {\n this._columnStats =\n columnStatsOrOpts.columnStats ?? new Map<string, ColumnStats>();\n this._graphStats = columnStatsOrOpts.graphStats ?? opts?.graphStats ?? null;\n this._graphStore = columnStatsOrOpts.graphStore ?? opts?.graphStore ?? null;\n } else {\n this._columnStats = new Map<string, ColumnStats>();\n this._graphStats = opts?.graphStats ?? null;\n this._graphStore = opts?.graphStore ?? null;\n }\n }\n\n estimate(op: Operator, stats: IndexStats): number {\n const n = stats.totalDocs > 0 ? stats.totalDocs : 1.0;\n\n if (op instanceof TermOperator) {\n const fieldName = op.field ?? \"_default\";\n return stats.docFreq(fieldName, op.term);\n }\n if (op instanceof VectorSimilarityOperator) {\n return n * CardinalityEstimator._vectorSelectivity(op.threshold);\n }\n if (op instanceof KNNOperator) {\n return op.k;\n }\n if (op instanceof FilterOperator) {\n return n * this._filterSelectivity(op.field, op.predicate, n);\n }\n if (op instanceof ScoreOperator) {\n return this.estimate(op.source, stats);\n }\n if (op instanceof IntersectOperator) {\n const childCards = op.operands\n .map((o) => this.estimate(o, stats))\n .sort((a, b) => a - b);\n if (childCards.length === 0) return 0.0;\n\n const damping = this._intersectionDamping(op.operands);\n let result = childCards[0]!;\n for (let i = 1; i < childCards.length; i++) {\n const sel = n > 0 ? childCards[i]! / n : 1.0;\n result *= sel ** damping;\n }\n\n // Apply entropy-based lower bound when column stats are available\n if (this._columnStats.size > 0) {\n const entropies: number[] = [];\n for (const opItem of op.operands) {\n if (opItem instanceof FilterOperator && opItem.field) {\n const cs = this._columnStats.get(opItem.field);\n if (cs !== undefined) {\n entropies.push(columnEntropy(cs));\n }\n }\n }\n if (entropies.length > 0) {\n const lb = entropyCardinalityLowerBound(n, entropies);\n result = Math.max(result, lb);\n }\n }\n\n return Math.max(1.0, result);\n }\n if (op instanceof UnionOperator) {\n const childCards = op.operands.map((o) => this.estimate(o, stats));\n return Math.min(\n n,\n childCards.reduce((a, b) => a + b, 0),\n );\n }\n if (op instanceof ComplementOperator) {\n const innerCard = this.estimate(op.operand, stats);\n return Math.max(0.0, n - innerCard);\n }\n\n // Threshold / score / multi-stage\n if (op instanceof SparseThresholdOperator) {\n return this.estimate(op.source, stats) * 0.5;\n }\n if (op instanceof MultiStageOperator) {\n if (op.stages.length === 0) return 0;\n const [, cutoff] = op.stages[op.stages.length - 1]!;\n if (typeof cutoff === \"number\") return cutoff;\n return n * 0.5;\n }\n\n // Fallback: use operator's own cost estimate\n return Math.max(1, Math.floor(op.costEstimate(stats)));\n }\n\n private _intersectionDamping(ops: Operator[]): number {\n const fields: string[] = [];\n for (const op of ops) {\n if (op instanceof FilterOperator) {\n fields.push(op.field);\n }\n }\n\n if (fields.length < 2) return 0.5;\n if (new Set(fields).size === 1) return 0.1;\n\n // Use mutual information estimate when stats are available\n if (this._columnStats.size > 0 && fields.length >= 2) {\n const csA = this._columnStats.get(fields[0]!);\n const csB = this._columnStats.get(fields[1]!);\n if (csA !== undefined && csB !== undefined) {\n const mi = mutualInformationEstimate(csA, csB, 0.1);\n if (mi > 1.0) return 0.2;\n if (mi > 0.5) return 0.3;\n }\n }\n\n return 0.5;\n }\n\n private static _vectorSelectivity(threshold: number): number {\n if (threshold >= 0.9) return 0.01;\n if (threshold >= 0.7) return 0.05;\n if (threshold >= 0.5) return 0.1;\n return 0.2;\n }\n\n /**\n * Estimate cardinality of a join operand, handling untyped objects.\n */\n estimateJoinSide(side: unknown, stats: IndexStats, n: number): number {\n if (side instanceof Operator) {\n return this.estimate(side, stats);\n }\n if (\n side !== null &&\n side !== undefined &&\n typeof (side as { execute?: unknown }).execute === \"function\"\n ) {\n return n;\n }\n return n;\n }\n\n /**\n * Approximate cardinality via random walk sampling (Section 6.3, Paper 2).\n * Returns estimated number of pattern matches, or -1 if sampling\n * is unavailable (no graph store or empty graph).\n */\n sampleGraphCardinality(\n pattern: {\n vertexPatterns?: { variable: string; constraints: ((v: unknown) => boolean)[] }[];\n edgePatterns?: {\n sourceVar: string;\n targetVar: string;\n label: string | null;\n }[];\n },\n sampleSize = 100,\n ): number {\n if (this._graphStats === null) return -1;\n const nv = this._graphStats.numVertices;\n if (nv <= 0) return 0;\n\n const vertexPatterns = pattern.vertexPatterns ?? [];\n const edgePatterns = pattern.edgePatterns ?? [];\n const k = vertexPatterns.length;\n if (k === 0) return 0;\n\n // Without access to the actual graph store, fall back to formula-based estimate\n const ne = this._graphStats.numEdges;\n const density = ne > 0 && nv > 0 ? ne / (nv * nv) : 0.01;\n\n // Label selectivity for edges\n let labelSel = 1.0;\n for (const ep of edgePatterns) {\n if (ep.label !== null) {\n labelSel *= this._graphStats.labelSelectivity(ep.label);\n }\n }\n\n // N^k * density^|E| * label_selectivity\n void sampleSize; // reserved for future random walk implementation\n const rawEstimate =\n Math.pow(nv, k) * Math.pow(density, edgePatterns.length) * labelSel;\n return Math.max(1, Math.floor(rawEstimate));\n }\n\n estimateJoin(leftCard: number, rightCard: number, domainSize: number): number {\n if (domainSize <= 0) return 0.0;\n return (leftCard * rightCard) / domainSize;\n }\n\n private _filterSelectivity(field: string, predicate: unknown, _n: number): number {\n const cs = this._columnStats.get(field);\n if (cs === undefined || cs.distinctCount <= 0) return 0.5;\n\n const ndv = cs.distinctCount;\n let selectivity: number;\n\n // Check predicate type by duck typing\n const pred = predicate as {\n type?: string;\n target?: unknown;\n low?: unknown;\n high?: unknown;\n values?: unknown[];\n };\n const predType =\n (pred as { constructor?: { name?: string } }).constructor?.name ?? \"\";\n\n if (predType === \"Equals\" || pred.type === \"equals\") {\n selectivity = CardinalityEstimator._equalitySelectivity(cs, pred.target, ndv);\n } else if (predType === \"NotEquals\" || pred.type === \"not_equals\") {\n selectivity =\n 1.0 - CardinalityEstimator._equalitySelectivity(cs, pred.target, ndv);\n } else if (predType === \"InSet\" || pred.type === \"in_set\") {\n selectivity = Math.min(\n 1.0,\n (pred.values ?? []).reduce(\n (sum: number, v: unknown) =>\n sum + CardinalityEstimator._equalitySelectivity(cs, v, ndv),\n 0,\n ),\n );\n } else if (predType === \"Between\" || pred.type === \"between\") {\n selectivity = this._rangeSelectivity(cs, pred.low, pred.high);\n } else if (\n predType === \"GreaterThan\" ||\n predType === \"GreaterThanOrEqual\" ||\n pred.type === \"gt\" ||\n pred.type === \"gte\"\n ) {\n selectivity = this._gtSelectivity(cs, pred.target);\n } else if (\n predType === \"LessThan\" ||\n predType === \"LessThanOrEqual\" ||\n pred.type === \"lt\" ||\n pred.type === \"lte\"\n ) {\n selectivity = this._ltSelectivity(cs, pred.target);\n } else {\n selectivity = 0.5;\n }\n\n // Entropy-based lower bound\n if (cs.distinctCount > 1) {\n const h = columnEntropy(cs);\n if (h > 0) {\n const minSel = 1.0 / 2.0 ** h;\n selectivity = Math.max(minSel, selectivity);\n }\n }\n\n return selectivity;\n }\n\n private static _equalitySelectivity(\n cs: ColumnStats,\n target: unknown,\n ndv: number,\n ): number {\n if (cs.mcvValues.length > 0) {\n for (let i = 0; i < cs.mcvValues.length; i++) {\n if (cs.mcvValues[i] === target) {\n return cs.mcvFrequencies[i]!;\n }\n }\n }\n return ndv > 0 ? 1.0 / ndv : 1.0;\n }\n\n static histogramFraction(boundaries: unknown[], low: unknown, high: unknown): number {\n if (boundaries.length < 2) return 0.5;\n\n const nBuckets = boundaries.length - 1;\n let overlapping = 0.0;\n for (let i = 0; i < nBuckets; i++) {\n const bLow = boundaries[i] as number;\n const bHigh = boundaries[i + 1] as number;\n try {\n if ((high as number) < bLow || (low as number) > bHigh) continue;\n if ((low as number) <= bLow && (high as number) >= bHigh) {\n overlapping += 1.0;\n } else {\n const bSpan = bHigh - bLow;\n if (bSpan <= 0) {\n overlapping += 1.0;\n continue;\n }\n const clampLow = Math.max(low as number, bLow);\n const clampHigh = Math.min(high as number, bHigh);\n overlapping += (clampHigh - clampLow) / bSpan;\n }\n } catch {\n overlapping += 1.0;\n }\n }\n\n return Math.max(0.0, Math.min(1.0, overlapping / nBuckets));\n }\n\n private _rangeSelectivity(cs: ColumnStats, low: unknown, high: unknown): number {\n if (cs.histogram.length > 0) {\n return CardinalityEstimator.histogramFraction(cs.histogram, low, high);\n }\n if (cs.minValue != null && cs.maxValue != null) {\n try {\n const span = (cs.maxValue as number) - (cs.minValue as number);\n if (span > 0) {\n return Math.max(\n 0.0,\n Math.min(1.0, ((high as number) - (low as number)) / span),\n );\n }\n } catch {\n // Fall through\n }\n }\n return 0.25;\n }\n\n private _gtSelectivity(cs: ColumnStats, target: unknown): number {\n if (cs.histogram.length > 0) {\n return CardinalityEstimator.histogramFraction(\n cs.histogram,\n target,\n cs.histogram[cs.histogram.length - 1],\n );\n }\n if (cs.minValue != null && cs.maxValue != null) {\n try {\n const span = (cs.maxValue as number) - (cs.minValue as number);\n if (span > 0) {\n return Math.max(0.0, ((cs.maxValue as number) - (target as number)) / span);\n }\n } catch {\n // Fall through\n }\n }\n return 1.0 / 3.0;\n }\n\n private _ltSelectivity(cs: ColumnStats, target: unknown): number {\n if (cs.histogram.length > 0) {\n return CardinalityEstimator.histogramFraction(\n cs.histogram,\n cs.histogram[0],\n target,\n );\n }\n if (cs.minValue != null && cs.maxValue != null) {\n try {\n const span = (cs.maxValue as number) - (cs.minValue as number);\n if (span > 0) {\n return Math.max(0.0, ((target as number) - (cs.minValue as number)) / span);\n }\n } catch {\n // Fall through\n }\n }\n return 1.0 / 3.0;\n }\n\n // -- Graph cardinality estimators ------------------------------------------\n\n estimateGraphPattern(patternSize: number, edgeLabels?: string[]): number {\n if (this._graphStats === null) return 1;\n\n const gs = this._graphStats;\n const nv = gs.numVertices > 0 ? gs.numVertices : 1;\n\n const vertexCount = Math.max(1, Math.ceil(patternSize / 2));\n const edgeCount = Math.max(0, patternSize - vertexCount);\n\n const density = nv > 1 ? gs.numEdges / (nv * nv) : 0;\n\n let labelSel = 1.0;\n if (edgeLabels !== undefined && gs.numEdges > 0) {\n for (const label of edgeLabels) {\n const count = gs.labelCounts.get(label) ?? 0;\n labelSel *= count / gs.numEdges;\n }\n }\n\n let vertexSel = 1.0;\n if (gs.vertexLabelCounts.size > 0 && nv > 0) {\n let totalVlc = 0;\n for (const v of gs.vertexLabelCounts.values()) totalVlc += v;\n const avgVertexSel = totalVlc / (gs.vertexLabelCounts.size * nv);\n vertexSel = Math.pow(Math.min(1.0, avgVertexSel), vertexCount);\n }\n\n const estimate =\n Math.pow(nv, vertexCount) * Math.pow(density, edgeCount) * labelSel * vertexSel;\n\n return Math.max(1, Math.min(nv, Math.floor(estimate)));\n }\n\n estimatePathQuery(pathLength: number, edgeLabel?: string): number {\n if (this._graphStats === null) return 1;\n\n const gs = this._graphStats;\n const nv = gs.numVertices > 0 ? gs.numVertices : 1;\n\n let branching = gs.avgOutDegree;\n if (edgeLabel !== undefined && gs.numEdges > 0) {\n const labelCount = gs.labelCounts.get(edgeLabel) ?? 0;\n const labelSel = labelCount / gs.numEdges;\n branching *= labelSel;\n }\n\n const raw = nv * Math.pow(branching, pathLength);\n return Math.max(1, Math.min(Math.floor(raw), gs.numEdges));\n }\n\n estimateTraverse(hops: number, label: string | null = null): number {\n if (this._graphStats !== null) {\n const gs = this._graphStats;\n let branching: number;\n if (label && gs.labelDegreeMap.size > 0) {\n branching =\n gs.labelDegreeMap.get(label) ?? gs.avgOutDegree * gs.labelSelectivity(label);\n } else {\n const sel = gs.labelSelectivity(label);\n branching = gs.avgOutDegree * sel;\n }\n const nv = gs.numVertices > 0 ? gs.numVertices : 1;\n return Math.min(nv, branching ** hops);\n }\n const n = 1000; // fallback\n return Math.min(n, Math.min(n * 0.1, 10.0) ** hops);\n }\n\n estimatePatternMatch(\n vertexCount: number,\n edgeCount: number,\n edgeLabels: string[] = [],\n ): number {\n if (this._graphStats !== null) {\n const gs = this._graphStats;\n const nv = gs.numVertices > 0 ? gs.numVertices : 1;\n const density = gs.edgeDensity();\n let labelSel = 1.0;\n for (const label of edgeLabels) {\n labelSel *= gs.labelSelectivity(label);\n }\n const estimate = nv ** vertexCount * density ** edgeCount * labelSel;\n return Math.max(1.0, Math.min(nv, estimate));\n }\n return 1;\n }\n\n // -- Cross-paradigm estimation (fusion/hybrid operators) --------------------\n\n /**\n * Estimate cardinality for cross-paradigm operators that combine\n * text retrieval, graph traversal, and vector similarity.\n */\n estimateCrossParadigm(op: Operator, stats: IndexStats, paradigm: string): number {\n const n = stats.totalDocs > 0 ? stats.totalDocs : 1.0;\n\n switch (paradigm) {\n case \"text_graph\": {\n // Text retrieval intersected with graph traversal\n const textCard = this.estimate(op, stats);\n const graphSel =\n this._graphStats !== null\n ? Math.min(\n 1.0,\n this._graphStats.avgOutDegree /\n Math.max(1, this._graphStats.numVertices),\n )\n : 0.1;\n return Math.max(1, Math.floor(textCard * graphSel));\n }\n case \"text_vector\": {\n // Text retrieval fused with vector similarity\n const textCard = this.estimate(op, stats);\n return Math.max(1, Math.floor(textCard * 0.3));\n }\n case \"graph_vector\": {\n // Graph traversal fused with vector similarity\n const graphCard =\n this._graphStats !== null\n ? Math.min(n, this._graphStats.avgOutDegree ** 2)\n : n * 0.1;\n return Math.max(1, Math.floor(graphCard * 0.2));\n }\n case \"text_graph_vector\": {\n // Triple fusion\n const textCard = this.estimate(op, stats);\n const graphSel =\n this._graphStats !== null\n ? Math.min(\n 1.0,\n this._graphStats.avgOutDegree /\n Math.max(1, this._graphStats.numVertices),\n )\n : 0.1;\n return Math.max(1, Math.floor(textCard * graphSel * 0.3));\n }\n case \"log_odds_fusion\": {\n // Log-odds fusion: result is bounded by the smallest signal\n return Math.max(1, Math.floor(n * 0.15));\n }\n case \"prob_bool_fusion\": {\n // Probabilistic boolean fusion\n return Math.max(1, Math.floor(n * 0.25));\n }\n case \"attention_fusion\": {\n // Attention-weighted fusion\n return Math.max(1, Math.floor(n * 0.2));\n }\n case \"learned_fusion\": {\n // Learned fusion weights\n return Math.max(1, Math.floor(n * 0.2));\n }\n default:\n return Math.max(1, Math.floor(n * 0.5));\n }\n }\n\n // -- Temporal pattern estimates ---------------------------------------------\n\n /**\n * Estimate cardinality for temporal graph pattern queries.\n * Takes into account the time range selectivity.\n */\n estimateTemporalPattern(\n vertexCount: number,\n edgeCount: number,\n edgeLabels: string[],\n timeRangeStart: number | null,\n timeRangeEnd: number | null,\n ): number {\n const baseEstimate = this.estimatePatternMatch(vertexCount, edgeCount, edgeLabels);\n\n if (this._graphStats === null) return baseEstimate;\n const gs = this._graphStats;\n\n // Apply time range selectivity\n let timeSel = 1.0;\n if (\n timeRangeStart !== null &&\n timeRangeEnd !== null &&\n gs.minTimestamp !== null &&\n gs.maxTimestamp !== null\n ) {\n const totalSpan = gs.maxTimestamp - gs.minTimestamp;\n if (totalSpan > 0) {\n const querySpan =\n Math.min(timeRangeEnd, gs.maxTimestamp) -\n Math.max(timeRangeStart, gs.minTimestamp);\n timeSel = Math.max(0.0, Math.min(1.0, querySpan / totalSpan));\n }\n } else if (timeRangeStart !== null || timeRangeEnd !== null) {\n // One-sided temporal constraint\n timeSel = 0.5;\n }\n\n return Math.max(1, Math.floor(baseEstimate * timeSel));\n }\n\n /**\n * Estimate cardinality for temporal traversal with time-filtered edges.\n */\n estimateTemporalTraverse(\n hops: number,\n label: string | null,\n timeRangeStart: number | null,\n timeRangeEnd: number | null,\n ): number {\n const baseEstimate = this.estimateTraverse(hops, label);\n\n if (this._graphStats === null) return baseEstimate;\n const gs = this._graphStats;\n\n let timeSel = 1.0;\n if (\n timeRangeStart !== null &&\n timeRangeEnd !== null &&\n gs.minTimestamp !== null &&\n gs.maxTimestamp !== null\n ) {\n const totalSpan = gs.maxTimestamp - gs.minTimestamp;\n if (totalSpan > 0) {\n const querySpan =\n Math.min(timeRangeEnd, gs.maxTimestamp) -\n Math.max(timeRangeStart, gs.minTimestamp);\n timeSel = Math.max(0.0, Math.min(1.0, querySpan / totalSpan));\n }\n }\n\n // Temporal selectivity compounds per hop\n return Math.max(1, Math.floor(baseEstimate * Math.pow(timeSel, hops)));\n }\n\n // -- Weighted RPQ estimates ------------------------------------------------\n\n /**\n * Estimate cardinality for weighted regular path queries.\n * Weighted RPQ considers edge weights/probabilities alongside the\n * structural path pattern.\n */\n estimateWeightedRPQ(\n pathLength: number,\n edgeLabels: string[],\n weightThreshold: number | null,\n ): number {\n const baseEstimate = this.estimatePathQuery(\n pathLength,\n edgeLabels.length > 0 ? edgeLabels[0] : undefined,\n );\n\n // Weight threshold filters out low-weight paths\n let weightSel = 1.0;\n if (weightThreshold !== null) {\n // Assume weights are uniformly distributed [0, 1]\n // Paths with all edges above threshold: threshold^pathLength\n weightSel = Math.pow(1.0 - weightThreshold, pathLength);\n }\n\n // Multiple labels reduce cardinality further\n if (edgeLabels.length > 1 && this._graphStats !== null) {\n const gs = this._graphStats;\n let labelSel = 1.0;\n for (const label of edgeLabels) {\n labelSel *= gs.labelSelectivity(label);\n }\n return Math.max(1, Math.floor(baseEstimate * weightSel * labelSel));\n }\n\n return Math.max(1, Math.floor(baseEstimate * weightSel));\n }\n\n /**\n * Estimate cardinality for bounded regular path queries.\n * A bounded RPQ has min/max repetition constraints.\n */\n estimateBoundedRPQ(\n minLength: number,\n maxLength: number,\n edgeLabel: string | null,\n ): number {\n if (this._graphStats === null) return 1;\n const gs = this._graphStats;\n const nv = gs.numVertices > 0 ? gs.numVertices : 1;\n\n let branching = gs.avgOutDegree;\n if (edgeLabel !== null && gs.numEdges > 0) {\n branching *= gs.labelSelectivity(edgeLabel);\n }\n\n // Sum of reachable paths for lengths [minLength, maxLength]\n let total = 0;\n for (let len = minLength; len <= maxLength; len++) {\n total += nv * Math.pow(branching, len);\n }\n\n // Deduplicate (same start/end pair may be reached via different lengths)\n const dedup = total / (maxLength - minLength + 1);\n return Math.max(1, Math.min(Math.floor(dedup), gs.numEdges));\n }\n}\n\n// -- Information-Theoretic Bounds (Paper 1, Section 7) --\n\nexport function columnEntropy(cs: ColumnStats): number {\n const ndv = cs.distinctCount;\n if (ndv <= 1) return 0.0;\n\n // If MCV frequencies are available, use them\n const mcvFreqs = cs.mcvFrequencies;\n if (mcvFreqs.length > 0) {\n let entropy = 0.0;\n let remaining = 1.0;\n for (const freq of mcvFreqs) {\n remaining -= freq;\n if (freq > 0) {\n entropy -= freq * Math.log2(freq);\n }\n }\n const remainingNdv = Math.max(1, ndv - mcvFreqs.length);\n if (remaining > 0 && remainingNdv > 0) {\n const p = remaining / remainingNdv;\n entropy -= remaining * Math.log2(p);\n }\n return Math.max(0.0, entropy);\n }\n\n // If histogram buckets are available\n const histogram = cs.histogram;\n if (histogram.length > 1) {\n const numBuckets = histogram.length - 1;\n const p = 1.0 / numBuckets;\n return -numBuckets * p * Math.log2(p);\n }\n\n // Uniform assumption\n return Math.log2(ndv);\n}\n\nexport function mutualInformationEstimate(\n csX: ColumnStats,\n csY: ColumnStats,\n jointSelectivity: number,\n): number {\n const hX = columnEntropy(csX);\n const hY = columnEntropy(csY);\n\n if (jointSelectivity <= 0) return 0.0;\n\n const ndvX = Math.max(1, csX.distinctCount);\n const ndvY = Math.max(1, csY.distinctCount);\n const independentNdv = ndvX * ndvY;\n const effectiveNdv = Math.max(1, independentNdv * jointSelectivity);\n const hJoint = Math.log2(Math.max(1, effectiveNdv));\n return Math.max(0.0, hX + hY - hJoint);\n}\n\nexport function entropyCardinalityLowerBound(n: number, entropies: number[]): number {\n if (entropies.length === 0 || n <= 0) return 1.0;\n const totalEntropy = entropies.reduce((a, b) => a + b, 0);\n const lb = n * 2.0 ** -totalEntropy;\n return Math.max(1.0, lb);\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- aggregation operators\n// 1:1 port of uqa/operators/aggregation.py\n\nimport type { DocId, IndexStats } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"./base.js\";\nimport { Operator } from \"./base.js\";\n\n// -- Aggregation Monoids -----------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\nexport abstract class AggregationMonoid<S, V, R> {\n abstract identity(): S;\n abstract accumulate(state: S, value: V): S;\n abstract combine(stateA: S, stateB: S): S;\n abstract finalize(state: S): R;\n}\n\nexport class CountMonoid extends AggregationMonoid<number, unknown, number> {\n identity(): number {\n return 0;\n }\n accumulate(state: number, _value: unknown): number {\n return state + 1;\n }\n combine(a: number, b: number): number {\n return a + b;\n }\n finalize(state: number): number {\n return state;\n }\n}\n\nexport class SumMonoid extends AggregationMonoid<number, number, number> {\n identity(): number {\n return 0;\n }\n accumulate(state: number, value: number): number {\n return state + value;\n }\n combine(a: number, b: number): number {\n return a + b;\n }\n finalize(state: number): number {\n return state;\n }\n}\n\nexport class AvgMonoid extends AggregationMonoid<[number, number], number, number> {\n identity(): [number, number] {\n return [0, 0];\n }\n accumulate(state: [number, number], value: number): [number, number] {\n return [state[0] + value, state[1] + 1];\n }\n combine(a: [number, number], b: [number, number]): [number, number] {\n return [a[0] + b[0], a[1] + b[1]];\n }\n finalize(state: [number, number]): number {\n return state[1] === 0 ? 0 : state[0] / state[1];\n }\n}\n\nexport class MinMonoid extends AggregationMonoid<number, number, number> {\n identity(): number {\n return Infinity;\n }\n accumulate(state: number, value: number): number {\n return Math.min(state, value);\n }\n combine(a: number, b: number): number {\n return Math.min(a, b);\n }\n finalize(state: number): number {\n return state;\n }\n}\n\nexport class MaxMonoid extends AggregationMonoid<number, number, number> {\n identity(): number {\n return -Infinity;\n }\n accumulate(state: number, value: number): number {\n return Math.max(state, value);\n }\n combine(a: number, b: number): number {\n return Math.max(a, b);\n }\n finalize(state: number): number {\n return state;\n }\n}\n\nexport class QuantileMonoid extends AggregationMonoid<number[], number, number> {\n readonly quantile: number;\n\n constructor(quantile = 0.5) {\n super();\n if (quantile < 0 || quantile > 1) {\n throw new Error(\"quantile must be in [0, 1]\");\n }\n this.quantile = quantile;\n }\n\n identity(): number[] {\n return [];\n }\n accumulate(state: number[], value: number): number[] {\n state.push(value);\n return state;\n }\n combine(a: number[], b: number[]): number[] {\n return [...a, ...b];\n }\n finalize(state: number[]): number {\n if (state.length === 0) return 0;\n const sorted = state.slice().sort((a, b) => a - b);\n const n = sorted.length;\n const idx = this.quantile * (n - 1);\n const lower = Math.floor(idx);\n const upper = Math.min(lower + 1, n - 1);\n const frac = idx - lower;\n return sorted[lower]! * (1 - frac) + sorted[upper]! * frac;\n }\n}\n\n// -- AggregateOperator -------------------------------------------------------\n\nexport class AggregateOperator extends Operator {\n readonly source: Operator | null;\n readonly field: string;\n readonly monoid: AggregationMonoid<unknown, unknown, unknown>;\n\n constructor(\n source: Operator | null,\n field: string,\n monoid: AggregationMonoid<unknown, unknown, unknown>,\n ) {\n super();\n this.source = source;\n this.field = field;\n this.monoid = monoid;\n }\n\n execute(context: ExecutionContext): PostingList {\n const docStore = context.documentStore;\n\n let docIds: DocId[];\n if (this.source) {\n docIds = this.source.execute(context).entries.map((e) => e.docId);\n } else {\n docIds = docStore ? [...docStore.docIds].sort((a, b) => a - b) : [];\n }\n\n let state = this.monoid.identity();\n for (const docId of docIds) {\n const value = docStore ? docStore.getField(docId, this.field) : undefined;\n if (value !== null && value !== undefined) {\n state = this.monoid.accumulate(state, value);\n }\n }\n\n const resultValue = this.monoid.finalize(state);\n const score = typeof resultValue === \"number\" ? resultValue : 0;\n\n return PostingList.fromSorted([\n {\n docId: 0,\n payload: createPayload({\n score,\n fields: { _aggregate_field: this.field, _aggregate: resultValue },\n }),\n },\n ]);\n }\n\n costEstimate(stats: IndexStats): number {\n return stats.totalDocs;\n }\n}\n\n// -- GroupByOperator ---------------------------------------------------------\n\nexport class GroupByOperator extends Operator {\n readonly source: Operator;\n readonly groupField: string;\n readonly aggField: string;\n readonly monoid: AggregationMonoid<unknown, unknown, unknown>;\n\n constructor(\n source: Operator,\n groupField: string,\n aggField: string,\n monoid: AggregationMonoid<unknown, unknown, unknown>,\n ) {\n super();\n this.source = source;\n this.groupField = groupField;\n this.aggField = aggField;\n this.monoid = monoid;\n }\n\n execute(context: ExecutionContext): PostingList {\n const sourcePl = this.source.execute(context);\n const docStore = context.documentStore;\n if (!docStore) return new PostingList();\n\n const groups = new Map<string, unknown>();\n\n for (const entry of sourcePl) {\n const groupValue = docStore.getField(entry.docId, this.groupField);\n if (groupValue === null || groupValue === undefined) continue;\n const groupKey = String(groupValue as string | number);\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, this.monoid.identity());\n }\n\n const aggValue = docStore.getField(entry.docId, this.aggField);\n if (aggValue !== null && aggValue !== undefined) {\n groups.set(groupKey, this.monoid.accumulate(groups.get(groupKey), aggValue));\n }\n }\n\n const sorted = [...groups.entries()].sort((a, b) => a[0].localeCompare(b[0]));\n const entries = sorted.map(([groupKey, state], idx) => {\n const resultValue = this.monoid.finalize(state);\n const score = typeof resultValue === \"number\" ? resultValue : 0;\n return {\n docId: idx,\n payload: createPayload({\n score,\n fields: {\n _group_key: groupKey,\n _group_field: this.groupField,\n _aggregate_result: resultValue,\n },\n }),\n };\n });\n\n return PostingList.fromSorted(entries);\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Temporal pattern match operator\n// 1:1 port of uqa/graph/temporal_pattern_match.py\n\nimport type { PostingEntry } from \"../core/types.js\";\nimport { createPostingEntry } from \"../core/types.js\";\nimport type { PostingList } from \"../core/posting-list.js\";\nimport { Operator } from \"../operators/base.js\";\nimport type { ExecutionContext } from \"../operators/base.js\";\nimport type { GraphStore } from \"../storage/abc/graph-store.js\";\nimport { GraphPostingList, createGraphPayload } from \"./posting-list.js\";\nimport type { GraphPattern } from \"./pattern.js\";\nimport type { TemporalFilter } from \"./temporal-filter.js\";\n\n// -- TemporalPatternMatchOperator ---------------------------------------------\n\nexport class TemporalPatternMatchOperator extends Operator {\n readonly pattern: GraphPattern;\n readonly graph: string;\n readonly temporalFilter: TemporalFilter;\n readonly score: number;\n\n constructor(opts: {\n pattern: GraphPattern;\n graph: string;\n temporalFilter: TemporalFilter;\n score?: number;\n }) {\n super();\n this.pattern = opts.pattern;\n this.graph = opts.graph;\n this.temporalFilter = opts.temporalFilter;\n this.score = opts.score ?? 1.0;\n }\n\n execute(context: ExecutionContext): PostingList {\n const store = context.graphStore as GraphStore;\n const results = this._backtrackSearch(store);\n return this._buildPostingList(store, results);\n }\n\n private _backtrackSearch(store: GraphStore): Array<Map<string, number>> {\n const candidates = this._computeCandidates(store);\n const results: Array<Map<string, number>> = [];\n const assignment = new Map<string, number>();\n const variables = this.pattern.vertexPatterns.map((vp) => vp.variable);\n\n this._backtrack(store, variables, 0, assignment, candidates, results);\n return results;\n }\n\n private _computeCandidates(store: GraphStore): Map<string, Set<number>> {\n const candidates = new Map<string, Set<number>>();\n const allVertexIds = store.vertexIdsInGraph(this.graph);\n\n for (const vp of this.pattern.vertexPatterns) {\n let candidateSet = new Set(allVertexIds);\n\n if (vp.constraints.length > 0) {\n const filtered = new Set<number>();\n for (const vid of candidateSet) {\n const vertex = store.getVertex(vid);\n if (vertex) {\n let valid = true;\n for (const constraint of vp.constraints) {\n if (!constraint(vertex)) {\n valid = false;\n break;\n }\n }\n if (valid) filtered.add(vid);\n }\n }\n candidateSet = filtered;\n }\n\n candidates.set(vp.variable, candidateSet);\n }\n\n return candidates;\n }\n\n private _backtrack(\n store: GraphStore,\n variables: string[],\n index: number,\n assignment: Map<string, number>,\n candidates: Map<string, Set<number>>,\n results: Array<Map<string, number>>,\n ): void {\n if (index === variables.length) {\n if (this._validateAllEdges(store, assignment)) {\n results.push(new Map(assignment));\n }\n return;\n }\n\n const variable = variables[index]!;\n const candidateSet = candidates.get(variable) ?? new Set<number>();\n const usedVertices = new Set(assignment.values());\n\n for (const vid of candidateSet) {\n if (usedVertices.has(vid)) continue;\n assignment.set(variable, vid);\n\n if (this._validateEdgesFor(store, assignment, variable)) {\n this._backtrack(store, variables, index + 1, assignment, candidates, results);\n }\n\n assignment.delete(variable);\n }\n }\n\n private _validateEdgesFor(\n store: GraphStore,\n assignment: Map<string, number>,\n variable: string,\n ): boolean {\n for (const ep of this.pattern.edgePatterns) {\n if (ep.negated) continue;\n if (ep.sourceVar !== variable && ep.targetVar !== variable) continue;\n\n const srcId = assignment.get(ep.sourceVar);\n const tgtId = assignment.get(ep.targetVar);\n if (srcId === undefined || tgtId === undefined) continue;\n\n // Check for edge with temporal validity\n const outEdges = store.outEdgeIds(srcId, this.graph);\n let found = false;\n for (const eid of outEdges) {\n const edge = store.getEdge(eid);\n if (!edge) continue;\n if (edge.targetId !== tgtId) continue;\n if (ep.label !== null && edge.label !== ep.label) continue;\n if (!this.temporalFilter.isValid(edge)) continue;\n\n // Check edge constraints\n let valid = true;\n for (const constraint of ep.constraints) {\n if (!constraint(edge)) {\n valid = false;\n break;\n }\n }\n if (valid) {\n found = true;\n break;\n }\n }\n if (!found) return false;\n }\n return true;\n }\n\n private _validateAllEdges(\n store: GraphStore,\n assignment: Map<string, number>,\n ): boolean {\n for (const ep of this.pattern.edgePatterns) {\n const srcId = assignment.get(ep.sourceVar);\n const tgtId = assignment.get(ep.targetVar);\n if (srcId === undefined || tgtId === undefined) return false;\n\n if (ep.negated) {\n // Check no temporally valid edge exists\n const outEdges = store.outEdgeIds(srcId, this.graph);\n for (const eid of outEdges) {\n const edge = store.getEdge(eid);\n if (\n edge &&\n edge.targetId === tgtId &&\n (ep.label === null || edge.label === ep.label) &&\n this.temporalFilter.isValid(edge)\n ) {\n return false;\n }\n }\n } else {\n const outEdges = store.outEdgeIds(srcId, this.graph);\n let found = false;\n for (const eid of outEdges) {\n const edge = store.getEdge(eid);\n if (!edge) continue;\n if (edge.targetId !== tgtId) continue;\n if (ep.label !== null && edge.label !== ep.label) continue;\n if (!this.temporalFilter.isValid(edge)) continue;\n found = true;\n break;\n }\n if (!found) return false;\n }\n }\n return true;\n }\n\n private _collectMatchEdges(\n store: GraphStore,\n assignment: Map<string, number>,\n ): Set<number> {\n const edgeIds = new Set<number>();\n for (const ep of this.pattern.edgePatterns) {\n if (ep.negated) continue;\n const srcId = assignment.get(ep.sourceVar);\n const tgtId = assignment.get(ep.targetVar);\n if (srcId === undefined || tgtId === undefined) continue;\n\n const outEdges = store.outEdgeIds(srcId, this.graph);\n for (const eid of outEdges) {\n const edge = store.getEdge(eid);\n if (\n edge &&\n edge.targetId === tgtId &&\n (ep.label === null || edge.label === ep.label) &&\n this.temporalFilter.isValid(edge)\n ) {\n edgeIds.add(eid);\n }\n }\n }\n return edgeIds;\n }\n\n private _buildPostingList(\n store: GraphStore,\n results: Array<Map<string, number>>,\n ): GraphPostingList {\n const entries: PostingEntry[] = [];\n const graphPayloads = new Map<number, ReturnType<typeof createGraphPayload>>();\n\n for (let i = 0; i < results.length; i++) {\n const assignment = results[i]!;\n const vertexIds = new Set(assignment.values());\n const edgeIds = this._collectMatchEdges(store, assignment);\n\n const docId = i;\n const fields: Record<string, unknown> = {};\n for (const [variable, vid] of assignment) {\n fields[variable] = vid;\n }\n\n entries.push(\n createPostingEntry(docId, {\n score: this.score,\n fields,\n }),\n );\n\n graphPayloads.set(\n docId,\n createGraphPayload({\n subgraphVertices: vertexIds,\n subgraphEdges: edgeIds,\n score: this.score,\n graphName: this.graph,\n }),\n );\n }\n\n const gpl = new GraphPostingList(entries);\n for (const [docId, gp] of graphPayloads) {\n gpl.setGraphPayload(docId, gp);\n }\n return gpl;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- cross-paradigm joins\n// 1:1 port of uqa/joins/cross_paradigm.py\n\nimport type { DocId, GeneralizedPostingEntry, PostingEntry } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { GeneralizedPostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"../operators/base.js\";\nimport type { GraphStore } from \"../storage/abc/graph-store.js\";\nimport { DEFAULT_ANALYZER } from \"../analysis/analyzer.js\";\nimport { cosine } from \"../math/linalg.js\";\n\nfunction getEntries(source: unknown, context: ExecutionContext): PostingEntry[] {\n if (\n source !== null &&\n typeof source === \"object\" &&\n \"execute\" in source &&\n typeof (source as { execute: unknown }).execute === \"function\"\n ) {\n const result = (\n source as { execute(ctx: ExecutionContext): { entries: PostingEntry[] } }\n ).execute(context);\n return [...result.entries];\n }\n return source as PostingEntry[];\n}\n\n// -- TextSimilarityJoinOperator ----------------------------------------------\n\nexport class TextSimilarityJoinOperator {\n readonly left: unknown;\n readonly right: unknown;\n readonly leftField: string;\n readonly rightField: string;\n readonly threshold: number;\n\n constructor(\n left: unknown,\n right: unknown,\n leftField: string,\n rightField: string,\n threshold = 0.5,\n ) {\n this.left = left;\n this.right = right;\n this.leftField = leftField;\n this.rightField = rightField;\n this.threshold = threshold;\n }\n\n execute(context: ExecutionContext): GeneralizedPostingList {\n const leftEntries = getEntries(this.left, context);\n const rightEntries = getEntries(this.right, context);\n const result: GeneralizedPostingEntry[] = [];\n\n for (const le of leftEntries) {\n const leftRaw = (le.payload.fields as Record<string, unknown>)[this.leftField];\n const leftText = typeof leftRaw === \"string\" ? leftRaw : \"\";\n const leftTokens = new Set(DEFAULT_ANALYZER.analyze(leftText));\n if (leftTokens.size === 0) continue;\n\n for (const re of rightEntries) {\n const rightRaw = (re.payload.fields as Record<string, unknown>)[\n this.rightField\n ];\n const rightText = typeof rightRaw === \"string\" ? rightRaw : \"\";\n const rightTokens = new Set(DEFAULT_ANALYZER.analyze(rightText));\n if (rightTokens.size === 0) continue;\n\n let intersection = 0;\n for (const t of leftTokens) {\n if (rightTokens.has(t)) intersection++;\n }\n const union = leftTokens.size + rightTokens.size - intersection;\n const jaccard = union > 0 ? intersection / union : 0;\n\n if (jaccard >= this.threshold) {\n result.push({\n docIds: [le.docId, re.docId],\n payload: createPayload({\n score: jaccard,\n fields: {\n ...(le.payload.fields as Record<string, unknown>),\n ...(re.payload.fields as Record<string, unknown>),\n },\n }),\n });\n }\n }\n }\n\n return new GeneralizedPostingList(result);\n }\n}\n\n// -- VectorSimilarityJoinOperator --------------------------------------------\n\nexport class VectorSimilarityJoinOperator {\n readonly left: unknown;\n readonly right: unknown;\n readonly leftField: string;\n readonly rightField: string;\n readonly threshold: number;\n\n constructor(\n left: unknown,\n right: unknown,\n leftField: string,\n rightField: string,\n threshold = 0.5,\n ) {\n this.left = left;\n this.right = right;\n this.leftField = leftField;\n this.rightField = rightField;\n this.threshold = threshold;\n }\n\n execute(context: ExecutionContext): GeneralizedPostingList {\n const leftEntries = getEntries(this.left, context);\n const rightEntries = getEntries(this.right, context);\n const result: GeneralizedPostingEntry[] = [];\n\n for (const le of leftEntries) {\n const leftVec = (le.payload.fields as Record<string, unknown>)[\n this.leftField\n ] as Float64Array | null;\n if (!leftVec) continue;\n\n for (const re of rightEntries) {\n const rightVec = (re.payload.fields as Record<string, unknown>)[\n this.rightField\n ] as Float64Array | null;\n if (!rightVec) continue;\n\n const sim = cosine(leftVec, rightVec);\n if (sim >= this.threshold) {\n result.push({\n docIds: [le.docId, re.docId],\n payload: createPayload({\n score: sim,\n fields: {\n ...(le.payload.fields as Record<string, unknown>),\n ...(re.payload.fields as Record<string, unknown>),\n },\n }),\n });\n }\n }\n }\n\n return new GeneralizedPostingList(result);\n }\n}\n\n// -- HybridJoinOperator ------------------------------------------------------\n\nexport class HybridJoinOperator {\n readonly left: unknown;\n readonly right: unknown;\n readonly structuredField: string;\n readonly vectorField: string;\n readonly threshold: number;\n\n constructor(\n left: unknown,\n right: unknown,\n structuredField: string,\n vectorField: string,\n threshold = 0.5,\n ) {\n this.left = left;\n this.right = right;\n this.structuredField = structuredField;\n this.vectorField = vectorField;\n this.threshold = threshold;\n }\n\n execute(context: ExecutionContext): GeneralizedPostingList {\n const leftEntries = getEntries(this.left, context);\n const rightEntries = getEntries(this.right, context);\n\n // Build index on right by structured field\n const rightIndex = new Map<unknown, PostingEntry[]>();\n for (const re of rightEntries) {\n const key = (re.payload.fields as Record<string, unknown>)[this.structuredField];\n if (key == null) continue;\n let bucket = rightIndex.get(key);\n if (!bucket) {\n bucket = [];\n rightIndex.set(key, bucket);\n }\n bucket.push(re);\n }\n\n const result: GeneralizedPostingEntry[] = [];\n for (const le of leftEntries) {\n const leftKey = (le.payload.fields as Record<string, unknown>)[\n this.structuredField\n ];\n if (leftKey == null) continue;\n const leftVec = (le.payload.fields as Record<string, unknown>)[\n this.vectorField\n ] as Float64Array | null;\n if (!leftVec) continue;\n\n const matches = rightIndex.get(leftKey);\n if (!matches) continue;\n\n for (const re of matches) {\n const rightVec = (re.payload.fields as Record<string, unknown>)[\n this.vectorField\n ] as Float64Array | null;\n if (!rightVec) continue;\n\n const sim = cosine(leftVec, rightVec);\n if (sim >= this.threshold) {\n result.push({\n docIds: [le.docId, re.docId],\n payload: createPayload({\n score: sim,\n fields: {\n ...(le.payload.fields as Record<string, unknown>),\n ...(re.payload.fields as Record<string, unknown>),\n },\n }),\n });\n }\n }\n }\n\n return new GeneralizedPostingList(result);\n }\n}\n\n// -- GraphJoinOperator -------------------------------------------------------\n\nexport class GraphJoinOperator {\n readonly left: unknown;\n readonly right: unknown;\n readonly label: string | null;\n readonly graphName: string;\n\n constructor(\n left: unknown,\n right: unknown,\n label?: string | null,\n graphName = \"test\",\n ) {\n this.left = left;\n this.right = right;\n this.label = label ?? null;\n this.graphName = graphName;\n }\n\n execute(context: ExecutionContext): GeneralizedPostingList {\n const graph = context.graphStore as GraphStore;\n const leftEntries = getEntries(this.left, context);\n const rightEntries = getEntries(this.right, context);\n\n const rightSet = new Map<DocId, PostingEntry>();\n for (const re of rightEntries) {\n rightSet.set(re.docId, re);\n }\n\n const result: GeneralizedPostingEntry[] = [];\n for (const le of leftEntries) {\n const neighbors = graph.neighbors(le.docId, this.graphName, this.label, \"out\");\n for (const neighborId of neighbors) {\n const re = rightSet.get(neighborId);\n if (re) {\n result.push({\n docIds: [le.docId, re.docId],\n payload: createPayload({\n score: le.payload.score + re.payload.score,\n fields: {\n ...(le.payload.fields as Record<string, unknown>),\n ...(re.payload.fields as Record<string, unknown>),\n },\n }),\n });\n }\n }\n }\n\n return new GeneralizedPostingList(result);\n }\n}\n\n// -- CrossParadigmJoinOperator -----------------------------------------------\n\nexport class CrossParadigmJoinOperator {\n readonly left: unknown;\n readonly right: unknown;\n readonly vertexField: string;\n readonly docField: string;\n\n constructor(left: unknown, right: unknown, vertexField: string, docField: string) {\n this.left = left;\n this.right = right;\n this.vertexField = vertexField;\n this.docField = docField;\n }\n\n execute(context: ExecutionContext): GeneralizedPostingList {\n const graph = context.graphStore as GraphStore;\n const leftEntries = getEntries(this.left, context);\n const rightEntries = getEntries(this.right, context);\n\n // Build right index by docField\n const rightIndex = new Map<unknown, PostingEntry[]>();\n for (const re of rightEntries) {\n const key = (re.payload.fields as Record<string, unknown>)[this.docField];\n if (key == null) continue;\n let bucket = rightIndex.get(key);\n if (!bucket) {\n bucket = [];\n rightIndex.set(key, bucket);\n }\n bucket.push(re);\n }\n\n const result: GeneralizedPostingEntry[] = [];\n for (const le of leftEntries) {\n const vertex = graph.getVertex(le.docId);\n let vertexKey: unknown;\n if (vertex) {\n vertexKey = vertex.properties[this.vertexField];\n } else {\n vertexKey = (le.payload.fields as Record<string, unknown>)[this.vertexField];\n }\n if (vertexKey == null) continue;\n\n const matches = rightIndex.get(vertexKey);\n if (!matches) continue;\n\n for (const re of matches) {\n const fields: Record<string, unknown> = {};\n if (vertex) Object.assign(fields, vertex.properties);\n Object.assign(fields, le.payload.fields);\n Object.assign(fields, re.payload.fields);\n\n result.push({\n docIds: [le.docId, re.docId],\n payload: createPayload({\n score: le.payload.score + re.payload.score,\n fields,\n }),\n });\n }\n }\n\n return new GeneralizedPostingList(result);\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- cost model for operator trees\n// 1:1 port of uqa/planner/cost_model.py\n\nimport type { IndexStats } from \"../core/types.js\";\nimport type { Operator } from \"../operators/base.js\";\nimport {\n UnionOperator,\n IntersectOperator,\n ComplementOperator,\n} from \"../operators/boolean.js\";\nimport {\n TermOperator,\n VectorSimilarityOperator,\n KNNOperator,\n FilterOperator,\n ScoreOperator,\n IndexScanOperator,\n} from \"../operators/primitive.js\";\nimport { SparseThresholdOperator } from \"../operators/sparse.js\";\nimport { MultiStageOperator } from \"../operators/multi-stage.js\";\nimport { MultiFieldSearchOperator } from \"../operators/multi-field.js\";\nimport {\n HybridTextVectorOperator,\n SemanticFilterOperator,\n LogOddsFusionOperator,\n ProbBoolFusionOperator,\n VectorExclusionOperator,\n FacetVectorOperator,\n ProbNotOperator,\n AdaptiveLogOddsFusionOperator,\n} from \"../operators/hybrid.js\";\nimport { AggregateOperator, GroupByOperator } from \"../operators/aggregation.js\";\nimport { AttentionFusionOperator } from \"../operators/attention.js\";\nimport { LearnedFusionOperator } from \"../operators/learned-fusion.js\";\nimport { MessagePassingOperator } from \"../graph/message-passing.js\";\nimport { GraphEmbeddingOperator } from \"../graph/graph-embedding.js\";\nimport {\n TraverseOperator,\n PatternMatchOperator,\n RegularPathQueryOperator,\n VertexAggregationOperator,\n} from \"../graph/operators.js\";\nimport { TemporalTraverseOperator } from \"../graph/temporal-traverse.js\";\nimport { TemporalPatternMatchOperator } from \"../graph/temporal-pattern-match.js\";\nimport {\n PageRankOperator,\n HITSOperator,\n BetweennessCentralityOperator,\n} from \"../graph/centrality.js\";\nimport {\n TextSimilarityJoinOperator,\n VectorSimilarityJoinOperator,\n GraphJoinOperator,\n HybridJoinOperator,\n CrossParadigmJoinOperator,\n} from \"../joins/cross-paradigm.js\";\nimport { ProgressiveFusionOperator } from \"../operators/progressive-fusion.js\";\n\n// Named constants for cost estimation weights\nconst SCORE_OVERHEAD_FACTOR = 1.1;\nconst FILTER_SCAN_FRACTION = 0.1;\nconst GROUP_BY_OVERHEAD_FACTOR = 1.5;\nconst VERTEX_AGG_FRACTION = 0.2;\nconst TRAVERSE_FRACTION = 0.1;\n\nexport interface GraphStats {\n numVertices: number;\n avgOutDegree: number;\n labelSelectivity(label: string | null): number;\n}\n\n// ---------------------------------------------------------------------------\n// CostModel\n// ---------------------------------------------------------------------------\n\n/**\n * Operator cost estimation for query optimization (Definition 6.2.1, Paper 1).\n */\nexport class CostModel {\n private _graphStats: GraphStats | null;\n\n constructor(graphStats?: GraphStats | null) {\n this._graphStats = graphStats ?? null;\n }\n\n estimate(op: Operator, stats: IndexStats): number {\n // -- Terminal operators --\n\n if (op instanceof TermOperator) {\n const fieldName = op.field ?? \"_default\";\n return stats.totalDocs > 0 ? stats.docFreq(fieldName, op.term) : 1.0;\n }\n\n if (op instanceof VectorSimilarityOperator) {\n return stats.dimensions * Math.log2(stats.totalDocs + 1);\n }\n\n if (op instanceof KNNOperator) {\n return stats.dimensions * Math.log2(stats.totalDocs + 1);\n }\n\n if (op instanceof IndexScanOperator) {\n return op.costEstimate(stats);\n }\n\n if (op instanceof ScoreOperator) {\n return this.estimate(op.source, stats) * SCORE_OVERHEAD_FACTOR;\n }\n\n if (op instanceof FilterOperator) {\n const base = stats.totalDocs;\n if (op.source !== null) {\n return this.estimate(op.source, stats) + base * FILTER_SCAN_FRACTION;\n }\n return base;\n }\n\n // -- Boolean operators --\n\n if (op instanceof IntersectOperator) {\n let total = 0;\n for (const child of op.operands) {\n total += this.estimate(child, stats);\n }\n return total;\n }\n\n if (op instanceof UnionOperator) {\n let total = 0;\n for (const child of op.operands) {\n total += this.estimate(child, stats);\n }\n return total;\n }\n\n if (op instanceof ComplementOperator) {\n return this.estimate(op.operand, stats) + stats.totalDocs;\n }\n\n // -- Aggregation operators --\n\n if (op instanceof AggregateOperator) {\n return stats.totalDocs;\n }\n\n if (op instanceof GroupByOperator) {\n return stats.totalDocs * GROUP_BY_OVERHEAD_FACTOR;\n }\n\n // -- Fusion operators --\n\n if (op instanceof LogOddsFusionOperator) {\n let total = 0;\n for (const s of op.signals) {\n total += this.estimate(s, stats);\n }\n return total;\n }\n\n if (op instanceof ProbBoolFusionOperator) {\n let total = 0;\n for (const s of op.signals) {\n total += this.estimate(s, stats);\n }\n return total;\n }\n\n if (op instanceof AdaptiveLogOddsFusionOperator) {\n let total = 0;\n for (const s of (op as unknown as { signals: Operator[] }).signals) {\n total += this.estimate(s, stats);\n }\n return total;\n }\n\n if (op instanceof AttentionFusionOperator) {\n let total = 0;\n for (const s of (op as unknown as { signals: Operator[] }).signals) {\n total += this.estimate(s, stats);\n }\n return total;\n }\n\n if (op instanceof LearnedFusionOperator) {\n let total = 0;\n for (const s of (op as unknown as { signals: Operator[] }).signals) {\n total += this.estimate(s, stats);\n }\n return total;\n }\n\n if (op instanceof ProbNotOperator) {\n return this.estimate(op.signal, stats) + stats.totalDocs;\n }\n\n // -- Hybrid operators --\n\n if (op instanceof HybridTextVectorOperator) {\n const htv = op as unknown as { _termOp: Operator; _vectorOp: Operator };\n return this.estimate(htv._termOp, stats) + this.estimate(htv._vectorOp, stats);\n }\n\n if (op instanceof SemanticFilterOperator) {\n const sf = op as unknown as { source: Operator; _vectorOp: Operator };\n return this.estimate(sf.source, stats) + this.estimate(sf._vectorOp, stats);\n }\n\n if (op instanceof VectorExclusionOperator) {\n const ve = op as unknown as { positive: Operator; _negativeOp: Operator };\n return this.estimate(ve.positive, stats) + this.estimate(ve._negativeOp, stats);\n }\n\n if (op instanceof FacetVectorOperator) {\n const fv = op as unknown as { _vectorOp: Operator; source: Operator | null };\n let cost = this.estimate(fv._vectorOp, stats);\n if (fv.source !== null) {\n cost += this.estimate(fv.source, stats);\n }\n return cost;\n }\n\n // -- Graph operators --\n\n if (op instanceof VertexAggregationOperator) {\n return stats.totalDocs * VERTEX_AGG_FRACTION;\n }\n\n if (op instanceof TraverseOperator) {\n if (this._graphStats !== null) {\n const gs = this._graphStats;\n const label = (op as unknown as { label: string | null }).label;\n const hops = (op as unknown as { maxHops: number }).maxHops;\n const sel = gs.labelSelectivity(label);\n const d = gs.avgOutDegree * sel;\n // O(sum d^i for i=1..hops)\n let cost = 0;\n for (let i = 1; i <= hops; i++) {\n cost += Math.pow(d, i);\n }\n return Math.max(1.0, cost);\n }\n return stats.totalDocs * TRAVERSE_FRACTION;\n }\n\n if (op instanceof PatternMatchOperator) {\n const pm = op as unknown as {\n pattern: { vertexPatterns: unknown[]; edgePatterns: { negated: boolean }[] };\n };\n let baseCost: number;\n if (this._graphStats !== null) {\n const gs = this._graphStats;\n const nv = gs.numVertices > 0 ? gs.numVertices : stats.totalDocs;\n const k = pm.pattern.vertexPatterns.length;\n // O(V^k) with pruning factor\n baseCost = Math.max(1.0, Math.pow(nv, k) * 0.01);\n } else {\n baseCost = Math.pow(stats.totalDocs, 2);\n }\n // Negation scan overhead\n let negatedCount = 0;\n for (const ep of pm.pattern.edgePatterns) {\n if (ep.negated) negatedCount++;\n }\n if (negatedCount > 0) {\n baseCost *= 1.0 + 0.2 * negatedCount;\n }\n return baseCost;\n }\n\n if (op instanceof TemporalTraverseOperator) {\n return stats.totalDocs * TRAVERSE_FRACTION;\n }\n\n if (op instanceof TemporalPatternMatchOperator) {\n return Math.pow(stats.totalDocs, 2);\n }\n\n if (op instanceof RegularPathQueryOperator) {\n // Path-indexable expressions are cheaper\n const rpq = op as unknown as { pathExpr: unknown };\n const labels = _extractLabelSequence(rpq.pathExpr);\n if (labels !== null) {\n return stats.totalDocs * 0.1;\n }\n if (this._graphStats !== null) {\n const gs = this._graphStats;\n const nv = gs.numVertices;\n const rSize = _exprLabelCount(rpq.pathExpr);\n return Math.max(1.0, nv * nv * rSize * 0.001);\n }\n return Math.pow(stats.totalDocs, 2);\n }\n\n // -- Sparse / Multi-field / Message passing --\n\n if (op instanceof SparseThresholdOperator) {\n return this.estimate(op.source, stats) * 0.5;\n }\n\n if (op instanceof MultiFieldSearchOperator) {\n const mf = op as unknown as { fields: string[] };\n return stats.totalDocs * mf.fields.length;\n }\n\n if (op instanceof MessagePassingOperator) {\n const mp = op as unknown as { kLayers: number };\n return stats.totalDocs * mp.kLayers;\n }\n\n if (op instanceof GraphEmbeddingOperator) {\n const ge = op as unknown as { kLayers: number };\n return stats.totalDocs * ge.kLayers * 2;\n }\n\n if (op instanceof MultiStageOperator) {\n return op.costEstimate(stats);\n }\n\n // -- Join operators --\n\n const n = stats.totalDocs;\n\n if (op instanceof PageRankOperator) {\n const pr = op as unknown as { maxIterations: number };\n return n * pr.maxIterations * 0.1;\n }\n\n if (op instanceof HITSOperator) {\n const hits = op as unknown as { maxIterations: number };\n return n * hits.maxIterations * 0.2;\n }\n\n if (op instanceof BetweennessCentralityOperator) {\n return n * n * 0.5;\n }\n\n if (op instanceof TextSimilarityJoinOperator) {\n return 2.0 * n * Math.max(stats.dimensions, 10);\n }\n\n if (op instanceof VectorSimilarityJoinOperator) {\n return n * n * Math.max(stats.dimensions, 1);\n }\n\n if (op instanceof GraphJoinOperator) {\n return n * 10.0;\n }\n\n if (op instanceof HybridJoinOperator) {\n return n + n * Math.max(stats.dimensions, 1);\n }\n\n if (op instanceof CrossParadigmJoinOperator) {\n return n * 10.0;\n }\n\n if (op instanceof ProgressiveFusionOperator) {\n return op.costEstimate(stats);\n }\n\n // Fallback\n return n;\n }\n}\n\n// -- Helpers ------------------------------------------------------------------\n\nimport {\n Label,\n Concat,\n Alternation,\n KleeneStar,\n BoundedLabel,\n} from \"../graph/pattern.js\";\n\nfunction _extractLabelSequence(expr: unknown): string[] | null {\n if (expr instanceof Label) {\n return [(expr as unknown as { label: string }).label];\n }\n if (expr instanceof Concat) {\n const c = expr as unknown as { left: unknown; right: unknown };\n const leftLabels = _extractLabelSequence(c.left);\n const rightLabels = _extractLabelSequence(c.right);\n if (leftLabels !== null && rightLabels !== null) {\n return [...leftLabels, ...rightLabels];\n }\n return null;\n }\n return null;\n}\n\nfunction _exprLabelCount(expr: unknown): number {\n if (expr instanceof Label) {\n return 1;\n }\n if (expr instanceof Concat || expr instanceof Alternation) {\n const c = expr as unknown as { left: unknown; right: unknown };\n return _exprLabelCount(c.left) + _exprLabelCount(c.right);\n }\n if (expr instanceof KleeneStar) {\n const k = expr as unknown as { inner: unknown };\n return _exprLabelCount(k.inner) * 2;\n }\n if (expr instanceof BoundedLabel) {\n const b = expr as unknown as { inner: unknown; maxHops: number };\n return _exprLabelCount(b.inner) * b.maxHops;\n }\n return 1;\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- query optimizer with rewrite rules\n// 1:1 port of uqa/planner/optimizer.py\n//\n// Rewrite rules (Theorem 6.1.2, Paper 1):\n// 1. _simplifyAlgebra -- algebraic simplification\n// 2. _pushFiltersDown -- filter pushdown into intersections\n// 3. _pushGraphPatternFilters -- push filters into graph pattern constraints\n// 4. _pushFilterIntoTraverse -- push vertex filters into BFS pruning\n// 5. _pushFilterBelowGraphJoin -- push filters below graph joins\n// 6. _fuseJoinPattern -- fuse intersected pattern matches\n// 7. _mergeVectorThresholds -- merge duplicate vector threshold ops\n// 8. _reorderIntersect -- reorder intersection operands by cardinality\n// 9. _reorderFusionSignals -- reorder fusion signal inputs by cost\n// 10. _applyIndexScan -- substitute filter scans with index scans\n\nimport type { IndexStats } from \"../core/types.js\";\nimport type { ColumnStats } from \"../sql/table.js\";\nimport type { IndexManager } from \"../storage/index-manager.js\";\nimport type { Operator } from \"../operators/base.js\";\nimport { ComposedOperator } from \"../operators/base.js\";\nimport {\n UnionOperator,\n IntersectOperator,\n ComplementOperator,\n} from \"../operators/boolean.js\";\nimport {\n TermOperator,\n VectorSimilarityOperator,\n FilterOperator,\n ScoreOperator,\n IndexScanOperator,\n} from \"../operators/primitive.js\";\nimport { SparseThresholdOperator } from \"../operators/sparse.js\";\nimport {\n LogOddsFusionOperator,\n ProbBoolFusionOperator,\n ProbNotOperator,\n} from \"../operators/hybrid.js\";\nimport { AttentionFusionOperator } from \"../operators/attention.js\";\nimport { LearnedFusionOperator } from \"../operators/learned-fusion.js\";\nimport type { GraphStats } from \"./cardinality.js\";\nimport { CardinalityEstimator } from \"./cardinality.js\";\nimport { CostModel } from \"./cost-model.js\";\n\n// ---------------------------------------------------------------------------\n// QueryOptimizer\n// ---------------------------------------------------------------------------\n\nexport class QueryOptimizer {\n readonly stats: IndexStats;\n readonly estimator: CardinalityEstimator;\n private readonly _costModel: CostModel;\n private readonly _graphStats: GraphStats | null;\n private readonly _indexManager: IndexManager | null;\n private readonly _tableName: string | null;\n\n constructor(\n stats: IndexStats,\n opts?: {\n columnStats?: Map<string, ColumnStats>;\n indexManager?: IndexManager;\n tableName?: string;\n graphStats?: GraphStats;\n },\n ) {\n this.stats = stats;\n const columnStats = opts?.columnStats ?? new Map();\n this._graphStats = opts?.graphStats ?? null;\n this.estimator = new CardinalityEstimator(columnStats, {\n graphStats: this._graphStats ?? undefined,\n });\n this._costModel = new CostModel(this._graphStats);\n this._indexManager = opts?.indexManager ?? null;\n this._tableName = opts?.tableName ?? null;\n }\n\n optimize(op: Operator): Operator {\n let current = op;\n current = this._simplifyAlgebra(current);\n current = this._pushFiltersDown(current);\n current = this._pushGraphPatternFilters(current);\n current = this._pushFilterIntoTraverse(current);\n current = this._pushFilterBelowGraphJoin(current);\n current = this._fuseJoinPattern(current);\n current = this._mergeVectorThresholds(current);\n current = this._reorderIntersect(current);\n current = this._reorderFusionSignals(current);\n current = this._applyIndexScan(current);\n return current;\n }\n\n // -----------------------------------------------------------------------\n // Rule 1: Simplify boolean algebra\n // -----------------------------------------------------------------------\n\n private _simplifyAlgebra(op: Operator): Operator {\n // Recurse into children first (bottom-up simplification)\n op = this._recurseSimplify(op);\n\n if (op instanceof IntersectOperator) {\n let operands = op.operands;\n\n // Empty elimination\n for (const child of operands) {\n if (QueryOptimizer._isEmptyOperator(child)) {\n return new IntersectOperator([]);\n }\n }\n\n // Idempotent: remove duplicates by identity\n const seen: Operator[] = [];\n for (const child of operands) {\n if (!seen.some((s) => s === child)) {\n seen.push(child);\n }\n }\n operands = seen;\n\n // Absorption: drop UnionOperator([A, ...]) when A also appears\n const absorbed: Operator[] = [];\n for (const child of operands) {\n if (\n child instanceof UnionOperator &&\n operands.some(\n (other) =>\n other !== child &&\n child.operands.some((uc) =>\n operands.some((o) => o === uc && o !== child),\n ),\n )\n ) {\n continue;\n }\n absorbed.push(child);\n }\n operands = absorbed;\n\n if (operands.length === 1) return operands[0]!;\n return new IntersectOperator(operands);\n }\n\n if (op instanceof UnionOperator) {\n let operands = op.operands;\n\n // Empty elimination\n operands = operands.filter((child) => !QueryOptimizer._isEmptyOperator(child));\n\n // Idempotent\n const seen: Operator[] = [];\n for (const child of operands) {\n if (!seen.some((s) => s === child)) {\n seen.push(child);\n }\n }\n operands = seen;\n\n // Absorption: drop IntersectOperator([A, ...]) when A also appears\n const absorbed: Operator[] = [];\n for (const child of operands) {\n if (\n child instanceof IntersectOperator &&\n operands.some(\n (other) =>\n other !== child &&\n child.operands.some((ic) =>\n operands.some((o) => o === ic && o !== child),\n ),\n )\n ) {\n continue;\n }\n absorbed.push(child);\n }\n operands = absorbed;\n\n if (operands.length === 1) return operands[0]!;\n if (operands.length === 0) return new UnionOperator([]);\n return new UnionOperator(operands);\n }\n\n return op;\n }\n\n private _recurseSimplify(op: Operator): Operator {\n if (op instanceof IntersectOperator) {\n return new IntersectOperator(op.operands.map((o) => this._simplifyAlgebra(o)));\n }\n if (op instanceof UnionOperator) {\n return new UnionOperator(op.operands.map((o) => this._simplifyAlgebra(o)));\n }\n if (op instanceof ComplementOperator) {\n return new ComplementOperator(this._simplifyAlgebra(op.operand));\n }\n if (op instanceof FilterOperator && op.source !== null) {\n return new FilterOperator(\n op.field,\n op.predicate,\n this._simplifyAlgebra(op.source),\n );\n }\n if (op instanceof ComposedOperator) {\n return new ComposedOperator(\n (op as unknown as { operators: Operator[] }).operators.map((o: Operator) =>\n this._simplifyAlgebra(o),\n ),\n );\n }\n return op;\n }\n\n private static _isEmptyOperator(op: Operator): boolean {\n if (op instanceof IntersectOperator || op instanceof UnionOperator) {\n return op.operands.length === 0;\n }\n return false;\n }\n\n // -----------------------------------------------------------------------\n // Rule 2: Push filters down\n // -----------------------------------------------------------------------\n\n private _pushFiltersDown(op: Operator): Operator {\n if (!(op instanceof FilterOperator)) {\n return this._recurseChildren(op);\n }\n\n const source = op.source;\n if (source instanceof IntersectOperator) {\n const newOperands: Operator[] = [];\n let anyPushed = false;\n for (const child of source.operands) {\n if (QueryOptimizer._filterAppliesTo(op, child)) {\n newOperands.push(new FilterOperator(op.field, op.predicate, child));\n anyPushed = true;\n } else {\n newOperands.push(child);\n }\n }\n if (anyPushed) {\n const recursed = newOperands.map((o) => this._pushFiltersDown(o));\n return this._recurseChildren(new IntersectOperator(recursed));\n }\n }\n\n if (source === null) return op;\n return new FilterOperator(op.field, op.predicate, this._recurseChildren(source));\n }\n\n // -----------------------------------------------------------------------\n // Rule 3: Push graph pattern filters\n // -----------------------------------------------------------------------\n\n /**\n * Push filter predicates into graph pattern constraints.\n * When a FilterOperator sits above a PatternMatchOperator or TraverseOperator\n * and filters on vertex/edge properties, the filter can be pushed into the\n * graph operator's own constraint set, reducing intermediate results.\n */\n private _pushGraphPatternFilters(op: Operator): Operator {\n if (op instanceof FilterOperator && op.source !== null) {\n const source = this._pushGraphPatternFilters(op.source);\n const sourceTypeName = source.constructor.name;\n\n // Check if the source is a graph pattern operator\n if (sourceTypeName === \"PatternMatchOperator\") {\n // Try to incorporate the filter into the pattern's vertex/edge constraints\n const patternOp = source as unknown as {\n pattern: unknown;\n graph: string;\n score: number;\n withVertexPredicate?: (field: string, pred: unknown) => Operator;\n };\n if (patternOp.withVertexPredicate && op.field) {\n return patternOp.withVertexPredicate(op.field, op.predicate);\n }\n }\n\n // Check if the source is a TraverseOperator\n if (sourceTypeName === \"TraverseOperator\") {\n const traverseOp = source as unknown as {\n startVertex: number;\n graph: string;\n label: string | null;\n maxHops: number;\n vertexPredicate: ((v: unknown) => boolean) | null;\n score: number;\n };\n // If filtering on a vertex property, combine with existing vertex predicate\n if (op.field) {\n const existingPred = traverseOp.vertexPredicate;\n const filterField = op.field;\n const filterPred = op.predicate;\n const combinedPred = (v: unknown) => {\n const vertex = v as Record<string, unknown>;\n const passes = filterPred.evaluate(vertex[filterField]);\n if (!passes) return false;\n if (existingPred !== null) return existingPred(v);\n return true;\n };\n try {\n const TraverseOp = source.constructor as new (\n startVertex: number,\n graph: string,\n label: string | null,\n maxHops: number,\n vertexPredicate: ((v: unknown) => boolean) | null,\n score: number,\n ) => Operator;\n return new TraverseOp(\n traverseOp.startVertex,\n traverseOp.graph,\n traverseOp.label,\n traverseOp.maxHops,\n combinedPred,\n traverseOp.score,\n );\n } catch {\n // If construction fails, keep the filter above\n }\n }\n }\n\n return new FilterOperator(op.field, op.predicate, source);\n }\n\n return this._recurseGeneric(op, (o) => this._pushGraphPatternFilters(o));\n }\n\n // -----------------------------------------------------------------------\n // Rule 4: Push filter into traverse\n // -----------------------------------------------------------------------\n\n /**\n * Push vertex-property filters into BFS pruning within TraverseOperator.\n * This converts a Filter(TraverseOp) into TraverseOp(vertexPredicate=...).\n */\n private _pushFilterIntoTraverse(op: Operator): Operator {\n if (op instanceof FilterOperator && op.source !== null) {\n const source = this._pushFilterIntoTraverse(op.source);\n const sourceTypeName = source.constructor.name;\n\n if (sourceTypeName === \"TraverseOperator\") {\n const traverseOp = source as unknown as {\n startVertex: number;\n graph: string;\n label: string | null;\n maxHops: number;\n vertexPredicate: ((v: unknown) => boolean) | null;\n score: number;\n };\n\n if (op.field) {\n const filterField = op.field;\n const filterPred = op.predicate;\n const existingPred = traverseOp.vertexPredicate;\n\n const combinedPred = (v: unknown) => {\n const vertex = v as Record<string, unknown>;\n const fieldValue = vertex[\"properties\"]\n ? (vertex[\"properties\"] as Record<string, unknown>)[filterField]\n : vertex[filterField];\n if (!filterPred.evaluate(fieldValue)) return false;\n return existingPred === null || existingPred(v);\n };\n\n try {\n const TraverseOp = source.constructor as new (\n startVertex: number,\n graph: string,\n label: string | null,\n maxHops: number,\n vertexPredicate: ((v: unknown) => boolean) | null,\n score: number,\n ) => Operator;\n return new TraverseOp(\n traverseOp.startVertex,\n traverseOp.graph,\n traverseOp.label,\n traverseOp.maxHops,\n combinedPred,\n traverseOp.score,\n );\n } catch {\n // Fall through to keep filter above\n }\n }\n }\n\n return new FilterOperator(op.field, op.predicate, source);\n }\n\n return this._recurseGeneric(op, (o) => this._pushFilterIntoTraverse(o));\n }\n\n // -----------------------------------------------------------------------\n // Rule 5: Push filter below graph join\n // -----------------------------------------------------------------------\n\n /**\n * Push filters below graph join operators when the filter predicate\n * only references columns from one side of the join.\n */\n private _pushFilterBelowGraphJoin(op: Operator): Operator {\n if (op instanceof FilterOperator && op.source !== null) {\n const source = this._pushFilterBelowGraphJoin(op.source);\n const sourceTypeName = source.constructor.name;\n\n // Check for graph join operators (CrossParadigmJoin, GraphJoin, etc.)\n if (\n sourceTypeName === \"CrossParadigmJoinOperator\" ||\n sourceTypeName === \"GraphJoinOperator\"\n ) {\n const joinOp = source as unknown as {\n left: Operator;\n right: Operator;\n };\n\n {\n // Try to push the filter into the left or right child\n const leftRelevant = QueryOptimizer._filterAppliesTo(op, joinOp.left);\n const rightRelevant = QueryOptimizer._filterAppliesTo(op, joinOp.right);\n\n if (leftRelevant && !rightRelevant) {\n try {\n const JoinOp = source.constructor as new (\n left: Operator,\n right: Operator,\n ...rest: unknown[]\n ) => Operator;\n return new JoinOp(\n new FilterOperator(op.field, op.predicate, joinOp.left),\n joinOp.right,\n );\n } catch {\n // Fall through\n }\n }\n if (rightRelevant && !leftRelevant) {\n try {\n const JoinOp = source.constructor as new (\n left: Operator,\n right: Operator,\n ...rest: unknown[]\n ) => Operator;\n return new JoinOp(\n joinOp.left,\n new FilterOperator(op.field, op.predicate, joinOp.right),\n );\n } catch {\n // Fall through\n }\n }\n }\n }\n\n return new FilterOperator(op.field, op.predicate, source);\n }\n\n return this._recurseGeneric(op, (o) => this._pushFilterBelowGraphJoin(o));\n }\n\n // -----------------------------------------------------------------------\n // Rule 6: Fuse join patterns\n // -----------------------------------------------------------------------\n\n /**\n * Fuse intersected pattern match operations into a single combined\n * pattern when they share variables or graph context.\n */\n private _fuseJoinPattern(op: Operator): Operator {\n if (op instanceof IntersectOperator) {\n const children = op.operands.map((c) => this._fuseJoinPattern(c));\n\n // Collect pattern match operators\n const patternOps: Operator[] = [];\n const otherOps: Operator[] = [];\n for (const child of children) {\n if (child.constructor.name === \"PatternMatchOperator\") {\n patternOps.push(child);\n } else {\n otherOps.push(child);\n }\n }\n\n // If we have multiple pattern ops on the same graph, try to fuse\n if (patternOps.length >= 2) {\n const byGraph = new Map<string, Operator[]>();\n for (const pop of patternOps) {\n const graph = (pop as unknown as { graph: string }).graph;\n if (!byGraph.has(graph)) byGraph.set(graph, []);\n byGraph.get(graph)!.push(pop);\n }\n\n const fusedOps: Operator[] = [];\n for (const [, graphOps] of byGraph) {\n if (graphOps.length >= 2) {\n // Keep the most selective pattern (smallest cost estimate)\n graphOps.sort(\n (a, b) =>\n this._costModel.estimate(a, this.stats) -\n this._costModel.estimate(b, this.stats),\n );\n // Keep the most selective one as the primary, intersect with others\n fusedOps.push(graphOps[0]!);\n // Remaining patterns become filters on the result\n for (let i = 1; i < graphOps.length; i++) {\n fusedOps.push(graphOps[i]!);\n }\n } else {\n fusedOps.push(graphOps[0]!);\n }\n }\n\n const allOps = [...otherOps, ...fusedOps];\n if (allOps.length === 1) return allOps[0]!;\n return new IntersectOperator(allOps);\n }\n\n if (children.length === 1) return children[0]!;\n return new IntersectOperator(children);\n }\n\n return this._recurseGeneric(op, (o) => this._fuseJoinPattern(o));\n }\n\n // -----------------------------------------------------------------------\n // Rule 7: Merge vector thresholds\n // -----------------------------------------------------------------------\n\n private _mergeVectorThresholds(op: Operator): Operator {\n if (!(op instanceof IntersectOperator)) {\n return this._recurseChildren(op);\n }\n\n const vectorOps: VectorSimilarityOperator[] = [];\n const otherOps: Operator[] = [];\n\n for (let child of op.operands) {\n child = this._recurseChildren(child);\n if (child instanceof VectorSimilarityOperator) {\n vectorOps.push(child);\n } else {\n otherOps.push(child);\n }\n }\n\n // Merge vector ops with same field\n const mergedVectors: VectorSimilarityOperator[] = [];\n const used = new Array(vectorOps.length).fill(false);\n\n for (let i = 0; i < vectorOps.length; i++) {\n if (used[i]) continue;\n let merged = vectorOps[i]!;\n for (let j = i + 1; j < vectorOps.length; j++) {\n if (used[j]) continue;\n if (\n merged.field === vectorOps[j]!.field &&\n this._vectorsClose(merged.queryVector, vectorOps[j]!.queryVector)\n ) {\n merged = new VectorSimilarityOperator(\n merged.queryVector,\n Math.max(merged.threshold, vectorOps[j]!.threshold),\n merged.field,\n );\n used[j] = true;\n }\n }\n used[i] = true;\n mergedVectors.push(merged);\n }\n\n const allOps: Operator[] = [...otherOps, ...mergedVectors];\n if (allOps.length === 1) return allOps[0]!;\n return new IntersectOperator(allOps);\n }\n\n private _vectorsClose(a: Float64Array, b: Float64Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (Math.abs(a[i]! - b[i]!) > 1e-7) return false;\n }\n return true;\n }\n\n // -----------------------------------------------------------------------\n // Rule 8: Reorder intersection operands by cardinality\n // -----------------------------------------------------------------------\n\n private _reorderIntersect(op: Operator): Operator {\n if (!(op instanceof IntersectOperator)) {\n return this._recurseChildren(op);\n }\n\n const children = op.operands.map((c) => this._recurseChildren(c));\n children.sort(\n (a, b) =>\n this._costModel.estimate(a, this.stats) -\n this._costModel.estimate(b, this.stats),\n );\n return new IntersectOperator(children);\n }\n\n // -----------------------------------------------------------------------\n // Rule 9: Reorder fusion signals\n // -----------------------------------------------------------------------\n\n private _reorderFusionSignals(op: Operator): Operator {\n // Check for LogOddsFusionOperator and ProbBoolFusionOperator\n if (op instanceof LogOddsFusionOperator) {\n const signals = op.signals.map((s) => this._reorderFusionSignals(s));\n signals.sort(\n (a, b) => this._graphAwareSignalCost(a) - this._graphAwareSignalCost(b),\n );\n return new LogOddsFusionOperator(signals, op.alpha, undefined, op.gating);\n }\n\n if (op instanceof ProbBoolFusionOperator) {\n const signals = op.signals.map((s) => this._reorderFusionSignals(s));\n signals.sort(\n (a, b) => this._graphAwareSignalCost(a) - this._graphAwareSignalCost(b),\n );\n return new ProbBoolFusionOperator(signals, op.mode);\n }\n\n return this._recurseGeneric(op, (o) => this._reorderFusionSignals(o));\n }\n\n /**\n * Compute graph-aware signal cost for fusion operator reordering.\n * Graph operators get discounted costs when graph statistics are available\n * because they can leverage graph indexes for faster execution.\n */\n private _graphAwareSignalCost(signal: Operator): number {\n const base = this.estimator.estimate(signal, this.stats);\n\n if (this._graphStats !== null) {\n const typeName = signal.constructor.name;\n\n // Graph operators benefit from graph indexes\n if (typeName === \"TraverseOperator\") {\n // Traversal cost depends on graph density\n const density = this._graphStats.edgeDensity();\n return base * (density < 0.01 ? 0.3 : 0.5);\n }\n if (typeName === \"PatternMatchOperator\") {\n // Pattern matching is expensive but can use label indexes\n return base * 0.5;\n }\n if (typeName === \"RegularPathQueryOperator\") {\n // RPQ uses DFA simulation, cost depends on automaton size\n return base * 0.6;\n }\n if (typeName === \"WeightedPathQueryOperator\") {\n // Weighted RPQ adds weight computation overhead\n return base * 0.7;\n }\n if (typeName === \"TemporalTraverseOperator\") {\n // Temporal traversal adds time filtering overhead\n return base * 0.6;\n }\n if (typeName === \"CypherQueryOperator\") {\n // Cypher queries are compiled and optimized\n return base * 0.5;\n }\n }\n\n // Vector operators benefit from vector indexes\n if (signal instanceof VectorSimilarityOperator) {\n return base * 0.8; // Vector search is relatively fast with indexes\n }\n\n // Term operators are the cheapest (inverted index lookup)\n if (signal instanceof TermOperator) {\n return base * 0.3;\n }\n\n return base;\n }\n\n // -----------------------------------------------------------------------\n // Rule 10: Apply index scan substitution\n // -----------------------------------------------------------------------\n\n private _applyIndexScan(op: Operator): Operator {\n if (this._indexManager === null || this._tableName === null) return op;\n\n if (op instanceof FilterOperator && op.source === null) {\n const idx = this._indexManager.findCoveringIndex(\n this._tableName,\n op.field,\n op.predicate,\n );\n if (idx !== null) {\n const scanCost = idx.scanCost(op.predicate);\n const fullScanCost = this.stats.totalDocs;\n if (scanCost < fullScanCost) {\n return new IndexScanOperator(idx, op.field, op.predicate);\n }\n }\n }\n\n if (op instanceof FilterOperator && op.source !== null) {\n return new FilterOperator(\n op.field,\n op.predicate,\n this._applyIndexScan(op.source),\n );\n }\n\n return this._recurseGeneric(op, (o) => this._applyIndexScan(o));\n }\n\n // -----------------------------------------------------------------------\n // Generic recursion helpers\n // -----------------------------------------------------------------------\n\n private _recurseGeneric(op: Operator, fn: (o: Operator) => Operator): Operator {\n if (op instanceof IntersectOperator) {\n return new IntersectOperator(op.operands.map(fn));\n }\n if (op instanceof UnionOperator) {\n return new UnionOperator(op.operands.map(fn));\n }\n if (op instanceof ComplementOperator) {\n return new ComplementOperator(fn(op.operand));\n }\n if (op instanceof FilterOperator && op.source !== null) {\n return new FilterOperator(op.field, op.predicate, fn(op.source));\n }\n if (op instanceof ComposedOperator) {\n return new ComposedOperator(\n (op as unknown as { operators: Operator[] }).operators.map(fn),\n );\n }\n return op;\n }\n\n private _recurseChildren(op: Operator): Operator {\n if (op instanceof IntersectOperator) {\n return new IntersectOperator(op.operands.map((o) => this.optimize(o)));\n }\n if (op instanceof UnionOperator) {\n return new UnionOperator(op.operands.map((o) => this.optimize(o)));\n }\n if (op instanceof ComplementOperator) {\n return new ComplementOperator(this.optimize(op.operand));\n }\n if (op instanceof FilterOperator && op.source !== null) {\n return new FilterOperator(op.field, op.predicate, this.optimize(op.source));\n }\n if (op instanceof ComposedOperator) {\n return new ComposedOperator(\n (op as unknown as { operators: Operator[] }).operators.map((o: Operator) =>\n this.optimize(o),\n ),\n );\n }\n if (op instanceof ScoreOperator) {\n return new ScoreOperator(\n op.scorer,\n this.optimize(op.source),\n op.queryTerms,\n op.field,\n );\n }\n if (op instanceof SparseThresholdOperator) {\n return new SparseThresholdOperator(this.optimize(op.source), op.threshold);\n }\n\n // Fusion operator recursion\n if (op instanceof LogOddsFusionOperator) {\n return new LogOddsFusionOperator(\n op.signals.map((s) => this.optimize(s)),\n op.alpha,\n undefined,\n op.gating,\n );\n }\n if (op instanceof ProbBoolFusionOperator) {\n return new ProbBoolFusionOperator(\n op.signals.map((s) => this.optimize(s)),\n op.mode,\n );\n }\n if (op instanceof ProbNotOperator) {\n return new ProbNotOperator(this.optimize(op.signal), op.defaultProb);\n }\n if (op instanceof AttentionFusionOperator) {\n return new AttentionFusionOperator(\n op.signals.map((s) => this.optimize(s)),\n op.attention,\n op.queryFeatures,\n );\n }\n if (op instanceof LearnedFusionOperator) {\n return new LearnedFusionOperator(\n op.signals.map((s) => this.optimize(s)),\n op.learned,\n );\n }\n\n return op;\n }\n\n // -----------------------------------------------------------------------\n // Helpers\n // -----------------------------------------------------------------------\n\n private static _filterAppliesTo(filterOp: Operator, target: Operator): boolean {\n const field = (filterOp as FilterOperator).field;\n\n if (target instanceof TermOperator) {\n return target.field === field || target.field === null;\n }\n if (target instanceof FilterOperator) {\n return target.field === field;\n }\n if (target instanceof IntersectOperator) {\n return target.operands.some((child) =>\n QueryOptimizer._filterAppliesTo(filterOp, child),\n );\n }\n return false;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- plan executor\n// 1:1 port of uqa/planner/executor.py\n\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"../operators/base.js\";\nimport type { Operator } from \"../operators/base.js\";\nimport {\n UnionOperator,\n IntersectOperator,\n ComplementOperator,\n} from \"../operators/boolean.js\";\nimport {\n TermOperator,\n VectorSimilarityOperator,\n KNNOperator,\n FilterOperator,\n ScoreOperator,\n IndexScanOperator,\n} from \"../operators/primitive.js\";\nimport { SparseThresholdOperator } from \"../operators/sparse.js\";\nimport { MultiStageOperator } from \"../operators/multi-stage.js\";\n\n// ---------------------------------------------------------------------------\n// ExecutionStats\n// ---------------------------------------------------------------------------\n\nexport interface ExecutionStats {\n operatorName: string;\n elapsedMs: number;\n resultCount: number;\n children: ExecutionStats[];\n}\n\n// ---------------------------------------------------------------------------\n// PlanExecutor\n// ---------------------------------------------------------------------------\n\n/**\n * Executes an operator tree against an ExecutionContext, collecting\n * per-operator timing statistics.\n */\nexport class PlanExecutor {\n private readonly _context: ExecutionContext;\n private _lastStats: ExecutionStats | null = null;\n\n constructor(context: ExecutionContext) {\n this._context = context;\n }\n\n /**\n * Execute the operator tree and return the resulting PostingList.\n */\n execute(op: Operator): PostingList {\n const [result, stats] = this._executeWithStats(op);\n this._lastStats = stats;\n return result;\n }\n\n /**\n * Return a human-readable EXPLAIN string for the operator tree.\n */\n explain(op: Operator): string {\n return this._explainNode(op, 0);\n }\n\n /**\n * Return the execution statistics from the last execute() call.\n */\n get lastStats(): ExecutionStats | null {\n return this._lastStats;\n }\n\n // -----------------------------------------------------------------------\n // Internal: execute with statistics collection\n // -----------------------------------------------------------------------\n\n private _executeWithStats(op: Operator): [PostingList, ExecutionStats] {\n const name = this._operatorName(op);\n const childStats: ExecutionStats[] = [];\n\n const start = performance.now();\n let result: PostingList;\n\n if (op instanceof UnionOperator) {\n const childResults: PostingList[] = [];\n for (const child of op.operands) {\n const [r, s] = this._executeWithStats(child);\n childResults.push(r);\n childStats.push(s);\n }\n result = new PostingList();\n for (const r of childResults) {\n result = result.union(r);\n }\n } else if (op instanceof IntersectOperator) {\n if (op.operands.length === 0) {\n result = new PostingList();\n } else {\n const [first, firstStats] = this._executeWithStats(op.operands[0]!);\n childStats.push(firstStats);\n result = first;\n for (let i = 1; i < op.operands.length; i++) {\n if (result.length === 0) {\n // Short-circuit: no need to evaluate remaining operands\n break;\n }\n const [r, s] = this._executeWithStats(op.operands[i]!);\n childStats.push(s);\n result = result.intersect(r);\n }\n }\n } else if (op instanceof ComplementOperator) {\n const [, s] = this._executeWithStats(op.operand);\n childStats.push(s);\n result = op.execute(this._context); // Need full universal set\n } else if (op instanceof SparseThresholdOperator) {\n const [, s] = this._executeWithStats(op.source);\n childStats.push(s);\n // Re-execute to apply threshold (the source result was already computed\n // but we need the threshold logic -- just call execute directly)\n result = op.execute(this._context);\n } else if (op instanceof ScoreOperator) {\n const [, s] = this._executeWithStats(op.source);\n childStats.push(s);\n result = op.execute(this._context);\n } else if (op instanceof FilterOperator && op.source !== null) {\n const [, s] = this._executeWithStats(op.source);\n childStats.push(s);\n result = op.execute(this._context);\n } else if (op instanceof MultiStageOperator) {\n for (const [stageOp] of op.stages) {\n const [, s] = this._executeWithStats(stageOp);\n childStats.push(s);\n }\n result = op.execute(this._context);\n } else {\n // Leaf operator (TermOperator, VectorSimilarityOperator, etc.)\n result = op.execute(this._context);\n }\n\n const elapsed = performance.now() - start;\n\n const stats: ExecutionStats = {\n operatorName: name,\n elapsedMs: elapsed,\n resultCount: result.length,\n children: childStats,\n };\n\n return [result, stats];\n }\n\n // -----------------------------------------------------------------------\n // EXPLAIN\n // -----------------------------------------------------------------------\n\n private _explainNode(op: Operator, depth: number): string {\n const indent = \" \".repeat(depth);\n const name = this._operatorName(op);\n const details = this._operatorDetails(op);\n const line =\n details.length > 0 ? `${indent}${name} (${details})\\n` : `${indent}${name}\\n`;\n\n let result = line;\n\n // Recurse into children\n if (op instanceof UnionOperator) {\n for (const child of op.operands) {\n result += this._explainNode(child, depth + 1);\n }\n } else if (op instanceof IntersectOperator) {\n for (const child of op.operands) {\n result += this._explainNode(child, depth + 1);\n }\n } else if (op instanceof ComplementOperator) {\n result += this._explainNode(op.operand, depth + 1);\n } else if (op instanceof SparseThresholdOperator) {\n result += this._explainNode(op.source, depth + 1);\n } else if (op instanceof ScoreOperator) {\n result += this._explainNode(op.source, depth + 1);\n } else if (op instanceof FilterOperator && op.source !== null) {\n result += this._explainNode(op.source, depth + 1);\n } else if (op instanceof MultiStageOperator) {\n for (const [stageOp, cutoff] of op.stages) {\n result += `${indent} [cutoff=${String(cutoff)}]\\n`;\n result += this._explainNode(stageOp, depth + 2);\n }\n }\n\n return result;\n }\n\n // -----------------------------------------------------------------------\n // Operator metadata\n // -----------------------------------------------------------------------\n\n private _operatorName(op: Operator): string {\n if (op instanceof TermOperator) return \"TermScan\";\n if (op instanceof VectorSimilarityOperator) return \"VectorThreshold\";\n if (op instanceof KNNOperator) return \"KNN\";\n if (op instanceof FilterOperator) return \"Filter\";\n if (op instanceof IndexScanOperator) return \"IndexScan\";\n if (op instanceof ScoreOperator) return \"Score\";\n if (op instanceof UnionOperator) return \"Union\";\n if (op instanceof IntersectOperator) return \"Intersect\";\n if (op instanceof ComplementOperator) return \"Complement\";\n if (op instanceof SparseThresholdOperator) return \"SparseThreshold\";\n if (op instanceof MultiStageOperator) return \"MultiStage\";\n return op.constructor.name;\n }\n\n private _operatorDetails(op: Operator): string {\n if (op instanceof TermOperator) {\n const field = op.field !== null ? `field=${op.field}, ` : \"\";\n return `${field}term=\"${op.term}\"`;\n }\n if (op instanceof VectorSimilarityOperator) {\n return `field=${op.field}, threshold=${String(op.threshold)}`;\n }\n if (op instanceof KNNOperator) {\n return `field=${op.field}, k=${String(op.k)}`;\n }\n if (op instanceof FilterOperator) {\n return `field=${op.field}`;\n }\n if (op instanceof IndexScanOperator) {\n return `field=${op.field}`;\n }\n if (op instanceof SparseThresholdOperator) {\n return `threshold=${String(op.threshold)}`;\n }\n if (op instanceof UnionOperator) {\n return `operands=${String(op.operands.length)}`;\n }\n if (op instanceof IntersectOperator) {\n return `operands=${String(op.operands.length)}`;\n }\n if (op instanceof ScoreOperator) {\n return `terms=${String(op.queryTerms.length)}`;\n }\n if (op instanceof MultiStageOperator) {\n return `stages=${String(op.stages.length)}`;\n }\n\n // Dynamic operator detail extraction (for graph and fusion operators)\n const typeName = op.constructor.name;\n if (typeName === \"TraverseOperator\") {\n const t = op as unknown as {\n graph: string;\n label: string | null;\n maxHops: number;\n };\n const label = t.label !== null ? `, label=${t.label}` : \"\";\n return `graph=${t.graph}${label}, maxHops=${String(t.maxHops)}`;\n }\n if (typeName === \"PatternMatchOperator\") {\n const p = op as unknown as {\n graph: string;\n pattern: { vertexPatterns: unknown[] };\n };\n return `graph=${p.graph}, vertices=${String(p.pattern.vertexPatterns.length)}`;\n }\n if (typeName === \"RegularPathQueryOperator\") {\n const r = op as unknown as { graph: string; startVertex: number | null };\n const start = r.startVertex !== null ? `, start=${String(r.startVertex)}` : \"\";\n return `graph=${r.graph}${start}`;\n }\n if (typeName === \"WeightedPathQueryOperator\") {\n const w = op as unknown as {\n graph: string;\n aggregation: string;\n weightProperty: string;\n };\n return `graph=${w.graph}, agg=${w.aggregation}, weight=${w.weightProperty}`;\n }\n if (typeName === \"CypherQueryOperator\") {\n const c = op as unknown as { graphName: string; query: string };\n const shortQuery = c.query.length > 40 ? c.query.slice(0, 40) + \"...\" : c.query;\n return `graph=${c.graphName}, query=\"${shortQuery}\"`;\n }\n if (typeName === \"LogOddsFusionOperator\") {\n const f = op as unknown as { signals: Operator[]; alpha: number };\n return `signals=${String(f.signals.length)}, alpha=${String(f.alpha)}`;\n }\n if (typeName === \"ProbBoolFusionOperator\") {\n const f = op as unknown as { signals: Operator[]; mode: string };\n return `signals=${String(f.signals.length)}, mode=${f.mode}`;\n }\n if (typeName === \"AttentionFusionOperator\") {\n const f = op as unknown as { signals: Operator[] };\n return `signals=${String(f.signals.length)}`;\n }\n if (typeName === \"LearnedFusionOperator\") {\n const f = op as unknown as { signals: Operator[] };\n return `signals=${String(f.signals.length)}`;\n }\n if (typeName === \"VertexAggregationOperator\") {\n const a = op as unknown as { propertyName: string };\n return `property=${a.propertyName}`;\n }\n\n return \"\";\n }\n\n /**\n * Recursive EXPLAIN with full cost and cardinality estimation.\n * Produces a detailed plan tree with estimated rows and cost per node.\n */\n explainAnalyze(op: Operator, opts?: { verbose?: boolean }): string {\n const [, stats] = this._executeWithStats(op);\n return this._explainAnalyzeNode(stats, 0, opts?.verbose ?? false);\n }\n\n private _explainAnalyzeNode(\n stats: ExecutionStats,\n depth: number,\n verbose: boolean,\n ): string {\n const indent = \" \".repeat(depth);\n let line = `${indent}${stats.operatorName}`;\n line += ` (rows=${String(stats.resultCount)}, time=${stats.elapsedMs.toFixed(3)}ms)`;\n line += \"\\n\";\n\n if (verbose && stats.children.length > 0) {\n line += `${indent} children: ${String(stats.children.length)}\\n`;\n }\n\n for (const child of stats.children) {\n line += this._explainAnalyzeNode(child, depth + 1, verbose);\n }\n\n return line;\n }\n\n /**\n * Return a structured EXPLAIN output as a tree of objects.\n */\n explainTree(op: Operator): Record<string, unknown> {\n return this._explainTreeNode(op);\n }\n\n private _explainTreeNode(op: Operator): Record<string, unknown> {\n const node: Record<string, unknown> = {\n operator: this._operatorName(op),\n details: this._operatorDetails(op),\n };\n\n const children: Record<string, unknown>[] = [];\n if (op instanceof UnionOperator) {\n for (const child of op.operands) {\n children.push(this._explainTreeNode(child));\n }\n } else if (op instanceof IntersectOperator) {\n for (const child of op.operands) {\n children.push(this._explainTreeNode(child));\n }\n } else if (op instanceof ComplementOperator) {\n children.push(this._explainTreeNode(op.operand));\n } else if (op instanceof SparseThresholdOperator) {\n children.push(this._explainTreeNode(op.source));\n } else if (op instanceof ScoreOperator) {\n children.push(this._explainTreeNode(op.source));\n } else if (op instanceof FilterOperator && op.source !== null) {\n children.push(this._explainTreeNode(op.source));\n } else if (op instanceof MultiStageOperator) {\n for (const [stageOp, cutoff] of op.stages) {\n const stageNode = this._explainTreeNode(stageOp);\n stageNode[\"cutoff\"] = cutoff;\n children.push(stageNode);\n }\n } else {\n // Check for dynamic operator children\n const typeName = op.constructor.name;\n if (\n typeName === \"LogOddsFusionOperator\" ||\n typeName === \"ProbBoolFusionOperator\" ||\n typeName === \"AttentionFusionOperator\" ||\n typeName === \"LearnedFusionOperator\"\n ) {\n const f = op as unknown as { signals: Operator[] };\n for (const sig of f.signals) {\n children.push(this._explainTreeNode(sig));\n }\n }\n }\n\n if (children.length > 0) {\n node[\"children\"] = children;\n }\n\n return node;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- SQL compiler\n// 1:1 port of uqa/sql/compiler.py\n//\n// Compiles SQL statements (parsed via libpg-query WASM) and executes them\n// against the in-memory Table storage.\n//\n// Supported statements:\n// DDL:\n// CREATE [TEMPORARY | TEMP] TABLE name (col type [constraints], ...)\n// CREATE [TEMP] TABLE name AS SELECT ...\n// DROP TABLE [IF EXISTS] name\n// DROP VIEW [IF EXISTS] name\n// DROP INDEX [IF EXISTS] name\n// CREATE VIEW name AS SELECT ...\n// CREATE SEQUENCE name [START n] [INCREMENT n]\n// ALTER SEQUENCE name [RESTART [WITH n]] [INCREMENT [BY] n] [START [WITH] n]\n// CREATE INDEX name ON table [USING method] (col, ...)\n// ALTER TABLE name ADD/DROP/ALTER COLUMN ...\n// RENAME TABLE / COLUMN\n// TRUNCATE name\n// Constraints:\n// PRIMARY KEY, NOT NULL, DEFAULT val, UNIQUE, CHECK (expr)\n// REFERENCES parent(col) -- column-level FOREIGN KEY\n// FOREIGN KEY (col) REFERENCES parent(col) -- table-level FOREIGN KEY\n// DML:\n// INSERT INTO name (col, ...) VALUES (val, ...), ...\n// INSERT INTO name SELECT ...\n// INSERT INTO name ... ON CONFLICT (col) DO NOTHING / DO UPDATE SET ...\n// UPDATE name SET col = expr, ... [WHERE ...]\n// UPDATE name SET col = expr FROM other_table WHERE ...\n// DELETE FROM name [WHERE ...]\n// DELETE FROM name USING other_table WHERE ...\n// DQL:\n// WITH name AS (SELECT ...) [, ...] -- common table expressions (CTE)\n// WITH RECURSIVE name AS (base UNION [ALL] recursive)\n// SELECT [DISTINCT] [* | col, ... | expr, ... | aggregates |\n// window_func() OVER ([PARTITION BY ...] [ORDER BY ...])]\n// FROM table\n// [JOIN table ON ...]\n// [LATERAL (subquery)]\n// [WHERE comparisons / boolean / IS [NOT] NULL /\n// LIKE / NOT LIKE / ILIKE / NOT ILIKE /\n// IN (list) / IN (SELECT ...) / EXISTS (SELECT ...) /\n// BETWEEN / NOT BETWEEN /\n// text_match() / knn_match() / bayesian_match() / ...]\n// [GROUP BY col [HAVING ...]]\n// [ORDER BY col [ASC|DESC] [NULLS FIRST|LAST]]\n// [LIMIT n [OFFSET m]]\n// UNION [ALL] / INTERSECT [ALL] / EXCEPT [ALL]\n// VALUES (val, ...), ...\n// Transaction:\n// BEGIN / COMMIT / ROLLBACK\n// SAVEPOINT name / RELEASE SAVEPOINT name / ROLLBACK TO SAVEPOINT name\n// Prepared Statements:\n// PREPARE name [(type, ...)] AS query\n// EXECUTE name [(val, ...)]\n// DEALLOCATE name | ALL\n// Utility:\n// EXPLAIN SELECT ...\n// ANALYZE [table]\n// VACUUM\n// RETURNING clause for INSERT/UPDATE/DELETE\n\nimport { parse as pgParse } from \"libpg-query\";\nimport { ExprEvaluator } from \"./expr-evaluator.js\";\nimport { Table, createColumnDef, resolveType } from \"./table.js\";\nimport type { ColumnDef, ForeignKeyDef } from \"./table.js\";\n\n// -- UQA operator and type imports for WHERE-clause compilation ----------------\n\nimport { PostingList } from \"../core/posting-list.js\";\nimport {\n createPostingEntry,\n Equals,\n NotEquals,\n GreaterThan,\n GreaterThanOrEqual,\n LessThan,\n LessThanOrEqual,\n InSet,\n Between,\n Like,\n NotLike,\n ILike,\n NotILike,\n IsNull,\n IsNotNull,\n} from \"../core/types.js\";\nimport type { PostingEntry as PostingEntryType, Predicate } from \"../core/types.js\";\nimport type { IndexStats } from \"../core/types.js\";\nimport { Operator } from \"../operators/base.js\";\nimport type { ExecutionContext } from \"../operators/base.js\";\nimport {\n FilterOperator,\n TermOperator,\n KNNOperator,\n ScoreOperator,\n SpatialWithinOperator,\n} from \"../operators/primitive.js\";\nimport {\n IntersectOperator,\n UnionOperator,\n ComplementOperator,\n} from \"../operators/boolean.js\";\nimport {\n LogOddsFusionOperator,\n ProbBoolFusionOperator,\n VectorExclusionOperator,\n ProbNotOperator,\n} from \"../operators/hybrid.js\";\nimport { SparseThresholdOperator } from \"../operators/sparse.js\";\nimport { MultiStageOperator } from \"../operators/multi-stage.js\";\nimport { MultiFieldSearchOperator } from \"../operators/multi-field.js\";\nimport { ProgressiveFusionOperator } from \"../operators/progressive-fusion.js\";\nimport { DeepFusionOperator } from \"../operators/deep-fusion.js\";\nimport type { FusionLayer } from \"../operators/deep-fusion.js\";\nimport { PathFilterOperator } from \"../operators/hierarchical.js\";\nimport { AttentionFusionOperator } from \"../operators/attention.js\";\nimport { LearnedFusionOperator } from \"../operators/learned-fusion.js\";\nimport { CalibratedVectorOperator } from \"../operators/calibrated-vector.js\";\nimport { TraverseOperator } from \"../graph/operators.js\";\nimport { TemporalTraverseOperator } from \"../graph/temporal-traverse.js\";\nimport { TemporalFilter } from \"../graph/temporal-filter.js\";\nimport {\n PageRankOperator,\n HITSOperator,\n BetweennessCentralityOperator,\n} from \"../graph/centrality.js\";\nimport { MessagePassingOperator } from \"../graph/message-passing.js\";\nimport { GraphEmbeddingOperator } from \"../graph/graph-embedding.js\";\nimport { parseRpq } from \"../graph/pattern.js\";\nimport {\n BayesianBM25Scorer,\n createBayesianBM25Params,\n} from \"../scoring/bayesian-bm25.js\";\nimport { BM25Scorer, createBM25Params } from \"../scoring/bm25.js\";\nimport {\n recencyPrior,\n authorityPrior,\n ExternalPriorScorer,\n} from \"../scoring/external-prior.js\";\nimport { WeightedPathQueryOperator } from \"../graph/operators.js\";\nimport { generateKernels as _genKernels } from \"../operators/deep-learn.js\";\nimport { AttentionFusion, MultiHeadAttentionFusion } from \"../fusion/attention.js\";\nimport { LearnedFusion } from \"../fusion/learned.js\";\nimport { QueryFeatureExtractor } from \"../fusion/query-features.js\";\nimport { QueryOptimizer } from \"../planner/optimizer.js\";\nimport type { ColumnStats } from \"./table.js\";\nimport { PlanExecutor } from \"../planner/executor.js\";\n\n// -- SQLResult ------------------------------------------------------------------\n\nexport interface SQLResult {\n readonly columns: string[];\n readonly rows: Record<string, unknown>[];\n}\n\n// -- Aggregate function names ---------------------------------------------------\n\nconst AGG_FUNC_NAMES = new Set<string>([\n \"count\",\n \"sum\",\n \"avg\",\n \"min\",\n \"max\",\n \"string_agg\",\n \"array_agg\",\n \"bool_and\",\n \"bool_or\",\n \"stddev\",\n \"stddev_pop\",\n \"stddev_samp\",\n \"variance\",\n \"var_pop\",\n \"var_samp\",\n \"percentile_cont\",\n \"percentile_disc\",\n \"mode\",\n \"json_object_agg\",\n \"jsonb_object_agg\",\n \"corr\",\n \"covar_pop\",\n \"covar_samp\",\n \"regr_count\",\n \"regr_avgx\",\n \"regr_avgy\",\n \"regr_sxx\",\n \"regr_syy\",\n \"regr_sxy\",\n \"regr_slope\",\n \"regr_intercept\",\n \"regr_r2\",\n]);\n\n// -- UQA-specific WHERE functions that produce posting-list-like results --------\n\nconst UQA_WHERE_FUNCTIONS = new Set<string>([\n \"text_match\",\n \"bayesian_match\",\n \"bayesian_match_with_prior\",\n \"knn_match\",\n \"bayesian_knn_match\",\n \"traverse_match\",\n \"temporal_traverse\",\n \"path_filter\",\n \"vector_exclude\",\n \"spatial_within\",\n \"fuse_log_odds\",\n \"fuse_prob_and\",\n \"fuse_prob_or\",\n \"fuse_prob_not\",\n \"fuse_attention\",\n \"fuse_multihead\",\n \"fuse_learned\",\n \"sparse_threshold\",\n \"multi_field_match\",\n \"message_passing\",\n \"graph_embedding\",\n \"staged_retrieval\",\n \"pagerank\",\n \"hits\",\n \"betweenness\",\n \"weighted_rpq\",\n \"progressive_fusion\",\n \"deep_fusion\",\n]);\n\n// -- Side-effecting functions that must not be constant-folded ------------------\n\nconst NO_FOLD_FUNCS = new Set<string>([\n \"random\",\n \"nextval\",\n \"currval\",\n \"now\",\n \"current_timestamp\",\n \"clock_timestamp\",\n \"statement_timestamp\",\n \"timeofday\",\n]);\n\n// -- Helpers for AST node access ------------------------------------------------\n\nfunction nodeGet(node: Record<string, unknown>, key: string): unknown {\n return node[key] ?? null;\n}\n\nfunction toStr(v: unknown): string {\n if (typeof v === \"string\") return v;\n if (v === null || v === undefined) return \"\";\n if (typeof v === \"number\") return v.toString(10);\n if (typeof v === \"boolean\") return v ? \"true\" : \"false\";\n return JSON.stringify(v);\n}\n\nfunction nodeStr(node: Record<string, unknown>, key: string): string {\n const v = node[key];\n return v === undefined || v === null ? \"\" : toStr(v);\n}\n\nfunction asObj(value: unknown): Record<string, unknown> {\n if (value === null || value === undefined) return {};\n return value as Record<string, unknown>;\n}\n\nfunction asList(value: unknown): Record<string, unknown>[] {\n if (Array.isArray(value)) return value as Record<string, unknown>[];\n return [];\n}\n\n/**\n * Extract a string value from a libpg-query String/str node.\n */\nfunction extractString(node: Record<string, unknown>): string {\n const strNode = nodeGet(node, \"String\") ?? nodeGet(node, \"str\");\n if (strNode !== null && typeof strNode === \"object\") {\n return nodeStr(asObj(strNode), \"sval\") || nodeStr(asObj(strNode), \"str\");\n }\n if (typeof strNode === \"string\") return strNode;\n // Direct sval/str\n const sv = nodeStr(node, \"sval\") || nodeStr(node, \"str\");\n if (sv) return sv;\n return \"\";\n}\n\n/**\n * Extract a relation name from a RangeVar node.\n */\nfunction extractRelName(rangeVar: Record<string, unknown>): string {\n return nodeStr(rangeVar, \"relname\");\n}\n\n/**\n * Extract alias from a RangeVar or subquery node.\n */\nfunction extractAlias(node: Record<string, unknown>): string | null {\n const alias = nodeGet(node, \"alias\");\n if (alias !== null && typeof alias === \"object\") {\n return nodeStr(asObj(alias), \"aliasname\") || null;\n }\n return null;\n}\n\n/**\n * Extract the schema name from a RangeVar node.\n */\nfunction extractSchemaName(rangeVar: Record<string, unknown>): string | null {\n const s = nodeStr(rangeVar, \"schemaname\");\n return s || null;\n}\n\n/**\n * Extract a column name from a ColumnRef AST node (unwrapped).\n */\nfunction extractColumnName(node: Record<string, unknown>): string {\n // Handle both wrapped {ColumnRef: {fields: ...}} and unwrapped {fields: ...}\n const colRef = asObj(nodeGet(node, \"ColumnRef\") ?? node);\n const fields = asList(nodeGet(colRef, \"fields\"));\n if (fields.length > 0) {\n const last = fields[fields.length - 1]!;\n const s = extractString(last);\n if (s) return s;\n }\n // Fallback for direct column ref\n const sv = nodeStr(colRef, \"sval\") || nodeStr(colRef, \"str\");\n if (sv) return sv;\n throw new Error(\"Expected ColumnRef, got \" + JSON.stringify(node).slice(0, 200));\n}\n\n/**\n * Extract a qualified column name (table.column) from a ColumnRef node.\n */\nfunction extractQualifiedColumnName(node: Record<string, unknown>): string {\n const colRef = asObj(nodeGet(node, \"ColumnRef\") ?? node);\n const fields = asList(nodeGet(colRef, \"fields\"));\n if (fields.length >= 2) {\n const parts: string[] = [];\n for (const f of fields) {\n const s = extractString(f);\n if (s) parts.push(s);\n }\n return parts.join(\".\");\n }\n return extractColumnName(node);\n}\n\n/**\n * Check whether a node is a ColumnRef.\n */\nfunction isColumnRef(node: Record<string, unknown>): boolean {\n return nodeGet(node, \"ColumnRef\") !== null;\n}\n\n/**\n * Check whether a node is A_Star or contains A_Star in ColumnRef fields.\n */\nfunction isAStar(node: Record<string, unknown>): boolean {\n if (nodeGet(node, \"A_Star\") !== null && nodeGet(node, \"A_Star\") !== undefined) {\n return true;\n }\n const colRef = nodeGet(node, \"ColumnRef\");\n if (colRef !== null && colRef !== undefined) {\n const fields = asList(nodeGet(asObj(colRef), \"fields\"));\n for (const f of fields) {\n if (nodeGet(f, \"A_Star\") !== null && nodeGet(f, \"A_Star\") !== undefined) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Check whether a node is a FuncCall.\n */\nfunction isFuncCall(node: Record<string, unknown>): boolean {\n return nodeGet(node, \"FuncCall\") !== null;\n}\n\n/**\n * Get function name from a FuncCall node (unwrapped).\n */\nfunction getFuncName(node: Record<string, unknown>): string {\n const fc = asObj(nodeGet(node, \"FuncCall\") ?? node);\n const nameList = asList(nodeGet(fc, \"funcname\"));\n if (nameList.length === 0) return \"\";\n return extractString(nameList[nameList.length - 1]!).toLowerCase();\n}\n\n/**\n * Get function args from a FuncCall node (unwrapped).\n */\nfunction getFuncArgs(node: Record<string, unknown>): Record<string, unknown>[] {\n const fc = asObj(nodeGet(node, \"FuncCall\") ?? node);\n return asList(nodeGet(fc, \"args\"));\n}\n\n/**\n * Check if a FuncCall has agg_star set.\n */\nfunction isAggStar(node: Record<string, unknown>): boolean {\n const fc = asObj(nodeGet(node, \"FuncCall\") ?? node);\n return nodeGet(fc, \"agg_star\") === true;\n}\n\n/**\n * Check if a FuncCall has agg_distinct set.\n */\nfunction isAggDistinct(node: Record<string, unknown>): boolean {\n const fc = asObj(nodeGet(node, \"FuncCall\") ?? node);\n return nodeGet(fc, \"agg_distinct\") === true;\n}\n\n/**\n * Check if a FuncCall has OVER clause (window function).\n */\nfunction hasOverClause(node: Record<string, unknown>): boolean {\n const fc = asObj(nodeGet(node, \"FuncCall\") ?? node);\n const over = nodeGet(fc, \"over\");\n return over !== null && over !== undefined;\n}\n\n/**\n * Check if node is a constant (A_Const).\n */\nfunction isAConst(node: Record<string, unknown>): boolean {\n return nodeGet(node, \"A_Const\") !== null;\n}\n\n/**\n * Check if node is a ParamRef.\n */\nfunction isParamRef(node: Record<string, unknown>): boolean {\n return nodeGet(node, \"ParamRef\") !== null;\n}\n\n/**\n * Check if node is an A_Expr.\n */\nfunction isAExpr(node: Record<string, unknown>): boolean {\n return nodeGet(node, \"A_Expr\") !== null;\n}\n\n/**\n * Check if node is a BoolExpr.\n */\nfunction isBoolExpr(node: Record<string, unknown>): boolean {\n return nodeGet(node, \"BoolExpr\") !== null;\n}\n\n/**\n * Check if node is a NullTest.\n */\nfunction isNullTest(node: Record<string, unknown>): boolean {\n return nodeGet(node, \"NullTest\") !== null;\n}\n\n/**\n * Check if node is a SubLink.\n */\nfunction isSubLink(node: Record<string, unknown>): boolean {\n return nodeGet(node, \"SubLink\") !== null;\n}\n\n/**\n * Check if node is a TypeCast.\n */\nfunction isTypeCast(node: Record<string, unknown>): boolean {\n return nodeGet(node, \"TypeCast\") !== null;\n}\n\n/**\n * Check if node is an A_ArrayExpr.\n */\nfunction isArrayExpr(node: Record<string, unknown>): boolean {\n return nodeGet(node, \"A_ArrayExpr\") !== null;\n}\n\n/**\n * Extract a constant value from an A_Const or ParamRef node.\n */\nfunction extractConstValue(node: Record<string, unknown>, params: unknown[]): unknown {\n // Handle ParamRef ($1, $2, ...)\n const paramRef = nodeGet(node, \"ParamRef\");\n if (paramRef !== null && paramRef !== undefined) {\n const prObj = asObj(paramRef);\n const num = nodeGet(prObj, \"number\") as number;\n const idx = num - 1;\n if (idx < 0 || idx >= params.length) {\n throw new Error(`No value supplied for parameter $${String(num)}`);\n }\n return params[idx];\n }\n\n // Handle A_Const\n const aConst = asObj(nodeGet(node, \"A_Const\") ?? node);\n\n // Check isnull\n if (nodeGet(aConst, \"isnull\") === true) return null;\n\n const ival = nodeGet(aConst, \"ival\");\n if (ival !== null && ival !== undefined) {\n if (typeof ival === \"number\") return ival;\n return Number(ival);\n }\n\n const fval = nodeGet(aConst, \"fval\");\n if (fval !== null && fval !== undefined) {\n return parseFloat(String(fval as string | number));\n }\n\n const sval = nodeGet(aConst, \"sval\");\n if (sval !== null && sval !== undefined) {\n return String(sval as string | number);\n }\n\n const boolval = nodeGet(aConst, \"boolval\");\n if (boolval !== null && boolval !== undefined) {\n return boolval;\n }\n\n // Nested val object (older libpg-query format)\n const val = nodeGet(aConst, \"val\");\n if (val !== null && val !== undefined && typeof val === \"object\") {\n const vObj = asObj(val);\n const intNode = nodeGet(vObj, \"Integer\") ?? nodeGet(vObj, \"ival\");\n if (intNode !== null && intNode !== undefined) {\n if (typeof intNode === \"number\") return intNode;\n const innerIval = nodeGet(asObj(intNode), \"ival\");\n if (innerIval !== null) return Number(innerIval);\n }\n const floatNode = nodeGet(vObj, \"Float\") ?? nodeGet(vObj, \"fval\");\n if (floatNode !== null && floatNode !== undefined) {\n if (typeof floatNode === \"number\") return floatNode;\n const innerFval = nodeGet(asObj(floatNode), \"fval\");\n if (innerFval !== null) return parseFloat(String(innerFval as string | number));\n return parseFloat(String(floatNode as string | number));\n }\n const strNode = nodeGet(vObj, \"String\") ?? nodeGet(vObj, \"sval\");\n if (strNode !== null && strNode !== undefined) {\n if (typeof strNode === \"string\") return strNode;\n const innerSval = nodeGet(asObj(strNode), \"sval\");\n if (innerSval !== null) return String(innerSval as string | number);\n }\n const boolNode = nodeGet(vObj, \"Boolean\") ?? nodeGet(vObj, \"boolval\");\n if (boolNode !== null && boolNode !== undefined) {\n if (typeof boolNode === \"boolean\") return boolNode;\n const innerBool = nodeGet(asObj(boolNode), \"boolval\");\n if (innerBool !== null) return innerBool;\n }\n }\n\n // Direct number/string/boolean\n if (typeof node === \"number\") return node;\n if (typeof node === \"string\") return node;\n\n return null;\n}\n\n/**\n * Extract integer value from node.\n */\nfunction extractIntValue(node: Record<string, unknown>, params: unknown[]): number {\n const val = extractConstValue(node, params);\n return Number(val);\n}\n\n/**\n * Extract string value from node.\n */\nfunction extractStringValue(node: Record<string, unknown>, params: unknown[]): string {\n const val = extractConstValue(node, params);\n return String(val);\n}\n\n/**\n * Extract a vector (array of numbers) from an ARRAY literal or $N param.\n */\nfunction extractVectorArg(\n node: Record<string, unknown>,\n params: unknown[],\n): Float64Array {\n const arrayExpr = nodeGet(node, \"A_ArrayExpr\");\n if (arrayExpr !== null && arrayExpr !== undefined) {\n const elements = asList(nodeGet(asObj(arrayExpr), \"elements\"));\n return new Float64Array(elements.map((e) => Number(extractConstValue(e, params))));\n }\n const paramRef = nodeGet(node, \"ParamRef\");\n if (paramRef !== null && paramRef !== undefined) {\n const prObj = asObj(paramRef);\n const num = nodeGet(prObj, \"number\") as number;\n const idx = num - 1;\n if (idx < 0 || idx >= params.length) {\n throw new Error(`No value supplied for parameter $${String(num)}`);\n }\n const val = params[idx];\n if (val instanceof Float64Array) return val;\n if (val instanceof Float32Array) return new Float64Array(val);\n if (Array.isArray(val)) return new Float64Array(val.map(Number));\n throw new Error(\"Parameter for vector must be an array\");\n }\n throw new Error(\"Expected ARRAY literal or $N parameter for vector\");\n}\n\n/**\n * Extract an insert value from a VALUES clause element.\n * Handles A_Const, A_ArrayExpr, FuncCall, TypeCast, ParamRef.\n */\nfunction extractInsertValue(\n node: Record<string, unknown>,\n params: unknown[],\n evaluator: ExprEvaluator,\n): unknown {\n // ParamRef\n if (isParamRef(node)) {\n const prObj = asObj(nodeGet(node, \"ParamRef\"));\n const num = nodeGet(prObj, \"number\") as number;\n const idx = num - 1;\n if (idx < 0 || idx >= params.length) {\n throw new Error(`Parameter $${String(num)} not provided`);\n }\n const val = params[idx];\n if (\n val !== null &&\n typeof val === \"object\" &&\n \"tolist\" in (val as Record<string, unknown>)\n ) {\n return (val as Record<string, unknown>)[\"tolist\"];\n }\n return val;\n }\n // A_ArrayExpr\n if (isArrayExpr(node)) {\n const elements = asList(nodeGet(asObj(nodeGet(node, \"A_ArrayExpr\")), \"elements\"));\n if (elements.length === 0) return [];\n return elements.map((e) => extractConstValue(e, params));\n }\n // TypeCast\n if (isTypeCast(node)) {\n return evaluator.evaluate(node, {});\n }\n // FuncCall\n if (isFuncCall(node)) {\n return evaluator.evaluate(node, {});\n }\n // Default: use evaluator for complex expressions or extractConstValue for simple\n try {\n return evaluator.evaluate(node, {});\n } catch {\n return extractConstValue(node, params);\n }\n}\n\n// -- Max recursive CTE depth ---------------------------------------------------\n\nconst MAX_RECURSIVE_DEPTH = 1000;\n\n// -- SQLCompiler ----------------------------------------------------------------\n\nexport class SQLCompiler {\n private _tables: Map<string, Table>;\n private _views: Map<string, Record<string, unknown>>;\n private _sequences: Map<\n string,\n { current: number; increment: number; start?: number }\n >;\n private _engine: unknown;\n private _transactionActive: boolean;\n private _prepared: Map<string, Record<string, unknown>>;\n private _params: unknown[];\n private _expandedViews: string[];\n private _shadowedTables: Map<string, Table>;\n private _inlinedCTEs: Map<string, Record<string, unknown>>;\n private _correlatedOuterRow: Record<string, unknown> | null;\n private _foreignServers: Map<\n string,\n { name: string; fdwType: string; options: Record<string, string> }\n >;\n private _foreignTables: Map<\n string,\n {\n name: string;\n serverName: string;\n columns: Map<string, ColumnDef>;\n options: Record<string, string>;\n }\n >;\n\n constructor(engine?: unknown) {\n this._tables = new Map();\n this._views = new Map();\n this._sequences = new Map();\n this._engine = engine ?? null;\n this._transactionActive = false;\n this._prepared = new Map();\n this._params = [];\n this._expandedViews = [];\n this._shadowedTables = new Map();\n this._inlinedCTEs = new Map();\n this._correlatedOuterRow = null;\n this._foreignServers = new Map();\n this._foreignTables = new Map();\n }\n\n /**\n * Create a SubqueryExecutor callback that delegates to _compileSelect.\n * Supports correlated subqueries by accepting an optional outer row.\n */\n private _makeSubqueryExecutor(\n params: unknown[],\n ): (\n stmt: Record<string, unknown>,\n outerRow?: Record<string, unknown>,\n ) => { columns: string[]; rows: Record<string, unknown>[] } {\n return (stmt: Record<string, unknown>, outerRow?: Record<string, unknown>) =>\n this._compileSelect(stmt, params, outerRow);\n }\n\n get tables(): Map<string, Table> {\n return this._tables;\n }\n\n get views(): Map<string, Record<string, unknown>> {\n return this._views;\n }\n\n get engine(): unknown {\n return this._engine;\n }\n\n /**\n * Parse and execute a SQL statement. Returns SQLResult for queries,\n * null for DDL/DML statements.\n */\n async execute(sql: string, params?: unknown[]): Promise<SQLResult | null> {\n this._params = params ? [...params] : [];\n const ast = (await pgParse(sql)) as Record<string, unknown>;\n const stmts = asList(nodeGet(asObj(ast), \"stmts\"));\n\n if (stmts.length === 0) {\n return null;\n }\n\n let lastResult: SQLResult | null = null;\n for (const stmtWrapper of stmts) {\n const stmtNode = asObj(nodeGet(stmtWrapper, \"stmt\"));\n lastResult = this._dispatchStatement(stmtNode, this._params);\n }\n return lastResult;\n }\n\n private _dispatchStatement(\n stmtNode: Record<string, unknown>,\n params: unknown[],\n ): SQLResult | null {\n const keys = Object.keys(stmtNode);\n if (keys.length === 0) return null;\n\n const stmtType = keys[0]!;\n const stmt = asObj(stmtNode[stmtType]);\n\n switch (stmtType) {\n case \"SelectStmt\":\n return this._compileSelect(stmt, params);\n case \"InsertStmt\":\n return this._compileInsert(stmt, params);\n case \"UpdateStmt\":\n return this._compileUpdate(stmt, params);\n case \"DeleteStmt\":\n return this._compileDelete(stmt, params);\n case \"CreateStmt\":\n return this._compileCreateTable(stmt);\n case \"CreateTableAsStmt\":\n return this._compileCreateTableAs(stmt, params);\n case \"DropStmt\":\n return this._compileDrop(stmt);\n case \"ViewStmt\":\n return this._compileCreateView(stmt);\n case \"TransactionStmt\":\n return this._compileTransaction(stmt);\n case \"CreateSeqStmt\":\n return this._compileCreateSequence(stmt);\n case \"AlterSeqStmt\":\n return this._compileAlterSequence(stmt);\n case \"IndexStmt\":\n return this._compileCreateIndex(stmt);\n case \"AlterTableStmt\":\n return this._compileAlterTable(stmt);\n case \"TruncateStmt\":\n return this._compileTruncate(stmt);\n case \"ExplainStmt\":\n return this._compileExplain(stmt, params);\n case \"RenameStmt\":\n return this._compileRename(stmt);\n case \"PrepareStmt\":\n return this._compilePrepare(stmt);\n case \"ExecuteStmt\":\n return this._compileExecute(stmt, params);\n case \"DeallocateStmt\":\n return this._compileDeallocate(stmt);\n case \"VacuumStmt\":\n return this._compileAnalyze(stmt);\n case \"CreateForeignServerStmt\":\n return this._compileCreateForeignServer(stmt);\n case \"CreateForeignTableStmt\":\n return this._compileCreateForeignTable(stmt);\n // Statements that are no-ops in the in-memory engine\n case \"VariableSetStmt\":\n case \"VariableShowStmt\":\n case \"DoStmt\":\n case \"LockStmt\":\n case \"DiscardStmt\":\n return null;\n default:\n throw new Error(`Unsupported statement type: ${stmtType}`);\n }\n }\n\n // ==================================================================\n // DDL: CREATE TABLE\n // ==================================================================\n\n private _compileCreateTable(stmt: Record<string, unknown>): SQLResult | null {\n const relation = asObj(nodeGet(stmt, \"relation\"));\n const tableName = extractRelName(relation);\n const ifNotExists = nodeGet(stmt, \"if_not_exists\") === true;\n\n if (this._tables.has(tableName)) {\n if (ifNotExists) return null;\n throw new Error(`Table \"${tableName}\" already exists`);\n }\n\n const tableElts = asList(nodeGet(stmt, \"tableElts\"));\n const columns: ColumnDef[] = [];\n const foreignKeys: ForeignKeyDef[] = [];\n const checkConstraints: [string, (row: Record<string, unknown>) => boolean][] = [];\n\n let tablePrimaryKey: string | null = null;\n\n for (const elt of tableElts) {\n // Column definition\n const colDef = nodeGet(elt, \"ColumnDef\");\n if (colDef !== null && colDef !== undefined) {\n const colDefObj = asObj(colDef);\n const col = this._parseColumnDef(colDefObj);\n columns.push(col);\n if (col.primaryKey) {\n tablePrimaryKey = col.name;\n }\n\n // Extract column-level constraints (CHECK, FOREIGN KEY)\n const colConstraints = asList(nodeGet(colDefObj, \"constraints\"));\n for (const cc of colConstraints) {\n const ccNode = asObj(nodeGet(cc, \"Constraint\") ?? cc);\n const ccType = nodeGet(ccNode, \"contype\");\n\n // Column-level CHECK constraint\n if (ccType === 1 || ccType === \"CONSTR_CHECK\") {\n const conname =\n nodeStr(ccNode, \"conname\") || `check_${String(checkConstraints.length)}`;\n const rawExpr = nodeGet(ccNode, \"raw_expr\");\n if (rawExpr !== null && rawExpr !== undefined) {\n const evaluator = new ExprEvaluator();\n const exprNode = asObj(rawExpr);\n checkConstraints.push([\n conname,\n (row: Record<string, unknown>) => {\n const result = evaluator.evaluate(exprNode, row);\n return result === true;\n },\n ]);\n }\n }\n\n // Column-level FOREIGN KEY (REFERENCES parent(col))\n if (ccType === 8 || ccType === \"CONSTR_FOREIGN\") {\n const pkTable = asObj(nodeGet(ccNode, \"pktable\"));\n const pkCols = asList(nodeGet(ccNode, \"pk_attrs\"));\n if (pkCols.length > 0) {\n foreignKeys.push({\n column: col.name,\n refTable: extractRelName(pkTable),\n refColumn: extractString(pkCols[0]!),\n });\n }\n }\n }\n\n continue;\n }\n\n // Table constraint\n const constraint = nodeGet(elt, \"Constraint\");\n if (constraint !== null && constraint !== undefined) {\n const constraintNode = asObj(constraint);\n const contype = nodeGet(constraintNode, \"contype\");\n\n // PRIMARY KEY constraint on table level\n // CONSTR_PRIMARY = 5\n if (contype === 5 || contype === \"CONSTR_PRIMARY\") {\n const keysList = asList(nodeGet(constraintNode, \"keys\"));\n if (keysList.length > 0) {\n tablePrimaryKey = extractString(keysList[0]!);\n }\n }\n\n // FOREIGN KEY constraint\n // CONSTR_FOREIGN = 8\n if (contype === 8 || contype === \"CONSTR_FOREIGN\") {\n const fkCols = asList(nodeGet(constraintNode, \"fk_attrs\"));\n const pkTable = asObj(nodeGet(constraintNode, \"pktable\"));\n const pkCols = asList(nodeGet(constraintNode, \"pk_attrs\"));\n if (fkCols.length > 0 && pkCols.length > 0) {\n foreignKeys.push({\n column: extractString(fkCols[0]!),\n refTable: extractRelName(pkTable),\n refColumn: extractString(pkCols[0]!),\n });\n }\n }\n\n // UNIQUE constraint\n // CONSTR_UNIQUE = 4\n if (contype === 4 || contype === \"CONSTR_UNIQUE\") {\n const uniqueKeys = asList(nodeGet(constraintNode, \"keys\"));\n for (const uk of uniqueKeys) {\n const colName = extractString(uk);\n const existingIdx = columns.findIndex((c) => c.name === colName);\n if (existingIdx !== -1) {\n const existing = columns[existingIdx]!;\n columns[existingIdx] = createColumnDef(existing.name, existing.typeName, {\n ...existing,\n unique: true,\n });\n }\n }\n }\n\n // CHECK constraint\n // CONSTR_CHECK = 1\n if (contype === 1 || contype === \"CONSTR_CHECK\") {\n const conname =\n nodeStr(constraintNode, \"conname\") ||\n `check_${String(checkConstraints.length)}`;\n const rawExpr = nodeGet(constraintNode, \"raw_expr\");\n if (rawExpr !== null && rawExpr !== undefined) {\n const evaluator = new ExprEvaluator();\n const exprNode = asObj(rawExpr);\n checkConstraints.push([\n conname,\n (row: Record<string, unknown>) => {\n const result = evaluator.evaluate(exprNode, row);\n return result === true;\n },\n ]);\n }\n }\n }\n }\n\n // Apply table-level PRIMARY KEY to column definition\n if (tablePrimaryKey !== null) {\n const idx = columns.findIndex((c) => c.name === tablePrimaryKey);\n if (idx !== -1) {\n const existing = columns[idx]!;\n columns[idx] = createColumnDef(existing.name, existing.typeName, {\n ...existing,\n primaryKey: true,\n notNull: true,\n });\n }\n }\n\n const table = new Table(tableName, columns);\n table.foreignKeys = foreignKeys;\n table.checkConstraints = checkConstraints;\n this._tables.set(tableName, table);\n\n // Register foreign key validators\n if (foreignKeys.length > 0) {\n this._registerFkValidators(tableName, table, foreignKeys);\n }\n\n // Create implicit sequence for SERIAL/BIGSERIAL columns\n for (const col of columns) {\n if (col.autoIncrement) {\n const seqName = `${tableName}_${col.name}_seq`;\n this._sequences.set(seqName, { current: 0, increment: 1, start: 1 });\n }\n }\n\n return null;\n }\n\n // ==================================================================\n // DDL: CREATE TABLE AS SELECT\n // ==================================================================\n\n private _compileCreateTableAs(\n stmt: Record<string, unknown>,\n params: unknown[],\n ): SQLResult | null {\n const into = asObj(nodeGet(stmt, \"into\"));\n const rel = asObj(nodeGet(into, \"rel\"));\n const tableName = extractRelName(rel);\n\n if (this._tables.has(tableName)) {\n throw new Error(`Table \"${tableName}\" already exists`);\n }\n\n const query = asObj(nodeGet(stmt, \"query\"));\n const selectStmt = asObj(nodeGet(query, \"SelectStmt\") ?? query);\n const result = this._compileSelect(selectStmt, params);\n\n // Infer column definitions from query result\n const columns: ColumnDef[] = [];\n for (const colName of result.columns) {\n let typeName = \"text\";\n let jsType = \"string\";\n if (result.rows.length > 0) {\n const sample = result.rows[0]![colName];\n if (typeof sample === \"number\") {\n if (Number.isInteger(sample)) {\n typeName = \"integer\";\n jsType = \"number\";\n } else {\n typeName = \"real\";\n jsType = \"number\";\n }\n } else if (typeof sample === \"boolean\") {\n typeName = \"boolean\";\n jsType = \"boolean\";\n } else if (Array.isArray(sample)) {\n typeName = \"text[]\";\n jsType = \"array\";\n } else if (typeof sample === \"object\" && sample !== null) {\n typeName = \"jsonb\";\n jsType = \"object\";\n }\n }\n columns.push(createColumnDef(colName, typeName, { pythonType: jsType }));\n }\n\n const table = new Table(tableName, columns);\n this._tables.set(tableName, table);\n\n // Insert result rows\n let inserted = 0;\n for (const row of result.rows) {\n const clean: Record<string, unknown> = {};\n for (const c of result.columns) {\n clean[c] = row[c] ?? null;\n }\n table.insert(clean);\n inserted++;\n }\n\n return { columns: [\"inserted\"], rows: [{ inserted }] };\n }\n\n // ==================================================================\n // DDL: CREATE SEQUENCE / ALTER SEQUENCE\n // ==================================================================\n\n private _compileCreateSequence(stmt: Record<string, unknown>): SQLResult | null {\n const sequence = asObj(nodeGet(stmt, \"sequence\"));\n const seqName = extractRelName(sequence);\n const options = asList(nodeGet(stmt, \"options\"));\n\n if (this._sequences.has(seqName)) {\n if (nodeGet(stmt, \"if_not_exists\") === true) return null;\n throw new Error(`Sequence \"${seqName}\" already exists`);\n }\n\n let startVal = 1;\n let incrementVal = 1;\n\n for (const opt of options) {\n const defElem = asObj(nodeGet(opt, \"DefElem\") ?? opt);\n const defname = nodeStr(defElem, \"defname\");\n const arg = nodeGet(defElem, \"arg\");\n if (defname === \"start\" && arg !== null) {\n const argObj = asObj(arg);\n startVal = Number(\n nodeGet(argObj, \"ival\") ??\n nodeGet(asObj(nodeGet(argObj, \"Integer\") ?? {}), \"ival\") ??\n 1,\n );\n }\n if (defname === \"increment\" && arg !== null) {\n const argObj = asObj(arg);\n incrementVal = Number(\n nodeGet(argObj, \"ival\") ??\n nodeGet(asObj(nodeGet(argObj, \"Integer\") ?? {}), \"ival\") ??\n 1,\n );\n }\n }\n\n this._sequences.set(seqName, {\n current: startVal - incrementVal,\n increment: incrementVal,\n start: startVal,\n });\n return null;\n }\n\n private _compileAlterSequence(stmt: Record<string, unknown>): SQLResult | null {\n const sequence = asObj(nodeGet(stmt, \"sequence\"));\n const seqName = extractRelName(sequence);\n const seq = this._sequences.get(seqName);\n if (seq === undefined) {\n throw new Error(`Sequence \"${seqName}\" does not exist`);\n }\n\n const options = asList(nodeGet(stmt, \"options\"));\n for (const opt of options) {\n const defElem = asObj(nodeGet(opt, \"DefElem\") ?? opt);\n const defname = nodeStr(defElem, \"defname\");\n const arg = nodeGet(defElem, \"arg\");\n\n if (defname === \"restart\") {\n if (arg !== null && arg !== undefined) {\n const argObj = asObj(arg);\n const restartVal = Number(\n nodeGet(argObj, \"ival\") ??\n nodeGet(asObj(nodeGet(argObj, \"Integer\") ?? {}), \"ival\") ??\n seq.start ??\n 1,\n );\n seq.current = restartVal - seq.increment;\n } else {\n seq.current = (seq.start ?? 1) - seq.increment;\n }\n } else if (defname === \"increment\") {\n if (arg !== null && arg !== undefined) {\n const argObj = asObj(arg);\n seq.increment = Number(\n nodeGet(argObj, \"ival\") ??\n nodeGet(asObj(nodeGet(argObj, \"Integer\") ?? {}), \"ival\") ??\n 1,\n );\n }\n } else if (defname === \"start\") {\n if (arg !== null && arg !== undefined) {\n const argObj = asObj(arg);\n seq.start = Number(\n nodeGet(argObj, \"ival\") ??\n nodeGet(asObj(nodeGet(argObj, \"Integer\") ?? {}), \"ival\") ??\n 1,\n );\n }\n }\n }\n\n return null;\n }\n\n private _parseColumnDef(node: Record<string, unknown>): ColumnDef {\n const colName = nodeStr(node, \"colname\");\n const typeNameNode = asObj(nodeGet(node, \"typeName\"));\n\n // Extract type name\n const names = asList(nodeGet(typeNameNode, \"names\"));\n const typeNames: string[] = [];\n for (const n of names) {\n const s = extractString(n);\n if (s && s !== \"pg_catalog\") {\n typeNames.push(s);\n }\n }\n\n // Check for array type\n const arrayBounds = asList(nodeGet(typeNameNode, \"arrayBounds\"));\n const isArray = arrayBounds.length > 0;\n\n let [resolvedType, jsType] =\n typeNames.length > 0 ? resolveType(typeNames) : [\"text\", \"string\"];\n\n // Check for SERIAL types\n let isAutoIncrement = false;\n const rawTypeUpper = typeNames.join(\" \").toUpperCase();\n if (\n rawTypeUpper === \"SERIAL\" ||\n rawTypeUpper === \"BIGSERIAL\" ||\n rawTypeUpper === \"SMALLSERIAL\"\n ) {\n isAutoIncrement = true;\n }\n\n if (isArray) {\n resolvedType = \"array\";\n jsType = \"array\";\n }\n\n // Extract type modifiers (precision, scale, vector dimensions)\n const typmods = asList(nodeGet(typeNameNode, \"typmods\"));\n let numericPrecision: number | null = null;\n let numericScale: number | null = null;\n let vectorDimensions: number | null = null;\n\n if (typmods.length > 0) {\n const firstMod =\n nodeGet(typmods[0]!, \"Integer\") ?? nodeGet(typmods[0]!, \"A_Const\");\n if (firstMod !== null && firstMod !== undefined) {\n const val = nodeGet(asObj(firstMod), \"ival\");\n if (val !== null && typeof val === \"number\") {\n if (resolvedType === \"vector\") {\n vectorDimensions = val;\n } else {\n numericPrecision = val;\n }\n }\n }\n if (typmods.length > 1) {\n const secondMod =\n nodeGet(typmods[1]!, \"Integer\") ?? nodeGet(typmods[1]!, \"A_Const\");\n if (secondMod !== null && secondMod !== undefined) {\n const val = nodeGet(asObj(secondMod), \"ival\");\n if (val !== null && typeof val === \"number\") {\n numericScale = val;\n }\n }\n }\n }\n\n // Parse column constraints\n let isPrimaryKey = false;\n let isNotNull = false;\n let isUnique = false;\n let defaultValue: unknown = null;\n\n const constraints = asList(nodeGet(node, \"constraints\"));\n for (const constraint of constraints) {\n const conNode = asObj(nodeGet(constraint, \"Constraint\") ?? constraint);\n const contype = nodeGet(conNode, \"contype\");\n\n // CONSTR_NOTNULL = 0 or 1 depending on version\n if (contype === \"CONSTR_NOTNULL\" || contype === 1) {\n isNotNull = true;\n }\n // CONSTR_PRIMARY = 5\n if (contype === \"CONSTR_PRIMARY\" || contype === 5) {\n isPrimaryKey = true;\n isNotNull = true;\n }\n // CONSTR_UNIQUE = 4\n if (contype === \"CONSTR_UNIQUE\" || contype === 4) {\n isUnique = true;\n }\n // CONSTR_DEFAULT = 2\n if (contype === \"CONSTR_DEFAULT\" || contype === 2) {\n const rawExpr = nodeGet(conNode, \"raw_expr\");\n if (rawExpr !== null && rawExpr !== undefined) {\n const evaluator = new ExprEvaluator();\n defaultValue = evaluator.evaluate(asObj(rawExpr), {});\n }\n }\n // CONSTR_NULL = 0 (explicit NULL constraint -- allowed)\n // CONSTR_IDENTITY = 9 (GENERATED ALWAYS AS IDENTITY)\n if (contype === \"CONSTR_IDENTITY\" || contype === 9) {\n isAutoIncrement = true;\n isNotNull = true;\n }\n // CONSTR_FOREIGN = 8\n // (column-level FK -- handled below but doesn't affect column flags)\n }\n\n // SERIAL implies NOT NULL + autoincrement\n if (isAutoIncrement) {\n isNotNull = true;\n }\n\n return createColumnDef(colName, resolvedType, {\n pythonType: jsType,\n primaryKey: isPrimaryKey,\n notNull: isNotNull,\n autoIncrement: isAutoIncrement,\n defaultValue,\n vectorDimensions,\n unique: isUnique,\n numericPrecision,\n numericScale,\n });\n }\n\n // ==================================================================\n // DDL: DROP TABLE / DROP VIEW / DROP INDEX\n // ==================================================================\n\n private _compileDrop(stmt: Record<string, unknown>): SQLResult | null {\n // removeType: 41=TABLE, 20=INDEX, 51=VIEW, 17=FOREIGN_SERVER, 18=FOREIGN_TABLE\n const removeType = nodeGet(stmt, \"removeType\") as number | string;\n if (removeType === 20 || removeType === \"OBJECT_INDEX\") {\n return this._compileDropIndex(stmt);\n }\n if (removeType === 51 || removeType === \"OBJECT_VIEW\") {\n return this._compileDropView(stmt);\n }\n if (removeType === 17 || removeType === \"OBJECT_FOREIGN_SERVER\") {\n return this._compileDropForeignServer(stmt);\n }\n if (removeType === 18 || removeType === \"OBJECT_FOREIGN_TABLE\") {\n return this._compileDropForeignTable(stmt);\n }\n return this._compileDropTable(stmt);\n }\n\n private _compileDropTable(stmt: Record<string, unknown>): SQLResult | null {\n const objects = asList(nodeGet(stmt, \"objects\"));\n const ifExists = nodeGet(stmt, \"missing_ok\") === true;\n\n for (const obj of objects) {\n const items = asList(obj);\n let tableName: string;\n if (items.length > 0) {\n tableName = extractString(items[items.length - 1]!);\n } else {\n tableName = extractString(obj);\n }\n\n if (!tableName) continue;\n\n if (!this._tables.has(tableName)) {\n if (ifExists) continue;\n throw new Error(`Table \"${tableName}\" does not exist`);\n }\n this._tables.delete(tableName);\n\n // Clean up associated sequences\n for (const [seqName] of this._sequences) {\n if (seqName.startsWith(`${tableName}_`)) {\n this._sequences.delete(seqName);\n }\n }\n }\n return null;\n }\n\n private _compileDropView(stmt: Record<string, unknown>): SQLResult | null {\n const objects = asList(nodeGet(stmt, \"objects\"));\n const ifExists = nodeGet(stmt, \"missing_ok\") === true;\n\n for (const obj of objects) {\n // Objects may be List-wrapped: { List: { items: [...] } }\n let items = asList(obj);\n if (items.length === 0) {\n const listNode = nodeGet(asObj(obj), \"List\");\n if (listNode !== null && listNode !== undefined) {\n items = asList(nodeGet(asObj(listNode), \"items\"));\n }\n }\n let viewName: string;\n if (items.length > 0) {\n viewName = extractString(items[items.length - 1]!);\n } else {\n viewName = extractString(obj);\n }\n\n if (!viewName) continue;\n\n if (!this._views.has(viewName)) {\n if (ifExists) continue;\n throw new Error(`View \"${viewName}\" does not exist`);\n }\n this._views.delete(viewName);\n }\n return null;\n }\n\n private _compileDropIndex(_stmt: Record<string, unknown>): SQLResult | null {\n // Index operations are no-op in in-memory mode\n return null;\n }\n\n // ==================================================================\n // DDL: FOREIGN DATA WRAPPERS\n // ==================================================================\n\n private _compileCreateForeignServer(stmt: Record<string, unknown>): SQLResult | null {\n const name = nodeStr(stmt, \"servername\");\n if (this._foreignServers.has(name)) {\n if (nodeGet(stmt, \"if_not_exists\") === true) return null;\n throw new Error(`Foreign server '${name}' already exists`);\n }\n\n const fdwType = nodeStr(stmt, \"fdwname\");\n if (fdwType !== \"duckdb_fdw\" && fdwType !== \"arrow_fdw\") {\n throw new Error(`Unsupported FDW type: '${fdwType}'`);\n }\n\n const options: Record<string, string> = {};\n const optList = asList(nodeGet(stmt, \"options\"));\n for (const opt of optList) {\n const optObj = asObj(nodeGet(opt, \"DefElem\") ?? opt);\n const defname = nodeStr(optObj, \"defname\");\n const argNode = asObj(nodeGet(optObj, \"arg\"));\n const argVal =\n nodeStr(argNode, \"sval\") ||\n nodeStr(asObj(nodeGet(argNode, \"String\") ?? {}), \"sval\");\n if (defname) options[defname] = argVal;\n }\n\n this._foreignServers.set(name, { name, fdwType, options });\n return null;\n }\n\n private _compileCreateForeignTable(stmt: Record<string, unknown>): SQLResult | null {\n const base = asObj(nodeGet(stmt, \"base\"));\n const relation = asObj(nodeGet(base, \"relation\"));\n const tableName = extractRelName(relation);\n if (this._foreignTables.has(tableName)) {\n if (nodeGet(base, \"if_not_exists\") === true) return null;\n throw new Error(`Foreign table '${tableName}' already exists`);\n }\n if (this._tables.has(tableName)) {\n throw new Error(`Table '${tableName}' already exists`);\n }\n\n const serverName = nodeStr(stmt, \"servername\");\n if (!this._foreignServers.has(serverName)) {\n throw new Error(`Foreign server '${serverName}' does not exist`);\n }\n\n const columns = new Map<string, ColumnDef>();\n const tableElts = asList(nodeGet(base, \"tableElts\"));\n for (const elt of tableElts) {\n const colDefNode = asObj(nodeGet(elt, \"ColumnDef\") ?? elt);\n const col = this._parseColumnDef(colDefNode);\n columns.set(col.name, col);\n }\n\n const options: Record<string, string> = {};\n const optList = asList(nodeGet(stmt, \"options\"));\n for (const opt of optList) {\n const optObj = asObj(nodeGet(opt, \"DefElem\") ?? opt);\n const defname = nodeStr(optObj, \"defname\");\n const argNode = asObj(nodeGet(optObj, \"arg\"));\n const argVal =\n nodeStr(argNode, \"sval\") ||\n nodeStr(asObj(nodeGet(argNode, \"String\") ?? {}), \"sval\");\n if (defname) options[defname] = argVal;\n }\n\n this._foreignTables.set(tableName, {\n name: tableName,\n serverName,\n columns,\n options,\n });\n return null;\n }\n\n private _compileDropForeignServer(stmt: Record<string, unknown>): SQLResult | null {\n const objects = asList(nodeGet(stmt, \"objects\"));\n const ifExists = nodeGet(stmt, \"missing_ok\") === true;\n\n for (const obj of objects) {\n // DROP SERVER objects may be a flat string node or list of string nodes\n let name: string;\n if (Array.isArray(obj)) {\n const items = obj as Record<string, unknown>[];\n name = extractString(items[items.length - 1]!);\n } else {\n name = extractString(obj);\n }\n\n if (this._foreignServers.has(name)) {\n // Validate no foreign tables reference this server\n for (const ft of this._foreignTables.values()) {\n if (ft.serverName === name) {\n throw new Error(\n `Cannot drop server '${name}': foreign table '${ft.name}' depends on it`,\n );\n }\n }\n this._foreignServers.delete(name);\n } else if (!ifExists) {\n throw new Error(`Foreign server '${name}' does not exist`);\n }\n }\n return null;\n }\n\n private _compileDropForeignTable(stmt: Record<string, unknown>): SQLResult | null {\n const objects = asList(nodeGet(stmt, \"objects\"));\n const ifExists = nodeGet(stmt, \"missing_ok\") === true;\n\n for (const obj of objects) {\n const items = asList(obj);\n let tableName: string;\n if (items.length > 0) {\n tableName = extractString(items[items.length - 1]!);\n } else {\n tableName = extractString(obj);\n }\n if (!tableName) continue;\n\n if (this._foreignTables.has(tableName)) {\n this._foreignTables.delete(tableName);\n } else if (!ifExists) {\n throw new Error(`Foreign table '${tableName}' does not exist`);\n }\n }\n return null;\n }\n\n // ==================================================================\n // DDL: CREATE VIEW\n // ==================================================================\n\n private _compileCreateView(stmt: Record<string, unknown>): SQLResult | null {\n const view = asObj(nodeGet(stmt, \"view\"));\n const viewName = extractRelName(view);\n if (this._tables.has(viewName)) {\n throw new Error(`\"${viewName}\" already exists as a table`);\n }\n if (this._views.has(viewName)) {\n throw new Error(`View \"${viewName}\" already exists`);\n }\n const query = asObj(nodeGet(stmt, \"query\"));\n const selectStmt = asObj(nodeGet(query, \"SelectStmt\") ?? query);\n this._views.set(viewName, selectStmt);\n return null;\n }\n\n // ==================================================================\n // DDL: CREATE INDEX\n // ==================================================================\n\n private _compileCreateIndex(_stmt: Record<string, unknown>): SQLResult | null {\n // Index creation is a no-op in in-memory mode since our tables\n // use built-in indexes (inverted, vector, spatial).\n return null;\n }\n\n // ==================================================================\n // DDL: ALTER TABLE\n // ==================================================================\n\n private _compileAlterTable(stmt: Record<string, unknown>): SQLResult | null {\n const relation = asObj(nodeGet(stmt, \"relation\"));\n const tableName = extractRelName(relation);\n const table = this._tables.get(tableName);\n if (!table) {\n throw new Error(`Table \"${tableName}\" does not exist`);\n }\n\n const cmds = asList(nodeGet(stmt, \"cmds\"));\n for (const cmdWrapper of cmds) {\n const cmd = asObj(nodeGet(cmdWrapper, \"AlterTableCmd\") ?? cmdWrapper);\n const subtype = nodeGet(cmd, \"subtype\") as number | string;\n const subtypeStr = typeof subtype === \"string\" ? subtype : \"\";\n\n if (subtypeStr === \"AT_AddColumn\" || subtype === 0 || subtype === 14) {\n // ADD COLUMN\n const defNode = asObj(nodeGet(cmd, \"def\"));\n const colDefNode = asObj(nodeGet(defNode, \"ColumnDef\") ?? defNode);\n const col = this._parseColumnDef(colDefNode);\n if (table.columns.has(col.name)) {\n throw new Error(\n `Column \"${col.name}\" already exists in table \"${tableName}\"`,\n );\n }\n table.columns.set(col.name, col);\n } else if (subtypeStr === \"AT_DropColumn\" || subtype === 10 || subtype === 12) {\n // DROP COLUMN\n const colName = nodeStr(cmd, \"name\");\n const missingOk = nodeGet(cmd, \"missing_ok\") === true;\n if (!table.columns.has(colName)) {\n if (missingOk) continue;\n throw new Error(`Column \"${colName}\" does not exist in table \"${tableName}\"`);\n }\n table.columns.delete(colName);\n // Remove field from all documents\n for (const docId of table.documentStore.docIds) {\n const doc = table.documentStore.get(docId);\n if (doc && colName in doc) {\n Reflect.deleteProperty(doc, colName);\n table.documentStore.put(docId, doc);\n }\n }\n } else if (subtypeStr === \"AT_ColumnDefault\" || subtype === 5 || subtype === 6) {\n // SET DEFAULT / DROP DEFAULT\n const colName = nodeStr(cmd, \"name\");\n if (!table.columns.has(colName)) {\n throw new Error(`Column \"${colName}\" does not exist in table \"${tableName}\"`);\n }\n const defExpr = nodeGet(cmd, \"def\");\n const existing = table.columns.get(colName)!;\n if (defExpr !== null && defExpr !== undefined) {\n const evaluator = new ExprEvaluator();\n const newDefault = evaluator.evaluate(asObj(defExpr), {});\n table.columns.set(\n colName,\n createColumnDef(existing.name, existing.typeName, {\n ...existing,\n defaultValue: newDefault,\n }),\n );\n } else {\n table.columns.set(\n colName,\n createColumnDef(existing.name, existing.typeName, {\n ...existing,\n defaultValue: null,\n }),\n );\n }\n } else if (subtypeStr === \"AT_SetNotNull\" || subtype === 7 || subtype === 9) {\n // SET NOT NULL\n const colName = nodeStr(cmd, \"name\");\n if (!table.columns.has(colName)) {\n throw new Error(`Column \"${colName}\" does not exist in table \"${tableName}\"`);\n }\n // Validate existing data\n for (const docId of table.documentStore.docIds) {\n const doc = table.documentStore.get(docId);\n if (doc) {\n const val = doc[colName];\n if (val === null || val === undefined) {\n throw new Error(\n `Column \"${colName}\" contains NULL values; cannot set NOT NULL`,\n );\n }\n }\n }\n const existing = table.columns.get(colName)!;\n table.columns.set(\n colName,\n createColumnDef(existing.name, existing.typeName, {\n ...existing,\n notNull: true,\n }),\n );\n } else if (subtypeStr === \"AT_DropNotNull\" || subtype === 6 || subtype === 8) {\n // DROP NOT NULL\n const colName = nodeStr(cmd, \"name\");\n if (!table.columns.has(colName)) {\n throw new Error(`Column \"${colName}\" does not exist in table \"${tableName}\"`);\n }\n const existing = table.columns.get(colName)!;\n table.columns.set(\n colName,\n createColumnDef(existing.name, existing.typeName, {\n ...existing,\n notNull: false,\n }),\n );\n } else if (\n subtypeStr === \"AT_AlterColumnType\" ||\n subtype === 25 ||\n subtype === 28\n ) {\n // ALTER COLUMN TYPE\n const colName = nodeStr(cmd, \"name\");\n if (!table.columns.has(colName)) {\n throw new Error(`Column \"${colName}\" does not exist in table \"${tableName}\"`);\n }\n const defNode = asObj(nodeGet(cmd, \"def\"));\n const colDefNode = asObj(nodeGet(defNode, \"ColumnDef\") ?? defNode);\n const typeNameNode = asObj(nodeGet(colDefNode, \"typeName\"));\n const typeNames: string[] = [];\n for (const n of asList(nodeGet(typeNameNode, \"names\"))) {\n const s = extractString(n);\n if (s && s !== \"pg_catalog\") typeNames.push(s);\n }\n const [newResolvedType, newJsType] =\n typeNames.length > 0 ? resolveType(typeNames) : [\"text\", \"string\"];\n const existing = table.columns.get(colName)!;\n table.columns.set(\n colName,\n createColumnDef(colName, newResolvedType, {\n pythonType: newJsType,\n primaryKey: existing.primaryKey,\n notNull: existing.notNull,\n autoIncrement: existing.autoIncrement,\n defaultValue: existing.defaultValue,\n vectorDimensions: existing.vectorDimensions,\n unique: existing.unique,\n numericPrecision: existing.numericPrecision,\n numericScale: existing.numericScale,\n }),\n );\n // Coerce existing data to the new type\n for (const docId of Array.from(table.documentStore.docIds)) {\n const doc = table.documentStore.get(docId);\n if (doc && doc[colName] !== null && doc[colName] !== undefined) {\n let coerced: unknown = doc[colName];\n if (newJsType === \"number\") {\n coerced = Number(coerced);\n if (isNaN(coerced as number)) coerced = doc[colName];\n } else if (newJsType === \"string\") {\n coerced = String(coerced);\n } else if (newJsType === \"boolean\") {\n coerced = Boolean(coerced);\n }\n doc[colName] = coerced;\n table.documentStore.put(docId, doc);\n }\n }\n } else {\n throw new Error(`Unsupported ALTER TABLE subcommand: ${String(subtype)}`);\n }\n }\n\n return null;\n }\n\n // ==================================================================\n // DDL: RENAME TABLE / COLUMN\n // ==================================================================\n\n private _compileRename(stmt: Record<string, unknown>): SQLResult | null {\n const renameType = nodeGet(stmt, \"renameType\") as number | string;\n const renameTypeStr = typeof renameType === \"string\" ? renameType : \"\";\n\n // OBJECT_TABLE = 36 or 42 depending on pg version\n if (renameTypeStr === \"OBJECT_TABLE\" || renameType === 36 || renameType === 42) {\n const relation = asObj(nodeGet(stmt, \"relation\"));\n const oldName = extractRelName(relation);\n const newName = nodeStr(stmt, \"newname\");\n const table = this._tables.get(oldName);\n if (!table) {\n throw new Error(`Table \"${oldName}\" does not exist`);\n }\n if (this._tables.has(newName)) {\n throw new Error(`Table \"${newName}\" already exists`);\n }\n this._tables.delete(oldName);\n this._tables.set(newName, table);\n return null;\n }\n\n // OBJECT_COLUMN = 8 or 9 depending on pg version\n if (renameTypeStr === \"OBJECT_COLUMN\" || renameType === 8 || renameType === 9) {\n const relation = asObj(nodeGet(stmt, \"relation\"));\n const tableName = extractRelName(relation);\n const table = this._tables.get(tableName);\n if (!table) {\n throw new Error(`Table \"${tableName}\" does not exist`);\n }\n const oldCol = nodeStr(stmt, \"subname\");\n const newCol = nodeStr(stmt, \"newname\");\n if (!table.columns.has(oldCol)) {\n throw new Error(`Column \"${oldCol}\" does not exist in table \"${tableName}\"`);\n }\n if (table.columns.has(newCol)) {\n throw new Error(`Column \"${newCol}\" already exists in table \"${tableName}\"`);\n }\n // Rebuild column map preserving insertion order\n const entries = [...table.columns.entries()];\n table.columns.clear();\n for (const [name, col] of entries) {\n if (name === oldCol) {\n const renamed = createColumnDef(newCol, col.typeName, { ...col });\n table.columns.set(newCol, renamed);\n } else {\n table.columns.set(name, col);\n }\n }\n // Rename field in all documents\n for (const docId of table.documentStore.docIds) {\n const doc = table.documentStore.get(docId);\n if (doc && oldCol in doc) {\n doc[newCol] = doc[oldCol];\n \n Reflect.deleteProperty(doc, oldCol);\n table.documentStore.put(docId, doc);\n }\n }\n return null;\n }\n\n throw new Error(`Unsupported RENAME type: ${String(renameType)}`);\n }\n\n // ==================================================================\n // DDL: TRUNCATE\n // ==================================================================\n\n private _compileTruncate(stmt: Record<string, unknown>): SQLResult | null {\n const relations = asList(nodeGet(stmt, \"relations\"));\n for (const rel of relations) {\n const rangeVar = asObj(nodeGet(rel, \"RangeVar\") ?? rel);\n const tableName = extractRelName(rangeVar);\n const table = this._tables.get(tableName);\n if (!table) {\n throw new Error(`Table \"${tableName}\" does not exist`);\n }\n table.documentStore.clear();\n table.invertedIndex.clear();\n for (const [, vi] of table.vectorIndexes) {\n vi.clear();\n }\n for (const [, si] of table.spatialIndexes) {\n si.clear();\n }\n // Reset auto-increment sequences for SERIAL columns\n table._nextDocId = 1;\n for (const col of table.columns.values()) {\n if (col.autoIncrement) {\n const seqName = `${tableName}_${col.name}_seq`;\n const seq = this._sequences.get(seqName);\n if (seq) {\n seq.current = (seq.start ?? 1) - seq.increment;\n }\n }\n }\n }\n return null;\n }\n\n // ==================================================================\n // DML: INSERT INTO\n // ==================================================================\n\n private _compileInsert(\n stmt: Record<string, unknown>,\n params: unknown[],\n ): SQLResult | null {\n const relation = asObj(nodeGet(stmt, \"relation\"));\n const tableName = extractRelName(relation);\n const table = this._tables.get(tableName);\n if (!table) {\n throw new Error(`Table \"${tableName}\" does not exist`);\n }\n\n // Column names\n const colsNodes = asList(nodeGet(stmt, \"cols\"));\n let colNames: string[];\n if (colsNodes.length > 0) {\n colNames = colsNodes.map((col) => {\n const target = asObj(nodeGet(col, \"ResTarget\") ?? col);\n return nodeStr(target, \"name\");\n });\n } else {\n colNames = table.columnNames;\n }\n\n // VALUES or SELECT source\n const selectStmtRaw = asObj(nodeGet(stmt, \"selectStmt\"));\n const selectStmt = asObj(nodeGet(selectStmtRaw, \"SelectStmt\") ?? selectStmtRaw);\n const valuesLists = asList(nodeGet(selectStmt, \"valuesLists\"));\n\n const evaluator = new ExprEvaluator({\n params,\n sequences: this._sequences,\n subqueryExecutor: this._makeSubqueryExecutor(params),\n });\n\n // Collect source rows\n const sourceRows: Record<string, unknown>[] = [];\n\n if (valuesLists.length === 0) {\n // INSERT INTO ... SELECT ...\n const result = this._compileSelect(selectStmt, params);\n for (const row of result.rows) {\n const mappedRow: Record<string, unknown> = {};\n for (let i = 0; i < colNames.length; i++) {\n if (i < result.columns.length) {\n mappedRow[colNames[i]!] = row[result.columns[i]!] ?? null;\n }\n }\n sourceRows.push(mappedRow);\n }\n } else {\n // INSERT INTO ... VALUES ...\n for (const valueList of valuesLists) {\n const listNode = asObj(nodeGet(valueList, \"List\"));\n const items = asList(nodeGet(listNode, \"items\") ?? valueList);\n\n if (items.length !== colNames.length) {\n throw new Error(\n `VALUES has ${String(items.length)} columns but ${String(colNames.length)} were specified`,\n );\n }\n\n const row: Record<string, unknown> = {};\n for (let i = 0; i < colNames.length; i++) {\n row[colNames[i]!] = extractInsertValue(items[i]!, params, evaluator);\n }\n sourceRows.push(row);\n }\n }\n\n // ON CONFLICT handling\n const onConflictClause = nodeGet(stmt, \"onConflictClause\");\n let conflictCols: string[] = [];\n let conflictAction: string | number | null = null;\n let conflictTargetList: Record<string, unknown>[] = [];\n\n if (onConflictClause !== null && onConflictClause !== undefined) {\n const ocObj = asObj(onConflictClause);\n const infer = asObj(nodeGet(ocObj, \"infer\"));\n const indexElems = asList(nodeGet(infer, \"indexElems\"));\n conflictCols = indexElems.map((elem) => {\n const ie = asObj(nodeGet(elem, \"IndexElem\") ?? elem);\n return nodeStr(ie, \"name\");\n });\n conflictAction = nodeGet(ocObj, \"action\") as string | number;\n conflictTargetList = asList(nodeGet(ocObj, \"targetList\"));\n }\n\n // Build hash index for O(1) conflict lookups\n const conflictIndex = new Map<string, number>();\n if (conflictCols.length > 0) {\n for (const docId of table.documentStore.docIds) {\n const doc = table.documentStore.get(docId);\n if (doc !== null) {\n const key = conflictCols.map((c) => JSON.stringify(doc[c])).join(\"\\0\");\n conflictIndex.set(key, docId);\n }\n }\n }\n\n // RETURNING handling\n const returningList = asList(nodeGet(stmt, \"returningList\"));\n const hasReturning = returningList.length > 0;\n const returningRows: Record<string, unknown>[] = [];\n\n // Insert rows with ON CONFLICT and RETURNING support\n let inserted = 0;\n for (const srcRow of sourceRows) {\n if (conflictCols.length > 0 && onConflictClause !== null) {\n const key = conflictCols.map((c) => JSON.stringify(srcRow[c])).join(\"\\0\");\n const existingId = conflictIndex.get(key);\n if (existingId !== undefined) {\n // ONCONFLICT_NOTHING = 1, ONCONFLICT_UPDATE = 2\n if (conflictAction === 1 || conflictAction === \"ONCONFLICT_NOTHING\") {\n continue;\n }\n // DO UPDATE SET ...\n this._doConflictUpdate(\n table,\n existingId,\n srcRow,\n conflictTargetList,\n evaluator,\n );\n // Update conflict index if keys changed\n const updatedDoc = table.documentStore.get(existingId);\n if (updatedDoc !== null) {\n const newKey = conflictCols\n .map((c) => JSON.stringify(updatedDoc[c]))\n .join(\"\\0\");\n if (newKey !== key) {\n conflictIndex.delete(key);\n conflictIndex.set(newKey, existingId);\n }\n }\n if (hasReturning && updatedDoc !== null) {\n returningRows.push(\n this._evaluateReturning(returningList, updatedDoc, evaluator, table),\n );\n }\n inserted++;\n continue;\n }\n }\n\n const [docId] = table.insert(srcRow);\n inserted++;\n\n // Update conflict index for subsequent rows in the batch\n if (conflictCols.length > 0) {\n const newKey = conflictCols.map((c) => JSON.stringify(srcRow[c])).join(\"\\0\");\n conflictIndex.set(newKey, docId);\n }\n\n if (hasReturning) {\n const doc = table.documentStore.get(docId);\n if (doc !== null) {\n returningRows.push(\n this._evaluateReturning(returningList, doc, evaluator, table),\n );\n }\n }\n }\n\n if (hasReturning) {\n const columns = this._extractReturningColumns(returningList, table);\n return { columns, rows: returningRows };\n }\n\n return {\n columns: [\"inserted\"],\n rows: [{ inserted }],\n };\n }\n\n private _doConflictUpdate(\n table: Table,\n docId: number,\n excludedRow: Record<string, unknown>,\n targetList: Record<string, unknown>[],\n evaluator: ExprEvaluator,\n ): void {\n const oldDoc = table.documentStore.get(docId);\n if (oldDoc === null) return;\n const newDoc = { ...oldDoc };\n\n // Merge excluded.* into the row for expression evaluation\n const evalRow: Record<string, unknown> = { ...oldDoc };\n for (const [k, v] of Object.entries(excludedRow)) {\n evalRow[`excluded.${k}`] = v;\n }\n\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const colName = nodeStr(resTarget, \"name\");\n const valNode = nodeGet(resTarget, \"val\");\n if (valNode !== null && valNode !== undefined) {\n const newValue = evaluator.evaluate(asObj(valNode), evalRow);\n if (newValue !== null && newValue !== undefined) {\n newDoc[colName] = newValue;\n } else {\n \n Reflect.deleteProperty(newDoc, colName);\n }\n }\n }\n\n // Update document\n table.invertedIndex.removeDocument(docId);\n table.documentStore.put(docId, newDoc);\n\n // Re-index text fields\n const textFields: Record<string, string> = {};\n for (const [k, v] of Object.entries(newDoc)) {\n if (typeof v === \"string\") {\n textFields[k] = v;\n }\n }\n if (Object.keys(textFields).length > 0) {\n table.invertedIndex.addDocument(docId, textFields);\n }\n }\n\n // ==================================================================\n // DML: UPDATE\n // ==================================================================\n\n private _compileUpdate(\n stmt: Record<string, unknown>,\n params: unknown[],\n ): SQLResult | null {\n const relation = asObj(nodeGet(stmt, \"relation\"));\n const tableName = extractRelName(relation);\n const table = this._tables.get(tableName);\n if (!table) {\n throw new Error(`Table \"${tableName}\" does not exist`);\n }\n\n const fromClause = asList(nodeGet(stmt, \"fromClause\"));\n\n // Multi-table UPDATE: UPDATE t1 SET ... FROM t2 WHERE ...\n if (fromClause.length > 0) {\n return this._compileUpdateFrom(stmt, table, params);\n }\n\n const whereClause = nodeGet(stmt, \"whereClause\");\n const targetList = asList(nodeGet(stmt, \"targetList\"));\n const returningList = asList(nodeGet(stmt, \"returningList\"));\n const hasReturning = returningList.length > 0;\n const returningRows: Record<string, unknown>[] = [];\n\n const evaluator = new ExprEvaluator({\n params,\n sequences: this._sequences,\n outerRow: this._correlatedOuterRow ?? undefined,\n subqueryExecutor: this._makeSubqueryExecutor(params),\n });\n\n // Parse SET clause\n const setTargets: [string, Record<string, unknown>][] = [];\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const colName = nodeStr(resTarget, \"name\");\n if (!table.columns.has(colName)) {\n throw new Error(`Unknown column \"${colName}\" for table \"${tableName}\"`);\n }\n setTargets.push([colName, asObj(nodeGet(resTarget, \"val\"))]);\n }\n\n // Find matching rows\n let updateCount = 0;\n for (const [docId, doc] of table.documentStore.iterAll()) {\n // Evaluate WHERE clause\n if (whereClause !== null && whereClause !== undefined) {\n const condition = evaluator.evaluate(asObj(whereClause), doc);\n if (condition !== true) continue;\n }\n\n // Apply SET assignments\n const updatedDoc = { ...doc };\n for (const [colName, valNode] of setTargets) {\n const newValue = evaluator.evaluate(valNode, doc);\n const colDef = table.columns.get(colName);\n if (newValue !== null && newValue !== undefined) {\n updatedDoc[colName] = newValue;\n } else if (colDef && colDef.notNull) {\n throw new Error(\n `NOT NULL constraint violated: column \"${colName}\" in table \"${tableName}\"`,\n );\n } else {\n \n Reflect.deleteProperty(updatedDoc, colName);\n }\n }\n\n // FK update validation\n for (const fkValidator of table.fkUpdateValidators) {\n fkValidator(doc, updatedDoc);\n }\n\n // Update indexes and document\n table.invertedIndex.removeDocument(docId);\n table.documentStore.put(docId, updatedDoc);\n\n // Re-index text fields\n const textFields: Record<string, string> = {};\n for (const [k, v] of Object.entries(updatedDoc)) {\n if (typeof v === \"string\") textFields[k] = v;\n }\n if (Object.keys(textFields).length > 0) {\n table.invertedIndex.addDocument(docId, textFields);\n }\n\n if (hasReturning) {\n returningRows.push(\n this._evaluateReturning(returningList, updatedDoc, evaluator, table),\n );\n }\n updateCount++;\n }\n\n if (hasReturning) {\n const columns = this._extractReturningColumns(returningList, table);\n return { columns, rows: returningRows };\n }\n\n return {\n columns: [\"updated\"],\n rows: [{ updated: updateCount }],\n };\n }\n\n private _compileUpdateFrom(\n stmt: Record<string, unknown>,\n table: Table,\n params: unknown[],\n ): SQLResult | null {\n const tableName = table.name;\n const relation = asObj(nodeGet(stmt, \"relation\"));\n const tableAlias = extractAlias(relation) ?? tableName;\n\n const fromClause = asList(nodeGet(stmt, \"fromClause\"));\n const whereClause = nodeGet(stmt, \"whereClause\");\n const targetList = asList(nodeGet(stmt, \"targetList\"));\n const returningList = asList(nodeGet(stmt, \"returningList\"));\n const hasReturning = returningList.length > 0;\n const returningRows: Record<string, unknown>[] = [];\n\n const evaluator = new ExprEvaluator({\n params,\n sequences: this._sequences,\n outerRow: this._correlatedOuterRow ?? undefined,\n subqueryExecutor: this._makeSubqueryExecutor(params),\n });\n\n // Parse SET clause\n const setTargets: [string, Record<string, unknown>][] = [];\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const colName = nodeStr(resTarget, \"name\");\n if (!table.columns.has(colName)) {\n throw new Error(`Unknown column \"${colName}\" for table \"${tableName}\"`);\n }\n setTargets.push([colName, asObj(nodeGet(resTarget, \"val\"))]);\n }\n\n // Resolve FROM tables\n const fromRows = this._resolveFrom(fromClause, params);\n\n let updated = 0;\n for (const [docId, doc] of table.documentStore.iterAll()) {\n const targetRow: Record<string, unknown> = { ...doc };\n for (const [k, v] of Object.entries(doc)) {\n targetRow[`${tableAlias}.${k}`] = v;\n }\n\n for (const fromRow of fromRows) {\n const merged = { ...targetRow, ...fromRow };\n\n if (\n whereClause !== null &&\n whereClause !== undefined &&\n !evaluator.evaluate(asObj(whereClause), merged)\n ) {\n continue;\n }\n\n // Apply SET expressions\n const newDoc = { ...doc };\n for (const [colName, valNode] of setTargets) {\n const newValue = evaluator.evaluate(valNode, merged);\n const colDef = table.columns.get(colName);\n if (newValue !== null && newValue !== undefined) {\n newDoc[colName] = newValue;\n } else if (colDef && colDef.notNull) {\n throw new Error(\n `NOT NULL constraint violated: column \"${colName}\" in table \"${tableName}\"`,\n );\n } else {\n Reflect.deleteProperty(newDoc, colName);\n }\n }\n\n table.invertedIndex.removeDocument(docId);\n table.documentStore.put(docId, newDoc);\n\n const textFields: Record<string, string> = {};\n for (const [k, v] of Object.entries(newDoc)) {\n if (typeof v === \"string\") textFields[k] = v;\n }\n if (Object.keys(textFields).length > 0) {\n table.invertedIndex.addDocument(docId, textFields);\n }\n\n if (hasReturning) {\n returningRows.push(\n this._evaluateReturning(returningList, newDoc, evaluator, table),\n );\n }\n updated++;\n break; // Only update once per target row\n }\n }\n\n if (hasReturning) {\n const columns = this._extractReturningColumns(returningList, table);\n return { columns, rows: returningRows };\n }\n\n return { columns: [\"updated\"], rows: [{ updated }] };\n }\n\n // ==================================================================\n // DML: DELETE\n // ==================================================================\n\n private _compileDelete(\n stmt: Record<string, unknown>,\n params: unknown[],\n ): SQLResult | null {\n const relation = asObj(nodeGet(stmt, \"relation\"));\n const tableName = extractRelName(relation);\n const table = this._tables.get(tableName);\n if (!table) {\n throw new Error(`Table \"${tableName}\" does not exist`);\n }\n\n const usingClause = asList(nodeGet(stmt, \"usingClause\"));\n\n // Multi-table DELETE: DELETE FROM t1 USING t2 WHERE ...\n if (usingClause.length > 0) {\n return this._compileDeleteUsing(stmt, table, params);\n }\n\n const whereClause = nodeGet(stmt, \"whereClause\");\n const returningList = asList(nodeGet(stmt, \"returningList\"));\n const hasReturning = returningList.length > 0;\n const returningRows: Record<string, unknown>[] = [];\n\n const evaluator = new ExprEvaluator({\n params,\n outerRow: this._correlatedOuterRow ?? undefined,\n subqueryExecutor: this._makeSubqueryExecutor(params),\n });\n\n // Collect IDs to delete\n const toDelete: number[] = [];\n for (const [docId, doc] of table.documentStore.iterAll()) {\n if (whereClause !== null && whereClause !== undefined) {\n const condition = evaluator.evaluate(asObj(whereClause), doc);\n if (condition !== true) continue;\n }\n\n if (hasReturning) {\n returningRows.push(\n this._evaluateReturning(returningList, doc, evaluator, table),\n );\n }\n\n toDelete.push(docId);\n }\n\n // FK delete validation: check if any row to be deleted is referenced\n for (const docId of toDelete) {\n for (const fkValidator of table.fkDeleteValidators) {\n fkValidator(docId);\n }\n }\n\n for (const docId of toDelete) {\n table.invertedIndex.removeDocument(docId);\n table.documentStore.delete(docId);\n }\n\n if (hasReturning) {\n const columns = this._extractReturningColumns(returningList, table);\n return { columns, rows: returningRows };\n }\n\n return {\n columns: [\"deleted\"],\n rows: [{ deleted: toDelete.length }],\n };\n }\n\n private _compileDeleteUsing(\n stmt: Record<string, unknown>,\n table: Table,\n params: unknown[],\n ): SQLResult | null {\n const tableName = table.name;\n const relation = asObj(nodeGet(stmt, \"relation\"));\n const tableAlias = extractAlias(relation) ?? tableName;\n const usingClause = asList(nodeGet(stmt, \"usingClause\"));\n const whereClause = nodeGet(stmt, \"whereClause\");\n const returningList = asList(nodeGet(stmt, \"returningList\"));\n const hasReturning = returningList.length > 0;\n const returningRows: Record<string, unknown>[] = [];\n\n const evaluator = new ExprEvaluator({\n params,\n outerRow: this._correlatedOuterRow ?? undefined,\n subqueryExecutor: this._makeSubqueryExecutor(params),\n });\n\n // Resolve USING tables\n const usingRows = this._resolveFrom(usingClause, params);\n\n const toDelete: number[] = [];\n for (const [docId, doc] of table.documentStore.iterAll()) {\n const targetRow: Record<string, unknown> = { ...doc };\n for (const [k, v] of Object.entries(doc)) {\n targetRow[`${tableAlias}.${k}`] = v;\n }\n\n for (const usingRow of usingRows) {\n const merged = { ...targetRow, ...usingRow };\n\n if (\n whereClause !== null &&\n whereClause !== undefined &&\n !evaluator.evaluate(asObj(whereClause), merged)\n ) {\n continue;\n }\n\n if (hasReturning) {\n returningRows.push(\n this._evaluateReturning(returningList, doc, evaluator, table),\n );\n }\n toDelete.push(docId);\n break; // Only delete once per row\n }\n }\n\n for (const docId of toDelete) {\n table.invertedIndex.removeDocument(docId);\n table.documentStore.delete(docId);\n }\n\n if (hasReturning) {\n const columns = this._extractReturningColumns(returningList, table);\n return { columns, rows: returningRows };\n }\n\n return { columns: [\"deleted\"], rows: [{ deleted: toDelete.length }] };\n }\n\n // ==================================================================\n // Transaction: BEGIN / COMMIT / ROLLBACK / SAVEPOINT\n // ==================================================================\n\n private _compileTransaction(stmt: Record<string, unknown>): SQLResult | null {\n // In-memory engine: transactions are largely a no-op.\n const kind = nodeGet(stmt, \"kind\") as number | string;\n // 0 = BEGIN, 2 = COMMIT, 3 = ROLLBACK\n // 4 = SAVEPOINT, 5 = RELEASE SAVEPOINT, 6 = ROLLBACK TO SAVEPOINT\n void kind;\n void stmt;\n this._transactionActive = !this._transactionActive;\n return null;\n }\n\n // ==================================================================\n // Prepared Statements: PREPARE / EXECUTE / DEALLOCATE\n // ==================================================================\n\n private _compilePrepare(stmt: Record<string, unknown>): SQLResult | null {\n const name = nodeStr(stmt, \"name\");\n if (this._prepared.has(name)) {\n throw new Error(`Prepared statement \"${name}\" already exists`);\n }\n const query = asObj(nodeGet(stmt, \"query\"));\n this._prepared.set(name, query);\n return null;\n }\n\n private _compileExecute(\n stmt: Record<string, unknown>,\n params: unknown[],\n ): SQLResult | null {\n const name = nodeStr(stmt, \"name\");\n const prep = this._prepared.get(name);\n if (prep === undefined) {\n throw new Error(`Prepared statement \"${name}\" does not exist`);\n }\n\n // Collect parameter values from EXECUTE\n const execParams = asList(nodeGet(stmt, \"params\"));\n const evaluator = new ExprEvaluator({ params });\n const resolvedParams: unknown[] = [];\n for (const p of execParams) {\n resolvedParams.push(evaluator.evaluate(p, {}));\n }\n\n // Temporarily set instance-level params so WHERE clause compilation\n // (which uses this._params) can resolve $N placeholders.\n const savedParams = this._params;\n this._params = resolvedParams;\n try {\n return this._dispatchStatement(prep, resolvedParams);\n } finally {\n this._params = savedParams;\n }\n }\n\n private _compileDeallocate(stmt: Record<string, unknown>): SQLResult | null {\n const name = nodeStr(stmt, \"name\");\n if (!name) {\n // DEALLOCATE ALL\n this._prepared.clear();\n } else {\n if (!this._prepared.has(name)) {\n throw new Error(`Prepared statement \"${name}\" does not exist`);\n }\n this._prepared.delete(name);\n }\n return null;\n }\n\n // ==================================================================\n // EXPLAIN / ANALYZE\n // ==================================================================\n\n private _compileExplain(stmt: Record<string, unknown>, params: unknown[]): SQLResult {\n const query = asObj(nodeGet(stmt, \"query\"));\n const selectStmt = asObj(nodeGet(query, \"SelectStmt\") ?? query);\n\n // Execute the inner query to provide basic info\n const fromClause = asList(nodeGet(selectStmt, \"fromClause\"));\n let tableInfo = `${String(this._tables.size)} tables`;\n if (fromClause.length > 0) {\n const firstFrom = fromClause[0]!;\n const rv = asObj(nodeGet(firstFrom, \"RangeVar\") ?? firstFrom);\n const tname = extractRelName(rv);\n if (tname) {\n const t = this._tables.get(tname);\n if (t) {\n tableInfo = `table \"${tname}\" (${String(t.rowCount)} rows)`;\n }\n }\n }\n\n void params;\n\n const plan = `Seq Scan on ${tableInfo}`;\n return {\n columns: [\"QUERY PLAN\"],\n rows: [{ \"QUERY PLAN\": plan }],\n };\n }\n\n private _compileAnalyze(stmt: Record<string, unknown>): SQLResult | null {\n // ANALYZE collects column statistics (histogram, MCV) for the query optimizer.\n const rels = stmt[\"rels\"] as unknown[] | undefined;\n if (rels && rels.length > 0) {\n for (const rel of rels) {\n const relObj = rel as Record<string, unknown>;\n // libpg-query wraps each rel in VacuumRelation\n const vacuumRel = (relObj[\"VacuumRelation\"] ?? relObj) as Record<\n string,\n unknown\n >;\n const relation = vacuumRel[\"relation\"] as Record<string, unknown> | undefined;\n const relname = relation ? (relation[\"relname\"] as string | null) : null;\n if (relname && this._tables.has(relname)) {\n this._tables.get(relname)!.analyze();\n }\n }\n } else {\n // ANALYZE without table name -> analyze all tables\n for (const table of this._tables.values()) {\n table.analyze();\n }\n }\n return null;\n }\n\n // ==================================================================\n // DQL: SELECT\n // ==================================================================\n\n private _compileSelect(\n stmt: Record<string, unknown>,\n params: unknown[],\n outerRow?: Record<string, unknown>,\n ): SQLResult {\n // 0. Materialize CTEs as temporary in-memory tables\n const withClause = nodeGet(stmt, \"withClause\");\n let cteNames: string[] = [];\n if (withClause !== null && withClause !== undefined) {\n const wc = asObj(withClause);\n const ctes = asList(nodeGet(wc, \"ctes\"));\n const recursive = nodeGet(wc, \"recursive\") === true;\n cteNames = this._materializeCTEs(ctes, params, recursive, stmt);\n }\n\n // Save and set correlated outer row context\n const prevOuterRow = this._correlatedOuterRow;\n this._correlatedOuterRow = outerRow ?? null;\n\n const prevInlined = new Map(this._inlinedCTEs);\n\n try {\n return this._compileSelectBody(stmt, params);\n } finally {\n this._correlatedOuterRow = prevOuterRow;\n\n // Clean up inlined CTEs\n for (const name of cteNames) {\n this._inlinedCTEs.delete(name);\n }\n this._inlinedCTEs = prevInlined;\n\n // Clean up CTE temporary tables\n for (const name of cteNames) {\n this._tables.delete(name);\n }\n\n // Clean up materialized view / derived tables\n for (const name of this._expandedViews) {\n if (this._shadowedTables.has(name)) {\n this._tables.set(name, this._shadowedTables.get(name)!);\n this._shadowedTables.delete(name);\n } else {\n this._tables.delete(name);\n }\n }\n this._expandedViews = [];\n }\n }\n\n private _compileSelectBody(\n stmt: Record<string, unknown>,\n params: unknown[],\n ): SQLResult {\n // Handle standalone VALUES\n const valuesLists = asList(nodeGet(stmt, \"valuesLists\"));\n if (valuesLists.length > 0) {\n return this._compileValues(valuesLists, params);\n }\n\n // Handle set operations (UNION / INTERSECT / EXCEPT)\n const op = nodeGet(stmt, \"op\");\n if (op !== null && op !== undefined && op !== 0 && op !== \"SETOP_NONE\") {\n return this._compileSetOp(stmt, params);\n }\n\n // Predicate pushdown: push safe WHERE predicates into views/derived tables\n stmt = this._tryPredicatePushdown(stmt, params);\n\n // Standard SELECT\n const fromClause = asList(nodeGet(stmt, \"fromClause\"));\n const whereClause = nodeGet(stmt, \"whereClause\");\n const targetList = asList(nodeGet(stmt, \"targetList\"));\n const groupClause = asList(nodeGet(stmt, \"groupClause\"));\n const havingClause = nodeGet(stmt, \"havingClause\");\n const sortClause = asList(nodeGet(stmt, \"sortClause\"));\n const limitCount = nodeGet(stmt, \"limitCount\");\n const limitOffset = nodeGet(stmt, \"limitOffset\");\n const distinctClause = nodeGet(stmt, \"distinctClause\");\n const windowClause = asList(nodeGet(stmt, \"windowClause\"));\n\n const evaluator = new ExprEvaluator({\n params,\n sequences: this._sequences,\n outerRow: this._correlatedOuterRow ?? undefined,\n subqueryExecutor: this._makeSubqueryExecutor(params),\n });\n\n // 1. FROM clause -- get source rows\n let rows: Record<string, unknown>[];\n if (fromClause.length === 0) {\n // SELECT without FROM (e.g. SELECT 1+1)\n rows = [{}];\n } else {\n rows = this._resolveFrom(fromClause, params);\n }\n\n // 2. WHERE clause -- filter rows\n if (whereClause !== null && whereClause !== undefined) {\n rows = rows.filter((row) => {\n const result = evaluator.evaluate(asObj(whereClause), row);\n return result === true;\n });\n }\n\n // 3. GROUP BY clause\n const hasAggregates = this._hasAggregates(targetList);\n if (groupClause.length > 0) {\n rows = this._applyGroupBy(rows, groupClause, targetList, havingClause, evaluator);\n } else if (hasAggregates) {\n // Aggregate without GROUP BY -- treat entire result as one group\n rows = this._applyGroupBy(rows, [], targetList, havingClause, evaluator);\n }\n\n // 4. Window functions\n const hasWindow = this._hasWindowFunctions(targetList);\n if (hasWindow) {\n rows = this._applyWindowFunctions(rows, targetList, windowClause, evaluator);\n }\n\n // 5. SELECT list -- project columns\n let columns: string[];\n let projectedRows: Record<string, unknown>[];\n if (groupClause.length > 0 || hasAggregates || hasWindow) {\n // Rows are already projected by group/window logic\n columns = this._resolveSelectColumnNames(targetList, rows);\n projectedRows = rows;\n } else {\n [columns, projectedRows] = this._projectColumns(targetList, rows, evaluator);\n }\n\n // 6. DISTINCT\n let resultRows = projectedRows;\n if (distinctClause !== null && distinctClause !== undefined) {\n resultRows = this._applyDistinct(resultRows, columns);\n }\n\n // 7. ORDER BY\n if (sortClause.length > 0) {\n resultRows = this._applyOrderBy(resultRows, sortClause, evaluator, targetList);\n }\n\n // 8. LIMIT and OFFSET\n if (limitOffset !== null && limitOffset !== undefined) {\n const offset = Number(evaluator.evaluate(asObj(limitOffset), {}));\n resultRows = resultRows.slice(offset);\n }\n if (limitCount !== null && limitCount !== undefined) {\n const limit = Number(evaluator.evaluate(asObj(limitCount), {}));\n resultRows = resultRows.slice(0, limit);\n }\n\n return { columns, rows: resultRows };\n }\n\n // -- CTE materialization ------------------------------------------------\n\n private _materializeCTEs(\n ctes: Record<string, unknown>[],\n params: unknown[],\n recursive: boolean,\n mainQuery: Record<string, unknown>,\n ): string[] {\n const cteNames: string[] = [];\n\n for (const cte of ctes) {\n const cteObj = asObj(nodeGet(cte, \"CommonTableExpr\") ?? cte);\n const name = nodeStr(cteObj, \"ctename\");\n const cteQuery = asObj(nodeGet(cteObj, \"ctequery\"));\n const selectStmt = asObj(nodeGet(cteQuery, \"SelectStmt\") ?? cteQuery);\n\n const cteOp = nodeGet(selectStmt, \"op\");\n const isRecursive =\n recursive &&\n cteOp !== null &&\n cteOp !== undefined &&\n cteOp !== 0 &&\n cteOp !== \"SETOP_NONE\";\n\n if (isRecursive) {\n this._materializeRecursiveCTE(cteObj, selectStmt, params);\n } else {\n // Count references in main query to determine inline vs materialize\n const refCount = this._countCTERefs(name, mainQuery);\n if (refCount === 1) {\n // Inline single-reference CTEs\n this._inlinedCTEs.set(name, selectStmt);\n } else {\n const result = this._compileSelect(selectStmt, params);\n const table = this._resultToTable(name, result);\n this._tables.set(name, table);\n }\n }\n cteNames.push(name);\n }\n\n return cteNames;\n }\n\n private _materializeRecursiveCTE(\n cteObj: Record<string, unknown>,\n selectStmt: Record<string, unknown>,\n params: unknown[],\n ): void {\n const name = nodeStr(cteObj, \"ctename\");\n const isUnionAll = nodeGet(selectStmt, \"all\") === true;\n\n // Column name mapping from alias\n const aliasColNamesRaw = asList(nodeGet(cteObj, \"aliascolnames\"));\n const aliasCols =\n aliasColNamesRaw.length > 0\n ? aliasColNamesRaw.map((n) => extractString(n))\n : null;\n\n // 1. Execute base case (larg)\n const larg = asObj(nodeGet(selectStmt, \"larg\"));\n const lSelectStmt = asObj(nodeGet(larg, \"SelectStmt\") ?? larg);\n const baseResult = this._compileSelect(lSelectStmt, params);\n const baseColumns = baseResult.columns;\n\n // Remap columns if alias names are provided\n let columns: string[];\n let allRows: Record<string, unknown>[];\n if (aliasCols !== null) {\n allRows = [];\n for (const row of baseResult.rows) {\n const remapped: Record<string, unknown> = {};\n for (let i = 0; i < aliasCols.length; i++) {\n if (i < baseColumns.length) {\n remapped[aliasCols[i]!] = row[baseColumns[i]!] ?? null;\n }\n }\n allRows.push(remapped);\n }\n columns = aliasCols;\n } else {\n allRows = [...baseResult.rows];\n columns = baseColumns;\n }\n\n // Track seen tuples for UNION deduplication\n let seen: Set<string> | null = null;\n if (!isUnionAll) {\n seen = new Set<string>();\n const deduped: Record<string, unknown>[] = [];\n for (const row of allRows) {\n const key = columns.map((c) => JSON.stringify(row[c])).join(\"\\0\");\n if (!seen.has(key)) {\n seen.add(key);\n deduped.push(row);\n }\n }\n allRows = deduped;\n }\n\n // Register working table\n let workingRows = [...allRows];\n\n for (let depth = 0; depth < MAX_RECURSIVE_DEPTH; depth++) {\n // Build temporary table from working rows\n const result: SQLResult = { columns, rows: workingRows };\n const table = this._resultToTable(name, result);\n this._tables.set(name, table);\n\n // Execute recursive case (rarg)\n const rarg = asObj(nodeGet(selectStmt, \"rarg\"));\n const rSelectStmt = asObj(nodeGet(rarg, \"SelectStmt\") ?? rarg);\n const recResult = this._compileSelect(rSelectStmt, params);\n\n // Remap recursive result columns\n const targetCols = aliasCols ?? columns;\n const newRows: Record<string, unknown>[] = [];\n for (const row of recResult.rows) {\n const remapped: Record<string, unknown> = {};\n for (let i = 0; i < targetCols.length; i++) {\n if (i < recResult.columns.length) {\n remapped[targetCols[i]!] = row[recResult.columns[i]!] ?? null;\n }\n }\n newRows.push(remapped);\n }\n\n if (newRows.length === 0) break;\n\n // Deduplicate for UNION (not ALL)\n let filteredRows = newRows;\n if (seen !== null) {\n filteredRows = [];\n for (const row of newRows) {\n const key = columns.map((c) => JSON.stringify(row[c])).join(\"\\0\");\n if (!seen.has(key)) {\n seen.add(key);\n filteredRows.push(row);\n }\n }\n if (filteredRows.length === 0) break;\n }\n\n allRows.push(...filteredRows);\n workingRows = filteredRows;\n }\n\n // Final table with all accumulated rows\n const finalResult: SQLResult = { columns, rows: allRows };\n const finalTable = this._resultToTable(name, finalResult);\n this._tables.set(name, finalTable);\n }\n\n private _countCTERefs(name: string, node: unknown): number {\n if (node === null || node === undefined) return 0;\n if (typeof node !== \"object\") return 0;\n\n if (Array.isArray(node)) {\n let count = 0;\n for (const item of node) {\n count += this._countCTERefs(name, item);\n }\n return count;\n }\n\n const obj = node as Record<string, unknown>;\n // Check RangeVar\n const rv = nodeGet(obj, \"RangeVar\");\n if (rv !== null && rv !== undefined) {\n const relname = nodeStr(asObj(rv), \"relname\");\n if (relname === name) return 1;\n }\n // Check direct relname\n if (nodeStr(obj, \"relname\") === name) return 1;\n\n let count = 0;\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"withClause\") continue; // Don't count refs in CTE definitions\n if (value !== null && typeof value === \"object\") {\n count += this._countCTERefs(name, value);\n }\n }\n return count;\n }\n\n private _resultToTable(name: string, result: SQLResult): Table {\n const columns: ColumnDef[] = [];\n for (const colName of result.columns) {\n let typeName = \"text\";\n let jsType = \"string\";\n for (const row of result.rows) {\n const sample = row[colName];\n if (sample !== null && sample !== undefined) {\n if (typeof sample === \"boolean\") {\n typeName = \"text\";\n jsType = \"string\";\n } else if (typeof sample === \"number\") {\n if (Number.isInteger(sample)) {\n typeName = \"integer\";\n jsType = \"number\";\n } else {\n typeName = \"real\";\n jsType = \"number\";\n }\n }\n break;\n }\n }\n columns.push(createColumnDef(colName, typeName, { pythonType: jsType }));\n }\n\n const table = new Table(name, columns);\n for (let i = 0; i < result.rows.length; i++) {\n const docId = i + 1;\n const doc: Record<string, unknown> = { _id: docId };\n Object.assign(doc, result.rows[i]);\n table.documentStore.put(docId, doc);\n }\n return table;\n }\n\n // -- Set operations (UNION / INTERSECT / EXCEPT) --------------------\n\n private _compileSetOp(stmt: Record<string, unknown>, params: unknown[]): SQLResult {\n const op = nodeGet(stmt, \"op\");\n const larg = asObj(nodeGet(stmt, \"larg\"));\n const rarg = asObj(nodeGet(stmt, \"rarg\"));\n const all = nodeGet(stmt, \"all\") === true;\n\n const leftStmt = asObj(nodeGet(larg, \"SelectStmt\") ?? larg);\n const rightStmt = asObj(nodeGet(rarg, \"SelectStmt\") ?? rarg);\n\n const leftResult = this._compileSelect(leftStmt, params);\n const rightResult = this._compileSelect(rightStmt, params);\n\n if (leftResult.columns.length !== rightResult.columns.length) {\n throw new Error(\n `Set operation column count mismatch: ` +\n `${String(leftResult.columns.length)} vs ${String(rightResult.columns.length)}`,\n );\n }\n\n const columns = leftResult.columns;\n\n // Normalize right result columns to match left column names\n const rightRows = rightResult.rows.map((row) => {\n const normalized: Record<string, unknown> = {};\n for (let i = 0; i < columns.length; i++) {\n normalized[columns[i]!] = row[rightResult.columns[i]!] ?? null;\n }\n return normalized;\n });\n\n let rows: Record<string, unknown>[];\n\n // SETOP_UNION = 1, SETOP_INTERSECT = 2, SETOP_EXCEPT = 3\n if (op === 1 || op === \"SETOP_UNION\") {\n rows = this._setUnion(leftResult.rows, rightRows, columns, all);\n } else if (op === 2 || op === \"SETOP_INTERSECT\") {\n rows = this._setIntersect(leftResult.rows, rightRows, columns, all);\n } else if (op === 3 || op === \"SETOP_EXCEPT\") {\n rows = this._setExcept(leftResult.rows, rightRows, columns, all);\n } else {\n throw new Error(`Unsupported set operation: ${String(op)}`);\n }\n\n // Apply ORDER BY / LIMIT on the combined result\n const sortClause = asList(nodeGet(stmt, \"sortClause\"));\n if (sortClause.length > 0) {\n const evaluator = new ExprEvaluator({ params });\n const leftTargets = asList(nodeGet(leftStmt, \"targetList\"));\n rows = this._applyOrderBy(rows, sortClause, evaluator, leftTargets);\n }\n\n const limitCount = nodeGet(stmt, \"limitCount\");\n const limitOffset = nodeGet(stmt, \"limitOffset\");\n if (limitOffset !== null && limitOffset !== undefined) {\n const evaluator = new ExprEvaluator({ params });\n const offset = Number(evaluator.evaluate(asObj(limitOffset), {}));\n rows = rows.slice(offset);\n }\n if (limitCount !== null && limitCount !== undefined) {\n const evaluator = new ExprEvaluator({ params });\n const limit = Number(evaluator.evaluate(asObj(limitCount), {}));\n rows = rows.slice(0, limit);\n }\n\n return { columns, rows };\n }\n\n private _setUnion(\n leftRows: Record<string, unknown>[],\n rightRows: Record<string, unknown>[],\n columns: string[],\n isAll: boolean,\n ): Record<string, unknown>[] {\n if (isAll) {\n return [...leftRows, ...rightRows];\n }\n const seen = new Set<string>();\n const rows: Record<string, unknown>[] = [];\n for (const row of [...leftRows, ...rightRows]) {\n const key = columns.map((c) => JSON.stringify(row[c])).join(\"\\0\");\n if (!seen.has(key)) {\n seen.add(key);\n rows.push(row);\n }\n }\n return rows;\n }\n\n private _setIntersect(\n leftRows: Record<string, unknown>[],\n rightRows: Record<string, unknown>[],\n columns: string[],\n isAll: boolean,\n ): Record<string, unknown>[] {\n if (isAll) {\n const rightCounter = new Map<string, number>();\n for (const r of rightRows) {\n const key = columns.map((c) => JSON.stringify(r[c])).join(\"\\0\");\n rightCounter.set(key, (rightCounter.get(key) ?? 0) + 1);\n }\n const rows: Record<string, unknown>[] = [];\n for (const row of leftRows) {\n const key = columns.map((c) => JSON.stringify(row[c])).join(\"\\0\");\n const count = rightCounter.get(key) ?? 0;\n if (count > 0) {\n rows.push(row);\n rightCounter.set(key, count - 1);\n }\n }\n return rows;\n }\n\n const rightKeys = new Set(\n rightRows.map((r) => columns.map((c) => JSON.stringify(r[c])).join(\"\\0\")),\n );\n const seen = new Set<string>();\n const rows: Record<string, unknown>[] = [];\n for (const row of leftRows) {\n const key = columns.map((c) => JSON.stringify(row[c])).join(\"\\0\");\n if (rightKeys.has(key) && !seen.has(key)) {\n seen.add(key);\n rows.push(row);\n }\n }\n return rows;\n }\n\n private _setExcept(\n leftRows: Record<string, unknown>[],\n rightRows: Record<string, unknown>[],\n columns: string[],\n isAll: boolean,\n ): Record<string, unknown>[] {\n if (isAll) {\n const rightCounter = new Map<string, number>();\n for (const r of rightRows) {\n const key = columns.map((c) => JSON.stringify(r[c])).join(\"\\0\");\n rightCounter.set(key, (rightCounter.get(key) ?? 0) + 1);\n }\n const rows: Record<string, unknown>[] = [];\n for (const row of leftRows) {\n const key = columns.map((c) => JSON.stringify(row[c])).join(\"\\0\");\n const count = rightCounter.get(key) ?? 0;\n if (count > 0) {\n rightCounter.set(key, count - 1);\n } else {\n rows.push(row);\n }\n }\n return rows;\n }\n\n const rightKeys = new Set(\n rightRows.map((r) => columns.map((c) => JSON.stringify(r[c])).join(\"\\0\")),\n );\n const seen = new Set<string>();\n const rows: Record<string, unknown>[] = [];\n for (const row of leftRows) {\n const key = columns.map((c) => JSON.stringify(row[c])).join(\"\\0\");\n if (!rightKeys.has(key) && !seen.has(key)) {\n seen.add(key);\n rows.push(row);\n }\n }\n return rows;\n }\n\n // -- VALUES clause --------------------------------------------------\n\n private _compileValues(\n valuesLists: Record<string, unknown>[],\n params: unknown[],\n ): SQLResult {\n const evaluator = new ExprEvaluator({ params });\n const rows: Record<string, unknown>[] = [];\n let numCols = 0;\n\n for (const valueList of valuesLists) {\n const listNode = asObj(nodeGet(valueList, \"List\"));\n const items = asList(nodeGet(listNode, \"items\") ?? valueList);\n numCols = Math.max(numCols, items.length);\n const row: Record<string, unknown> = {};\n for (let i = 0; i < items.length; i++) {\n const colName = `column${String(i + 1)}`;\n row[colName] = evaluator.evaluate(items[i]!, {});\n }\n rows.push(row);\n }\n\n const columns: string[] = [];\n for (let i = 0; i < numCols; i++) {\n columns.push(`column${String(i + 1)}`);\n }\n\n return { columns, rows };\n }\n\n // -- FROM clause resolution -----------------------------------------\n\n private _resolveFrom(\n fromClause: Record<string, unknown>[],\n params: unknown[],\n ): Record<string, unknown>[] {\n let result: Record<string, unknown>[] | null = null;\n\n for (const fromItem of fromClause) {\n // Check for LATERAL subquery\n const subselect = nodeGet(fromItem, \"RangeSubselect\");\n if (subselect !== null && subselect !== undefined) {\n const subNode = asObj(subselect);\n const isLateral = nodeGet(subNode, \"lateral\") === true;\n if (isLateral && result !== null) {\n result = this._resolveLateralJoin(result, subNode, params);\n continue;\n }\n }\n\n const itemRows = this._resolveFromItem(fromItem, params);\n\n if (result === null) {\n result = itemRows;\n } else {\n // Cross join\n result = this._crossJoin(result, itemRows);\n }\n }\n\n return result ?? [{}];\n }\n\n private _resolveFromItem(\n item: Record<string, unknown>,\n params: unknown[],\n ): Record<string, unknown>[] {\n // RangeVar -- simple table reference\n const rangeVar = nodeGet(item, \"RangeVar\");\n if (rangeVar !== null && rangeVar !== undefined) {\n const rvObj = asObj(rangeVar);\n const tableName = extractRelName(rvObj);\n const alias = extractAlias(rvObj);\n const schemaName = extractSchemaName(rvObj);\n\n // Virtual schema tables\n if (schemaName === \"information_schema\") {\n return this._buildInformationSchemaTable(tableName, alias ?? tableName);\n }\n if (schemaName === \"pg_catalog\") {\n return this._buildPgCatalogTable(tableName, alias ?? tableName);\n }\n\n // Check for view\n const viewDef = this._views.get(tableName);\n if (viewDef !== undefined) {\n const viewResult = this._compileSelect(viewDef, params);\n return this._applyAlias(viewResult.rows, alias ?? tableName);\n }\n\n // Check for inlined CTE\n const inlinedQuery = this._inlinedCTEs.get(tableName);\n if (inlinedQuery !== undefined) {\n this._inlinedCTEs.delete(tableName);\n const result = this._compileSelect(inlinedQuery, params);\n const table = this._resultToTable(tableName, result);\n this._tables.set(tableName, table);\n this._expandedViews.push(tableName);\n const rows: Record<string, unknown>[] = [];\n for (const [, doc] of table.documentStore.iterAll()) {\n rows.push({ ...doc });\n }\n return this._applyAlias(rows, alias ?? tableName);\n }\n\n const table = this._tables.get(tableName);\n if (!table) {\n throw new Error(`Table \"${tableName}\" does not exist`);\n }\n\n const rows: Record<string, unknown>[] = [];\n for (const [, doc] of table.documentStore.iterAll()) {\n rows.push({ ...doc });\n }\n\n return this._applyAlias(rows, alias ?? tableName);\n }\n\n // JoinExpr -- explicit join\n const joinExpr = nodeGet(item, \"JoinExpr\");\n if (joinExpr !== null && joinExpr !== undefined) {\n return this._resolveJoin(asObj(joinExpr), params);\n }\n\n // RangeSubselect -- subquery in FROM\n const subselect = nodeGet(item, \"RangeSubselect\");\n if (subselect !== null && subselect !== undefined) {\n const subNode = asObj(subselect);\n const subquery = asObj(nodeGet(subNode, \"subquery\"));\n const selectStmt = asObj(nodeGet(subquery, \"SelectStmt\") ?? subquery);\n const alias = extractAlias(subNode);\n const subResult = this._compileSelect(selectStmt, params);\n return this._applyAlias(subResult.rows, alias);\n }\n\n // RangeFunction -- function in FROM\n const rangeFunction = nodeGet(item, \"RangeFunction\");\n if (rangeFunction !== null && rangeFunction !== undefined) {\n return this._compileFromFunction(asObj(rangeFunction), params);\n }\n\n throw new Error(\"Unsupported FROM clause item\");\n }\n\n private _applyAlias(\n rows: Record<string, unknown>[],\n alias: string | null,\n ): Record<string, unknown>[] {\n if (alias === null) return rows;\n return rows.map((row) => {\n const aliased: Record<string, unknown> = { ...row };\n for (const [key, value] of Object.entries(row)) {\n if (!key.includes(\".\")) {\n aliased[`${alias}.${key}`] = value;\n }\n }\n return aliased;\n });\n }\n\n private _resolveLateralJoin(\n leftRows: Record<string, unknown>[],\n subNode: Record<string, unknown>,\n params: unknown[],\n ): Record<string, unknown>[] {\n const subquery = asObj(nodeGet(subNode, \"subquery\"));\n const selectStmt = asObj(nodeGet(subquery, \"SelectStmt\") ?? subquery);\n const alias = extractAlias(subNode) ?? \"_lateral\";\n\n const result: Record<string, unknown>[] = [];\n\n for (const leftRow of leftRows) {\n // Execute subquery with left row as outer row context\n const subResult = this._compileSelect(selectStmt, params, leftRow);\n\n for (const subRow of subResult.rows) {\n const rightFields: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(subRow)) {\n rightFields[k] = v;\n rightFields[`${alias}.${k}`] = v;\n }\n result.push({ ...leftRow, ...rightFields });\n }\n }\n\n return result;\n }\n\n // -- FROM-clause table functions ------------------------------------\n\n private _compileFromFunction(\n rangeFunc: Record<string, unknown>,\n params: unknown[],\n ): Record<string, unknown>[] {\n const functions = asList(nodeGet(rangeFunc, \"functions\"));\n if (functions.length === 0) {\n throw new Error(\"Empty RangeFunction\");\n }\n // functions[0] may be a List wrapper: { List: { items: [...] } }\n const firstFunc = functions[0]!;\n const listNode = nodeGet(firstFunc, \"List\");\n const firstFuncList =\n listNode !== null && listNode !== undefined\n ? asList(nodeGet(asObj(listNode), \"items\"))\n : asList(firstFunc);\n if (firstFuncList.length === 0) {\n throw new Error(\"Empty function list in RangeFunction\");\n }\n const funcCallNode = asObj(\n nodeGet(firstFuncList[0]!, \"FuncCall\") ?? firstFuncList[0]!,\n );\n const funcnameList = asList(nodeGet(funcCallNode, \"funcname\"));\n const funcName = extractString(\n funcnameList[funcnameList.length - 1]!,\n ).toLowerCase();\n const funcArgs = asList(nodeGet(funcCallNode, \"args\"));\n\n const alias = extractAlias(rangeFunc);\n\n // Determine column name from alias column names\n const aliasNode = asObj(nodeGet(rangeFunc, \"alias\"));\n const colnames = asList(nodeGet(aliasNode, \"colnames\"));\n const aliasColName = colnames.length > 0 ? extractString(colnames[0]!) : null;\n\n const evaluator = new ExprEvaluator({ params });\n\n if (funcName === \"generate_series\") {\n return this._buildGenerateSeries(\n funcArgs,\n evaluator,\n alias ?? \"generate_series\",\n aliasColName ?? \"generate_series\",\n );\n }\n\n if (funcName === \"unnest\") {\n return this._buildUnnest(\n funcArgs,\n evaluator,\n alias ?? \"unnest\",\n aliasColName ?? \"unnest\",\n );\n }\n\n if (\n funcName === \"json_each\" ||\n funcName === \"jsonb_each\" ||\n funcName === \"json_each_text\" ||\n funcName === \"jsonb_each_text\"\n ) {\n return this._buildJSONEach(\n funcArgs,\n evaluator,\n alias ?? funcName,\n funcName.endsWith(\"_text\"),\n );\n }\n\n if (\n funcName === \"json_array_elements\" ||\n funcName === \"jsonb_array_elements\" ||\n funcName === \"json_array_elements_text\" ||\n funcName === \"jsonb_array_elements_text\"\n ) {\n return this._buildJSONArrayElements(\n funcArgs,\n evaluator,\n alias ?? funcName,\n funcName.endsWith(\"_text\"),\n );\n }\n\n if (funcName === \"regexp_split_to_table\") {\n return this._buildRegexpSplitToTable(\n funcArgs,\n evaluator,\n alias ?? \"regexp_split_to_table\",\n aliasColName ?? \"regexp_split_to_table\",\n );\n }\n\n throw new Error(`Unsupported FROM-clause function: ${funcName}`);\n }\n\n private _buildGenerateSeries(\n funcArgs: Record<string, unknown>[],\n evaluator: ExprEvaluator,\n aliasName: string,\n colName: string,\n ): Record<string, unknown>[] {\n if (funcArgs.length < 2) {\n throw new Error(\"generate_series requires at least 2 arguments\");\n }\n const start = Number(evaluator.evaluate(funcArgs[0]!, {}));\n const stop = Number(evaluator.evaluate(funcArgs[1]!, {}));\n const step = funcArgs.length > 2 ? Number(evaluator.evaluate(funcArgs[2]!, {})) : 1;\n\n if (step === 0) {\n throw new Error(\"generate_series step cannot be zero\");\n }\n\n const rows: Record<string, unknown>[] = [];\n if (step > 0) {\n for (let current = start; current <= stop; current += step) {\n const row: Record<string, unknown> = { [colName]: current };\n row[`${aliasName}.${colName}`] = current;\n rows.push(row);\n }\n } else {\n for (let current = start; current >= stop; current += step) {\n const row: Record<string, unknown> = { [colName]: current };\n row[`${aliasName}.${colName}`] = current;\n rows.push(row);\n }\n }\n return rows;\n }\n\n private _buildUnnest(\n funcArgs: Record<string, unknown>[],\n evaluator: ExprEvaluator,\n aliasName: string,\n colName: string,\n ): Record<string, unknown>[] {\n if (funcArgs.length < 1) {\n throw new Error(\"unnest requires at least 1 argument\");\n }\n let arr = evaluator.evaluate(funcArgs[0]!, {});\n if (!Array.isArray(arr)) {\n arr = [arr];\n }\n const rows: Record<string, unknown>[] = [];\n for (const val of arr as unknown[]) {\n const row: Record<string, unknown> = { [colName]: val };\n row[`${aliasName}.${colName}`] = val;\n rows.push(row);\n }\n return rows;\n }\n\n private _buildJSONEach(\n funcArgs: Record<string, unknown>[],\n evaluator: ExprEvaluator,\n aliasName: string,\n asText: boolean,\n ): Record<string, unknown>[] {\n if (funcArgs.length < 1) {\n throw new Error(\"json_each requires at least 1 argument\");\n }\n let jsonVal = evaluator.evaluate(funcArgs[0]!, {});\n if (typeof jsonVal === \"string\") {\n jsonVal = JSON.parse(jsonVal);\n }\n if (jsonVal === null || typeof jsonVal !== \"object\" || Array.isArray(jsonVal)) {\n throw new Error(\"json_each expects a JSON object\");\n }\n const rows: Record<string, unknown>[] = [];\n for (const [key, value] of Object.entries(jsonVal as Record<string, unknown>)) {\n const displayValue = asText ? String(value) : value;\n const row: Record<string, unknown> = {\n key,\n value: displayValue,\n };\n row[`${aliasName}.key`] = key;\n row[`${aliasName}.value`] = displayValue;\n rows.push(row);\n }\n return rows;\n }\n\n private _buildJSONArrayElements(\n funcArgs: Record<string, unknown>[],\n evaluator: ExprEvaluator,\n aliasName: string,\n asText: boolean,\n ): Record<string, unknown>[] {\n if (funcArgs.length < 1) {\n throw new Error(\"json_array_elements requires at least 1 argument\");\n }\n let jsonVal = evaluator.evaluate(funcArgs[0]!, {});\n if (typeof jsonVal === \"string\") {\n jsonVal = JSON.parse(jsonVal);\n }\n if (!Array.isArray(jsonVal)) {\n throw new Error(\"json_array_elements expects a JSON array\");\n }\n const rows: Record<string, unknown>[] = [];\n for (const elem of jsonVal as unknown[]) {\n const displayValue = asText ? String(elem) : elem;\n const row: Record<string, unknown> = { value: displayValue };\n row[`${aliasName}.value`] = displayValue;\n rows.push(row);\n }\n return rows;\n }\n\n private _buildRegexpSplitToTable(\n funcArgs: Record<string, unknown>[],\n evaluator: ExprEvaluator,\n aliasName: string,\n colName: string,\n ): Record<string, unknown>[] {\n if (funcArgs.length < 2) {\n throw new Error(\"regexp_split_to_table requires at least 2 arguments\");\n }\n const str = String(evaluator.evaluate(funcArgs[0]!, {}));\n const pattern = String(evaluator.evaluate(funcArgs[1]!, {}));\n const flags =\n funcArgs.length > 2 ? String(evaluator.evaluate(funcArgs[2]!, {})) : \"\";\n const regex = new RegExp(pattern, flags.includes(\"g\") ? flags : flags + \"g\");\n const parts = str.split(regex);\n const rows: Record<string, unknown>[] = [];\n for (const part of parts) {\n const row: Record<string, unknown> = { [colName]: part };\n row[`${aliasName}.${colName}`] = part;\n rows.push(row);\n }\n return rows;\n }\n\n // -- JOIN -----------------------------------------------------------\n\n private _crossJoin(\n left: Record<string, unknown>[],\n right: Record<string, unknown>[],\n ): Record<string, unknown>[] {\n const result: Record<string, unknown>[] = [];\n for (const lRow of left) {\n for (const rRow of right) {\n result.push({ ...lRow, ...rRow });\n }\n }\n return result;\n }\n\n private _resolveJoin(\n joinExpr: Record<string, unknown>,\n params: unknown[],\n ): Record<string, unknown>[] {\n const joinType = nodeGet(joinExpr, \"jointype\");\n const larg = asObj(nodeGet(joinExpr, \"larg\"));\n const rarg = asObj(nodeGet(joinExpr, \"rarg\"));\n const quals = nodeGet(joinExpr, \"quals\");\n\n // Check for LATERAL subquery on the right side\n const rSubselect = nodeGet(rarg, \"RangeSubselect\");\n if (rSubselect !== null && rSubselect !== undefined) {\n const subNode = asObj(rSubselect);\n if (nodeGet(subNode, \"lateral\") === true) {\n const leftRows = this._resolveFromItem(larg, params);\n return this._resolveLateralJoin(leftRows, subNode, params);\n }\n }\n\n const leftRows = this._resolveFromItem(larg, params);\n const rightRows = this._resolveFromItem(rarg, params);\n\n const evaluator = new ExprEvaluator({ params });\n\n // JOIN_INNER = 0, JOIN_LEFT = 1, JOIN_FULL = 2, JOIN_RIGHT = 3, JOIN_CROSS = 5\n if (joinType === 5 || joinType === \"JOIN_CROSS\") {\n return this._crossJoin(leftRows, rightRows);\n }\n\n // CROSS JOIN: INNER with no quals\n if (\n (joinType === 0 || joinType === \"JOIN_INNER\") &&\n (quals === null || quals === undefined)\n ) {\n return this._crossJoin(leftRows, rightRows);\n }\n\n const result: Record<string, unknown>[] = [];\n const isLeftJoin = joinType === 1 || joinType === \"JOIN_LEFT\";\n const isRightJoin = joinType === 3 || joinType === \"JOIN_RIGHT\";\n const isFullJoin = joinType === 2 || joinType === \"JOIN_FULL\";\n\n const rightMatched = new Set<number>();\n\n for (const lRow of leftRows) {\n let matched = false;\n for (let ri = 0; ri < rightRows.length; ri++) {\n const rRow = rightRows[ri]!;\n const combined = { ...lRow, ...rRow };\n\n if (quals !== null && quals !== undefined) {\n const condition = evaluator.evaluate(asObj(quals), combined);\n if (condition !== true) continue;\n }\n\n result.push(combined);\n matched = true;\n rightMatched.add(ri);\n }\n\n if (!matched && (isLeftJoin || isFullJoin)) {\n const merged: Record<string, unknown> = { ...lRow };\n if (rightRows.length > 0) {\n for (const key of Object.keys(rightRows[0]!)) {\n if (!(key in merged)) {\n merged[key] = null;\n }\n }\n }\n result.push(merged);\n }\n }\n\n if (isRightJoin || isFullJoin) {\n for (let ri = 0; ri < rightRows.length; ri++) {\n if (!rightMatched.has(ri)) {\n const merged: Record<string, unknown> = {};\n if (leftRows.length > 0) {\n for (const key of Object.keys(leftRows[0]!)) {\n merged[key] = null;\n }\n }\n // Right row values override nulls for their own columns\n for (const [key, val] of Object.entries(rightRows[ri]!)) {\n merged[key] = val;\n }\n result.push(merged);\n }\n }\n }\n\n return result;\n }\n\n // -- information_schema virtual tables ------------------------------\n\n private _buildInformationSchemaTable(\n viewName: string,\n alias: string,\n ): Record<string, unknown>[] {\n if (viewName === \"tables\") {\n const rows: Record<string, unknown>[] = [];\n for (const tname of [...this._tables.keys()].sort()) {\n rows.push({\n table_catalog: \"\",\n table_schema: \"public\",\n table_name: tname,\n table_type: \"BASE TABLE\",\n });\n }\n for (const ftname of [...this._foreignTables.keys()].sort()) {\n rows.push({\n table_catalog: \"\",\n table_schema: \"public\",\n table_name: ftname,\n table_type: \"FOREIGN TABLE\",\n });\n }\n for (const vname of [...this._views.keys()].sort()) {\n rows.push({\n table_catalog: \"\",\n table_schema: \"public\",\n table_name: vname,\n table_type: \"VIEW\",\n });\n }\n return this._applyAlias(rows, alias);\n }\n if (viewName === \"columns\") {\n const INFO_TYPE_DISPLAY: Record<string, string> = {\n int2: \"smallint\",\n int4: \"integer\",\n int8: \"bigint\",\n float4: \"real\",\n float8: \"double precision\",\n bool: \"boolean\",\n };\n const rows: Record<string, unknown>[] = [];\n for (const tname of [...this._tables.keys()].sort()) {\n const tbl = this._tables.get(tname)!;\n let pos = 1;\n for (const [cname, cdef] of tbl.columns) {\n const displayType = INFO_TYPE_DISPLAY[cdef.typeName] ?? cdef.typeName;\n rows.push({\n table_catalog: \"\",\n table_schema: \"public\",\n table_name: tname,\n column_name: cname,\n ordinal_position: pos,\n data_type: displayType,\n is_nullable: cdef.notNull ? \"NO\" : \"YES\",\n });\n pos++;\n }\n }\n for (const ftname of [...this._foreignTables.keys()].sort()) {\n const ft = this._foreignTables.get(ftname)!;\n let pos = 1;\n for (const [cname, cdef] of ft.columns) {\n const displayType = INFO_TYPE_DISPLAY[cdef.typeName] ?? cdef.typeName;\n rows.push({\n table_catalog: \"\",\n table_schema: \"public\",\n table_name: ftname,\n column_name: cname,\n ordinal_position: pos,\n data_type: displayType,\n is_nullable: cdef.notNull ? \"NO\" : \"YES\",\n });\n pos++;\n }\n }\n return this._applyAlias(rows, alias);\n }\n throw new Error(`Unknown information_schema view: \"${viewName}\"`);\n }\n\n private _buildPgCatalogTable(\n viewName: string,\n alias: string,\n ): Record<string, unknown>[] {\n if (viewName === \"pg_tables\") {\n const rows: Record<string, unknown>[] = [];\n for (const tname of [...this._tables.keys()].sort()) {\n rows.push({\n schemaname: \"public\",\n tablename: tname,\n tableowner: \"\",\n tablespace: \"\",\n });\n }\n return this._applyAlias(rows, alias);\n }\n if (viewName === \"pg_views\") {\n const rows: Record<string, unknown>[] = [];\n for (const vname of [...this._views.keys()].sort()) {\n rows.push({\n schemaname: \"public\",\n viewname: vname,\n viewowner: \"\",\n definition: \"\",\n });\n }\n return this._applyAlias(rows, alias);\n }\n if (viewName === \"pg_indexes\") {\n const rows: Record<string, unknown>[] = [];\n // If engine has index manager, enumerate indexes\n const eng = this._engine as Record<string, unknown> | null;\n const indexMgr =\n eng !== null\n ? (eng[\"_indexManager\"] as Record<string, unknown> | undefined)\n : undefined;\n if (indexMgr !== undefined) {\n const indexes = indexMgr[\"_indexes\"] as\n | Map<string, Record<string, unknown>>\n | undefined;\n if (indexes !== undefined) {\n for (const idx of indexes.values()) {\n const idxDef = idx[\"indexDef\"] as Record<string, unknown> | undefined;\n if (idxDef !== undefined) {\n const tblName = (idxDef[\"tableName\"] as string | undefined) ?? \"\";\n const idxName = (idxDef[\"name\"] as string | undefined) ?? \"\";\n const cols = (idxDef[\"columns\"] as string[] | undefined) ?? [];\n rows.push({\n schemaname: \"public\",\n tablename: tblName,\n indexname: idxName,\n tablespace: \"\",\n indexdef: `CREATE INDEX ${idxName} ON ${tblName} (${cols.join(\", \")})`,\n });\n }\n }\n }\n }\n return this._applyAlias(rows, alias);\n }\n if (viewName === \"pg_type\") {\n const typeEntries: [number, string, number, number, string, string][] = [\n [16, \"boolean\", 11, 1, \"b\", \"B\"],\n [17, \"bytea\", 11, -1, \"b\", \"U\"],\n [20, \"bigint\", 11, 8, \"b\", \"N\"],\n [21, \"smallint\", 11, 2, \"b\", \"N\"],\n [23, \"integer\", 11, 4, \"b\", \"N\"],\n [25, \"text\", 11, -1, \"b\", \"S\"],\n [114, \"json\", 11, -1, \"b\", \"U\"],\n [142, \"xml\", 11, -1, \"b\", \"U\"],\n [700, \"real\", 11, 4, \"b\", \"N\"],\n [701, \"float8\", 11, 8, \"b\", \"N\"],\n [1043, \"varchar\", 11, -1, \"b\", \"S\"],\n [1082, \"date\", 11, 4, \"b\", \"D\"],\n [1083, \"time\", 11, 8, \"b\", \"D\"],\n [1114, \"timestamp\", 11, 8, \"b\", \"D\"],\n [1184, \"timestamptz\", 11, 8, \"b\", \"D\"],\n [1186, \"interval\", 11, 16, \"b\", \"T\"],\n [1700, \"numeric\", 11, -1, \"b\", \"N\"],\n [2950, \"uuid\", 11, 16, \"b\", \"U\"],\n [3802, \"jsonb\", 11, -1, \"b\", \"U\"],\n [16385, \"vector\", 11, -1, \"b\", \"U\"],\n ];\n const rows: Record<string, unknown>[] = typeEntries.map(\n ([oid, typname, typnamespace, typlen, typtype, typcategory]) => ({\n oid,\n typname,\n typnamespace,\n typlen,\n typtype,\n typcategory,\n }),\n );\n return this._applyAlias(rows, alias);\n }\n throw new Error(`Unknown pg_catalog view: \"${viewName}\"`);\n }\n\n // -- Column projection -----------------------------------------------\n\n private _projectColumns(\n targetList: Record<string, unknown>[],\n rows: Record<string, unknown>[],\n evaluator: ExprEvaluator,\n ): [string[], Record<string, unknown>[]] {\n // Check for SELECT *\n if (targetList.length === 0) {\n if (rows.length === 0) return [[], []];\n const columns = Object.keys(rows[0]!).filter((k) => !k.includes(\".\"));\n return [\n columns,\n rows.map((r) => {\n const out: Record<string, unknown> = {};\n for (const c of columns) out[c] = r[c];\n return out;\n }),\n ];\n }\n\n const columns: string[] = [];\n const colExprs: { name: string; node: Record<string, unknown> | null }[] = [];\n\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const val = nodeGet(resTarget, \"val\");\n const name = nodeStr(resTarget, \"name\"); // alias\n\n if (val !== null && val !== undefined) {\n const valObj = asObj(val);\n\n // Check for star expansion\n if (isAStar(valObj)) {\n // Check if qualified (table.*)\n const colRef = nodeGet(valObj, \"ColumnRef\");\n if (colRef !== null && colRef !== undefined) {\n const fields = asList(nodeGet(asObj(colRef), \"fields\"));\n if (fields.length >= 2) {\n // table.* expansion\n const tableAlias = extractString(fields[0]!);\n if (rows.length > 0) {\n for (const key of Object.keys(rows[0]!)) {\n const prefix = `${tableAlias}.`;\n if (key.startsWith(prefix)) {\n const colName = key.slice(prefix.length);\n if (!colName.includes(\".\")) {\n columns.push(colName);\n colExprs.push({ name: colName, node: null });\n }\n }\n }\n }\n continue;\n }\n }\n // SELECT * expansion\n if (rows.length > 0) {\n for (const key of Object.keys(rows[0]!)) {\n if (!key.includes(\".\")) {\n columns.push(key);\n colExprs.push({ name: key, node: null });\n }\n }\n }\n continue;\n }\n\n // Normal expression\n let colName = name;\n if (!colName) {\n colName = this._deriveColumnName(valObj);\n }\n columns.push(colName);\n colExprs.push({ name: colName, node: valObj });\n }\n }\n\n const projectedRows: Record<string, unknown>[] = [];\n for (const row of rows) {\n const projected: Record<string, unknown> = {};\n for (const expr of colExprs) {\n if (expr.node === null) {\n projected[expr.name] = row[expr.name];\n } else {\n projected[expr.name] = evaluator.evaluate(expr.node, row);\n }\n }\n projectedRows.push(projected);\n }\n\n return [columns, projectedRows];\n }\n\n private _deriveColumnName(node: Record<string, unknown>): string {\n // ColumnRef\n if (isColumnRef(node)) {\n try {\n return extractColumnName(node);\n } catch {\n // fall through\n }\n }\n\n // FuncCall\n if (isFuncCall(node)) {\n const fn = getFuncName(node);\n if (AGG_FUNC_NAMES.has(fn)) {\n const args = getFuncArgs(node);\n if (isAggStar(node) || args.length === 0) return fn;\n try {\n const argCol = extractColumnName(args[0]!);\n return `${fn}_${argCol}`;\n } catch {\n return fn;\n }\n }\n return fn;\n }\n\n // TypeCast\n if (isTypeCast(node)) {\n const tc = asObj(nodeGet(node, \"TypeCast\"));\n const arg = asObj(nodeGet(tc, \"arg\"));\n if (isColumnRef(arg)) {\n try {\n return extractColumnName(arg);\n } catch {\n // fall through\n }\n }\n }\n\n // SubLink (scalar subquery)\n if (isSubLink(node)) {\n return \"?column?\";\n }\n\n return \"?column?\";\n }\n\n private _resolveSelectColumnNames(\n targetList: Record<string, unknown>[],\n rows: Record<string, unknown>[],\n ): string[] {\n if (targetList.length === 0) {\n if (rows.length === 0) return [];\n return Object.keys(rows[0]!).filter((k) => !k.includes(\".\"));\n }\n\n const columns: string[] = [];\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const val = nodeGet(resTarget, \"val\");\n const alias = nodeStr(resTarget, \"name\");\n\n if (val !== null && val !== undefined) {\n const valObj = asObj(val);\n if (isAStar(valObj)) {\n if (rows.length > 0) {\n for (const key of Object.keys(rows[0]!)) {\n if (!key.includes(\".\")) {\n columns.push(key);\n }\n }\n }\n continue;\n }\n columns.push(alias || this._deriveColumnName(valObj));\n }\n }\n return columns;\n }\n\n // -- GROUP BY -------------------------------------------------------\n\n private _hasAggregates(targetList: Record<string, unknown>[]): boolean {\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const val = nodeGet(resTarget, \"val\");\n if (val !== null && val !== undefined) {\n if (this._containsAggregate(asObj(val))) return true;\n }\n }\n return false;\n }\n\n private _containsAggregate(node: Record<string, unknown>): boolean {\n if (isFuncCall(node)) {\n const fn = getFuncName(node);\n if (AGG_FUNC_NAMES.has(fn) && !hasOverClause(node)) return true;\n }\n // Do not descend into SubLink (subquery) nodes -- aggregates inside\n // subqueries belong to the subquery, not the outer query.\n if (isSubLink(node) || nodeGet(node, \"SubLink\") !== null) return false;\n // Check nested function calls\n for (const [, value] of Object.entries(node)) {\n if (value !== null && typeof value === \"object\") {\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item !== null && typeof item === \"object\") {\n if (this._containsAggregate(item as Record<string, unknown>)) return true;\n }\n }\n } else {\n if (this._containsAggregate(value as Record<string, unknown>)) return true;\n }\n }\n }\n return false;\n }\n\n private _applyGroupBy(\n rows: Record<string, unknown>[],\n groupClause: Record<string, unknown>[],\n targetList: Record<string, unknown>[],\n havingClause: unknown,\n evaluator: ExprEvaluator,\n ): Record<string, unknown>[] {\n // Compute group keys for each row\n const groups = new Map<string, Record<string, unknown>[]>();\n\n if (groupClause.length === 0) {\n // Aggregate without GROUP BY -- one group for all rows\n groups.set(\"__all__\", rows);\n } else {\n for (const row of rows) {\n const keyParts: unknown[] = [];\n for (const groupExpr of groupClause) {\n const val = evaluator.evaluate(groupExpr, row);\n keyParts.push(val);\n }\n const key = JSON.stringify(keyParts);\n let group = groups.get(key);\n if (!group) {\n group = [];\n groups.set(key, group);\n }\n group.push(row);\n }\n }\n\n // For each group, compute aggregates\n const result: Record<string, unknown>[] = [];\n const groupRowsList: Record<string, unknown>[][] = [];\n for (const [, groupRows] of groups) {\n const aggregatedRow = this._computeAggregates(groupRows, targetList, evaluator);\n result.push(aggregatedRow);\n groupRowsList.push(groupRows);\n }\n\n // Apply HAVING\n if (havingClause !== null && havingClause !== undefined) {\n const filtered: Record<string, unknown>[] = [];\n for (let i = 0; i < result.length; i++) {\n const row = result[i]!;\n const groupRows = groupRowsList[i]!;\n // Resolve aggregate functions in HAVING clause using group rows\n const enrichedRow = this._resolveHavingAggregates(\n asObj(havingClause),\n groupRows,\n row,\n evaluator,\n );\n const condition = evaluator.evaluate(asObj(havingClause), enrichedRow);\n if (condition === true) {\n filtered.push(row);\n }\n }\n return filtered;\n }\n\n return result;\n }\n\n private _computeAggregates(\n groupRows: Record<string, unknown>[],\n targetList: Record<string, unknown>[],\n evaluator: ExprEvaluator,\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const firstRow = groupRows[0]!;\n\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const val = nodeGet(resTarget, \"val\");\n const alias = nodeStr(resTarget, \"name\");\n\n if (val === null || val === undefined) continue;\n\n const valObj = asObj(val);\n\n if (isFuncCall(valObj)) {\n const funcName = getFuncName(valObj);\n const isStar = isAggStar(valObj);\n const argNodes = getFuncArgs(valObj);\n const distinct = isAggDistinct(valObj);\n const hasOver = hasOverClause(valObj);\n\n // Window functions are handled separately\n if (hasOver) {\n const colName = alias || funcName;\n result[colName] = evaluator.evaluate(valObj, firstRow);\n continue;\n }\n\n if (!AGG_FUNC_NAMES.has(funcName)) {\n // Not an aggregate -- but may contain aggregate sub-expressions\n // (e.g., ROUND(STDDEV(val), 2))\n const enrichedRow = { ...firstRow };\n this._collectHavingAggregates(valObj, groupRows, enrichedRow, evaluator);\n const colName = alias || this._deriveColumnName(valObj);\n result[colName] = evaluator.evaluate(valObj, enrichedRow);\n continue;\n }\n\n let colName = alias;\n if (!colName) {\n if (isStar || argNodes.length === 0) {\n colName = funcName;\n } else {\n try {\n const argCol = extractColumnName(argNodes[0]!);\n colName = `${funcName}_${argCol}`;\n } catch {\n colName = funcName;\n }\n }\n }\n\n let aggValue: unknown;\n\n // Get values, optionally with DISTINCT\n const getValues = (): unknown[] => {\n let values: unknown[] = [];\n for (const r of groupRows) {\n const v = evaluator.evaluate(argNodes[0]!, r);\n if (v !== null && v !== undefined) {\n values.push(v);\n }\n }\n if (distinct) {\n const seen = new Set<string>();\n const unique: unknown[] = [];\n for (const v of values) {\n const key = JSON.stringify(v);\n if (!seen.has(key)) {\n seen.add(key);\n unique.push(v);\n }\n }\n values = unique;\n }\n return values;\n };\n\n switch (funcName) {\n case \"count\":\n if (isStar) {\n aggValue = groupRows.length;\n } else {\n aggValue = getValues().length;\n }\n break;\n\n case \"sum\": {\n const values = getValues();\n aggValue =\n values.length > 0\n ? values.reduce((a: number, b) => a + Number(b), 0)\n : null;\n break;\n }\n\n case \"avg\": {\n const values = getValues();\n if (values.length > 0) {\n const sum = values.reduce((a: number, b) => a + Number(b), 0);\n aggValue = sum / values.length;\n } else {\n aggValue = null;\n }\n break;\n }\n\n case \"min\": {\n const values = getValues();\n if (values.length === 0) {\n aggValue = null;\n } else {\n aggValue = values.reduce((a, b) =>\n (a as number) < (b as number) ? a : b,\n );\n }\n break;\n }\n\n case \"max\": {\n const values = getValues();\n if (values.length === 0) {\n aggValue = null;\n } else {\n aggValue = values.reduce((a, b) =>\n (a as number) > (b as number) ? a : b,\n );\n }\n break;\n }\n\n case \"string_agg\": {\n const separator =\n argNodes.length >= 2\n ? String(evaluator.evaluate(argNodes[1]!, firstRow))\n : \",\";\n const values: string[] = [];\n for (const r of groupRows) {\n const v = evaluator.evaluate(argNodes[0]!, r);\n if (v !== null && v !== undefined) {\n values.push(toStr(v));\n }\n }\n aggValue = values.length > 0 ? values.join(separator) : null;\n break;\n }\n\n case \"array_agg\": {\n const values: unknown[] = [];\n for (const r of groupRows) {\n values.push(evaluator.evaluate(argNodes[0]!, r));\n }\n aggValue = values;\n break;\n }\n\n case \"bool_and\": {\n const values = getValues();\n aggValue = values.length > 0 ? values.every((v) => Boolean(v)) : null;\n break;\n }\n\n case \"bool_or\": {\n const values = getValues();\n aggValue = values.length > 0 ? values.some((v) => Boolean(v)) : null;\n break;\n }\n\n case \"stddev\":\n case \"stddev_samp\": {\n const values = getValues().map(Number);\n if (values.length < 2) {\n aggValue = null;\n } else {\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n const variance =\n values.reduce((a, b) => a + (b - mean) ** 2, 0) / (values.length - 1);\n aggValue = Math.sqrt(variance);\n }\n break;\n }\n\n case \"stddev_pop\": {\n const values = getValues().map(Number);\n if (values.length === 0) {\n aggValue = null;\n } else {\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n const variance =\n values.reduce((a, b) => a + (b - mean) ** 2, 0) / values.length;\n aggValue = Math.sqrt(variance);\n }\n break;\n }\n\n case \"variance\":\n case \"var_samp\": {\n const values = getValues().map(Number);\n if (values.length < 2) {\n aggValue = null;\n } else {\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n aggValue =\n values.reduce((a, b) => a + (b - mean) ** 2, 0) / (values.length - 1);\n }\n break;\n }\n\n case \"var_pop\": {\n const values = getValues().map(Number);\n if (values.length === 0) {\n aggValue = null;\n } else {\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n aggValue =\n values.reduce((a, b) => a + (b - mean) ** 2, 0) / values.length;\n }\n break;\n }\n\n case \"json_object_agg\":\n case \"jsonb_object_agg\": {\n if (argNodes.length < 2) {\n aggValue = null;\n } else {\n const obj: Record<string, unknown> = {};\n for (const r of groupRows) {\n const k = evaluator.evaluate(argNodes[0]!, r);\n const v = evaluator.evaluate(argNodes[1]!, r);\n if (k !== null && k !== undefined) {\n obj[String(k as string | number)] = v;\n }\n }\n aggValue = obj;\n }\n break;\n }\n\n case \"percentile_cont\": {\n // percentile_cont(fraction) WITHIN GROUP (ORDER BY col)\n if (argNodes.length > 0) {\n const fraction = Number(evaluator.evaluate(argNodes[0]!, firstRow));\n const fc = asObj(nodeGet(valObj, \"FuncCall\") ?? valObj);\n const aggOrder = asList(nodeGet(fc, \"agg_order\"));\n if (aggOrder.length > 0) {\n const orderNode = asObj(\n nodeGet(aggOrder[0]!, \"SortBy\") ?? aggOrder[0]!,\n );\n const orderCol = asObj(nodeGet(orderNode, \"node\"));\n const values: number[] = [];\n for (const r of groupRows) {\n const v = evaluator.evaluate(orderCol, r);\n if (v !== null && v !== undefined) values.push(Number(v));\n }\n values.sort((a, b) => a - b);\n if (values.length === 0) {\n aggValue = null;\n } else {\n const idx = fraction * (values.length - 1);\n const lower = Math.floor(idx);\n const upper = Math.ceil(idx);\n if (lower === upper) {\n aggValue = values[lower]!;\n } else {\n aggValue =\n values[lower]! +\n (idx - lower) * (values[upper]! - values[lower]!);\n }\n }\n } else {\n aggValue = null;\n }\n } else {\n aggValue = null;\n }\n break;\n }\n\n case \"mode\": {\n const fc = asObj(nodeGet(valObj, \"FuncCall\") ?? valObj);\n const aggOrder = asList(nodeGet(fc, \"agg_order\"));\n if (aggOrder.length > 0) {\n const orderNode = asObj(nodeGet(aggOrder[0]!, \"SortBy\") ?? aggOrder[0]!);\n const orderCol = asObj(nodeGet(orderNode, \"node\"));\n const freq = new Map<string, { count: number; value: unknown }>();\n for (const r of groupRows) {\n const v = evaluator.evaluate(orderCol, r);\n const key = JSON.stringify(v);\n const entry = freq.get(key);\n if (entry) {\n entry.count++;\n } else {\n freq.set(key, { count: 1, value: v });\n }\n }\n let maxCount = 0;\n let modeValue: unknown = null;\n for (const entry of freq.values()) {\n if (entry.count > maxCount) {\n maxCount = entry.count;\n modeValue = entry.value;\n }\n }\n aggValue = modeValue;\n } else {\n aggValue = null;\n }\n break;\n }\n\n case \"corr\":\n case \"covar_pop\":\n case \"covar_samp\":\n case \"regr_count\":\n case \"regr_avgx\":\n case \"regr_avgy\":\n case \"regr_sxx\":\n case \"regr_syy\":\n case \"regr_sxy\":\n case \"regr_slope\":\n case \"regr_intercept\":\n case \"regr_r2\": {\n // Two-argument statistical aggregates\n if (argNodes.length < 2) {\n aggValue = null;\n break;\n }\n const yVals: number[] = [];\n const xVals: number[] = [];\n for (const r of groupRows) {\n const y = evaluator.evaluate(argNodes[0]!, r);\n const x = evaluator.evaluate(argNodes[1]!, r);\n if (y !== null && y !== undefined && x !== null && x !== undefined) {\n yVals.push(Number(y));\n xVals.push(Number(x));\n }\n }\n aggValue = this._computeStatAgg(funcName, yVals, xVals);\n break;\n }\n\n default:\n aggValue = evaluator.evaluate(valObj, firstRow);\n break;\n }\n\n result[colName] = aggValue;\n } else {\n // Non-aggregate expression -- use value from first row\n const colName = alias || this._deriveColumnName(valObj);\n result[colName] = evaluator.evaluate(valObj, firstRow);\n }\n }\n\n return result;\n }\n\n private _computeStatAgg(funcName: string, yVals: number[], xVals: number[]): unknown {\n const n = yVals.length;\n if (n === 0) return null;\n\n const sumX = xVals.reduce((a, b) => a + b, 0);\n const sumY = yVals.reduce((a, b) => a + b, 0);\n const avgX = sumX / n;\n const avgY = sumY / n;\n\n let sxx = 0;\n let syy = 0;\n let sxy = 0;\n for (let i = 0; i < n; i++) {\n const dx = xVals[i]! - avgX;\n const dy = yVals[i]! - avgY;\n sxx += dx * dx;\n syy += dy * dy;\n sxy += dx * dy;\n }\n\n switch (funcName) {\n case \"regr_count\":\n return n;\n case \"regr_avgx\":\n return avgX;\n case \"regr_avgy\":\n return avgY;\n case \"regr_sxx\":\n return sxx;\n case \"regr_syy\":\n return syy;\n case \"regr_sxy\":\n return sxy;\n case \"covar_pop\":\n return sxy / n;\n case \"covar_samp\":\n return n < 2 ? null : sxy / (n - 1);\n case \"corr\": {\n if (sxx === 0 || syy === 0) return null;\n return sxy / Math.sqrt(sxx * syy);\n }\n case \"regr_slope\": {\n if (sxx === 0) return null;\n return sxy / sxx;\n }\n case \"regr_intercept\": {\n if (sxx === 0) return null;\n return avgY - (sxy / sxx) * avgX;\n }\n case \"regr_r2\": {\n if (sxx === 0 || syy === 0) return null;\n const r = sxy / Math.sqrt(sxx * syy);\n return r * r;\n }\n default:\n return null;\n }\n }\n\n // -- HAVING aggregate resolution ----------------------------------------\n\n /**\n * Walk the HAVING expression tree and resolve any aggregate function calls\n * (COUNT, SUM, AVG, etc.) by computing them from the group rows. The\n * computed values are injected into the enriched row under a synthetic key\n * so the normal expression evaluator can look them up.\n */\n private _resolveHavingAggregates(\n expr: Record<string, unknown>,\n groupRows: Record<string, unknown>[],\n baseRow: Record<string, unknown>,\n evaluator: ExprEvaluator,\n ): Record<string, unknown> {\n const enriched = { ...baseRow };\n this._collectHavingAggregates(expr, groupRows, enriched, evaluator);\n return enriched;\n }\n\n private _collectHavingAggregates(\n node: Record<string, unknown>,\n groupRows: Record<string, unknown>[],\n enriched: Record<string, unknown>,\n evaluator: ExprEvaluator,\n ): void {\n // Check if this node is a FuncCall\n const funcCallNode = node[\"FuncCall\"] as Record<string, unknown> | undefined;\n if (funcCallNode) {\n const funcNameParts = funcCallNode[\"funcname\"] as unknown[];\n if (funcNameParts.length > 0) {\n const lastPart = funcNameParts[funcNameParts.length - 1] as Record<\n string,\n unknown\n >;\n const strNode = lastPart[\"String\"] ?? lastPart[\"str\"];\n const name = (\n typeof strNode === \"object\" && strNode !== null\n ? ((strNode as Record<string, unknown>)[\"sval\"] ??\n (strNode as Record<string, unknown>)[\"str\"])\n : strNode\n ) as string | undefined;\n if (name && AGG_FUNC_NAMES.has(name.toLowerCase())) {\n // Compute the aggregate on group rows\n const aggResult = this._computeInlineAggregate(\n name.toLowerCase(),\n funcCallNode,\n groupRows,\n evaluator,\n );\n // Store under the string representation of the aggregate call\n // Build a synthetic key that the evaluator will return when it encounters this FuncCall\n // We override by adding to the row with the funcname as key\n const isStar = isAggStar(node);\n const args = getFuncArgs(node);\n let key: string;\n if (isStar || args.length === 0) {\n key = `${name.toLowerCase()}(*)`;\n } else {\n try {\n const argCol = extractColumnName(args[0]!);\n key = `${name.toLowerCase()}(${argCol})`;\n } catch {\n key = name.toLowerCase();\n }\n }\n enriched[key] = aggResult;\n // Also store under common aliases the evaluator might generate\n enriched[`__having_agg_${JSON.stringify(node)}`] = aggResult;\n return;\n }\n }\n }\n\n // Check BoolExpr children (AND/OR)\n const boolExpr = node[\"BoolExpr\"] as Record<string, unknown> | undefined;\n if (boolExpr) {\n const args = asList(boolExpr[\"args\"]);\n for (const arg of args) {\n this._collectHavingAggregates(asObj(arg), groupRows, enriched, evaluator);\n }\n return;\n }\n\n // Check A_Expr children (comparison like > < =)\n const aExpr = node[\"A_Expr\"] as Record<string, unknown> | undefined;\n if (aExpr) {\n const lexpr = aExpr[\"lexpr\"];\n const rexpr = aExpr[\"rexpr\"];\n if (lexpr) {\n this._collectHavingAggregates(asObj(lexpr), groupRows, enriched, evaluator);\n }\n if (rexpr) {\n this._collectHavingAggregates(asObj(rexpr), groupRows, enriched, evaluator);\n }\n return;\n }\n\n // Recurse into all object values and arrays\n for (const v of Object.values(node)) {\n if (Array.isArray(v)) {\n for (const item of v) {\n if (typeof item === \"object\" && item !== null) {\n this._collectHavingAggregates(\n item as Record<string, unknown>,\n groupRows,\n enriched,\n evaluator,\n );\n }\n }\n } else if (typeof v === \"object\" && v !== null) {\n this._collectHavingAggregates(\n v as Record<string, unknown>,\n groupRows,\n enriched,\n evaluator,\n );\n }\n }\n }\n\n private _computeInlineAggregate(\n funcName: string,\n funcCallNode: Record<string, unknown>,\n groupRows: Record<string, unknown>[],\n evaluator: ExprEvaluator,\n ): unknown {\n const parentNode = { FuncCall: funcCallNode } as Record<string, unknown>;\n const isStar = isAggStar(parentNode);\n const argNodes = getFuncArgs(parentNode);\n const distinct = isAggDistinct(parentNode);\n\n const getValues = (): unknown[] => {\n let values: unknown[] = [];\n for (const r of groupRows) {\n const v = argNodes.length > 0 ? evaluator.evaluate(argNodes[0]!, r) : null;\n if (v !== null && v !== undefined) {\n values.push(v);\n }\n }\n if (distinct) {\n const seen = new Set<string>();\n const unique: unknown[] = [];\n for (const v of values) {\n const key = JSON.stringify(v);\n if (!seen.has(key)) {\n seen.add(key);\n unique.push(v);\n }\n }\n values = unique;\n }\n return values;\n };\n\n // Two-argument aggregate helpers\n const getPairedValues = (): [number, number][] => {\n const pairs: [number, number][] = [];\n if (argNodes.length < 2) return pairs;\n for (const r of groupRows) {\n const v1 = evaluator.evaluate(argNodes[0]!, r);\n const v2 = evaluator.evaluate(argNodes[1]!, r);\n if (v1 !== null && v1 !== undefined && v2 !== null && v2 !== undefined) {\n pairs.push([Number(v1), Number(v2)]);\n }\n }\n return pairs;\n };\n\n switch (funcName) {\n case \"count\":\n return isStar ? groupRows.length : getValues().length;\n case \"sum\": {\n const values = getValues();\n return values.length > 0\n ? values.reduce((a: number, b) => a + Number(b), 0)\n : null;\n }\n case \"avg\": {\n const values = getValues();\n return values.length > 0\n ? values.reduce((a: number, b) => a + Number(b), 0) / values.length\n : null;\n }\n case \"min\": {\n const values = getValues();\n return values.length > 0\n ? values.reduce((a, b) => (Number(a) < Number(b) ? a : b))\n : null;\n }\n case \"max\": {\n const values = getValues();\n return values.length > 0\n ? values.reduce((a, b) => (Number(a) > Number(b) ? a : b))\n : null;\n }\n case \"stddev\":\n case \"stddev_samp\": {\n const values = getValues().map(Number);\n if (values.length < 2) return null;\n const avg = values.reduce((a, b) => a + b, 0) / values.length;\n const variance =\n values.reduce((a, b) => a + (b - avg) ** 2, 0) / (values.length - 1);\n return Math.sqrt(variance);\n }\n case \"stddev_pop\": {\n const values = getValues().map(Number);\n if (values.length === 0) return null;\n const avg = values.reduce((a, b) => a + b, 0) / values.length;\n const variance = values.reduce((a, b) => a + (b - avg) ** 2, 0) / values.length;\n return Math.sqrt(variance);\n }\n case \"variance\":\n case \"var_samp\": {\n const values = getValues().map(Number);\n if (values.length < 2) return null;\n const avg = values.reduce((a, b) => a + b, 0) / values.length;\n return values.reduce((a, b) => a + (b - avg) ** 2, 0) / (values.length - 1);\n }\n case \"var_pop\": {\n const values = getValues().map(Number);\n if (values.length === 0) return null;\n const avg = values.reduce((a, b) => a + b, 0) / values.length;\n return values.reduce((a, b) => a + (b - avg) ** 2, 0) / values.length;\n }\n case \"corr\":\n case \"covar_pop\":\n case \"covar_samp\":\n case \"regr_slope\":\n case \"regr_intercept\":\n case \"regr_r2\":\n case \"regr_count\":\n case \"regr_avgx\":\n case \"regr_avgy\":\n case \"regr_sxx\":\n case \"regr_syy\":\n case \"regr_sxy\": {\n const pairs = getPairedValues();\n if (pairs.length === 0) return null;\n const n = pairs.length;\n const avgY = pairs.reduce((a, p) => a + p[0], 0) / n;\n const avgX = pairs.reduce((a, p) => a + p[1], 0) / n;\n let sxx = 0,\n syy = 0,\n sxy = 0;\n for (const [y, x] of pairs) {\n sxx += (x - avgX) ** 2;\n syy += (y - avgY) ** 2;\n sxy += (x - avgX) * (y - avgY);\n }\n switch (funcName) {\n case \"corr\":\n return sxx === 0 || syy === 0 ? null : sxy / Math.sqrt(sxx * syy);\n case \"covar_pop\":\n return sxy / n;\n case \"covar_samp\":\n return n < 2 ? null : sxy / (n - 1);\n case \"regr_slope\":\n return sxx === 0 ? null : sxy / sxx;\n case \"regr_intercept\":\n return sxx === 0 ? null : avgY - (sxy / sxx) * avgX;\n case \"regr_r2\":\n return sxx === 0 || syy === 0 ? null : (sxy * sxy) / (sxx * syy);\n case \"regr_count\":\n return n;\n case \"regr_avgx\":\n return avgX;\n case \"regr_avgy\":\n return avgY;\n case \"regr_sxx\":\n return sxx;\n case \"regr_syy\":\n return syy;\n case \"regr_sxy\":\n return sxy;\n default:\n return null;\n }\n }\n default:\n return null;\n }\n }\n\n // -- Window functions -----------------------------------------------\n\n private _hasWindowFunctions(targetList: Record<string, unknown>[]): boolean {\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const val = nodeGet(resTarget, \"val\");\n if (val !== null && val !== undefined) {\n if (isFuncCall(asObj(val)) && hasOverClause(asObj(val))) {\n return true;\n }\n }\n }\n return false;\n }\n\n private _applyWindowFunctions(\n rows: Record<string, unknown>[],\n targetList: Record<string, unknown>[],\n windowClause: Record<string, unknown>[],\n evaluator: ExprEvaluator,\n ): Record<string, unknown>[] {\n // Build named window lookup\n const namedWindows = new Map<string, Record<string, unknown>>();\n for (const wdef of windowClause) {\n const wObj = asObj(nodeGet(wdef, \"WindowDef\") ?? wdef);\n const wName = nodeStr(wObj, \"name\");\n if (wName) namedWindows.set(wName, wObj);\n }\n\n // Process each window function in the target list\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const val = nodeGet(resTarget, \"val\");\n const alias = nodeStr(resTarget, \"name\");\n\n if (val === null || val === undefined) continue;\n const valObj = asObj(val);\n if (!isFuncCall(valObj) || !hasOverClause(valObj)) continue;\n\n const funcName = getFuncName(valObj);\n const outputName = alias || funcName;\n const fc = asObj(nodeGet(valObj, \"FuncCall\") ?? valObj);\n const argNodes = getFuncArgs(valObj);\n const win = asObj(nodeGet(fc, \"over\"));\n\n // Resolve named window reference\n const refName = nodeStr(win, \"refname\") || nodeStr(win, \"name\");\n let resolvedWin = win;\n if (refName && namedWindows.has(refName)) {\n resolvedWin = namedWindows.get(refName)!;\n }\n\n // Partition columns\n const partCols: string[] = [];\n for (const p of asList(nodeGet(resolvedWin, \"partitionClause\"))) {\n try {\n partCols.push(extractColumnName(p));\n } catch {\n // expression in PARTITION BY -- evaluate and use result\n }\n }\n\n // Order keys\n const orderKeys: { col: string; desc: boolean }[] = [];\n for (const s of asList(nodeGet(resolvedWin, \"orderClause\"))) {\n const sortBy = asObj(nodeGet(s, \"SortBy\") ?? s);\n const sortNode = asObj(nodeGet(sortBy, \"node\"));\n try {\n const col = extractColumnName(sortNode);\n const sortByDir = nodeGet(sortBy, \"sortby_dir\");\n const desc = sortByDir === 2 || sortByDir === \"SORTBY_DESC\";\n orderKeys.push({ col, desc });\n } catch {\n // skip complex expressions\n }\n }\n\n // Partition the rows\n const partitions = new Map<\n string,\n { rows: Record<string, unknown>[]; indices: number[] }\n >();\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i]!;\n const key = partCols.map((c) => JSON.stringify(row[c])).join(\"\\0\");\n let part = partitions.get(key);\n if (!part) {\n part = { rows: [], indices: [] };\n partitions.set(key, part);\n }\n part.rows.push(row);\n part.indices.push(i);\n }\n\n // Sort within each partition\n for (const part of partitions.values()) {\n if (orderKeys.length > 0) {\n const indexed = part.rows.map((row, idx) => ({\n row,\n origIdx: part.indices[idx]!,\n }));\n indexed.sort((a, b) => {\n for (const ok of orderKeys) {\n const va = a.row[ok.col];\n const vb = b.row[ok.col];\n const aNull = va === null || va === undefined;\n const bNull = vb === null || vb === undefined;\n if (aNull && bNull) continue;\n if (aNull) return ok.desc ? -1 : 1;\n if (bNull) return ok.desc ? 1 : -1;\n let cmp: number;\n if (typeof va === \"string\" && typeof vb === \"string\") {\n cmp = va < vb ? -1 : va > vb ? 1 : 0;\n } else {\n cmp = (va as number) - (vb as number);\n }\n if (cmp !== 0) return ok.desc ? -cmp : cmp;\n }\n return 0;\n });\n part.rows = indexed.map((x) => x.row);\n part.indices = indexed.map((x) => x.origIdx);\n }\n }\n\n // Compute window function values\n for (const part of partitions.values()) {\n const partRows = part.rows;\n const partSize = partRows.length;\n\n for (let i = 0; i < partSize; i++) {\n let value: unknown = null;\n\n switch (funcName) {\n case \"row_number\":\n value = i + 1;\n break;\n\n case \"rank\": {\n // Same rank for same values, with gaps\n let rank = 1;\n for (let j = 0; j < i; j++) {\n let same = true;\n for (const ok of orderKeys) {\n if (partRows[j]![ok.col] !== partRows[i]![ok.col]) {\n same = false;\n break;\n }\n }\n if (!same) rank = j + 1 + 1;\n }\n // Recalculate: rank = number of rows with strictly smaller order values + 1\n rank = 1;\n for (let j = 0; j < i; j++) {\n let same = true;\n for (const ok of orderKeys) {\n if (partRows[j]![ok.col] !== partRows[i]![ok.col]) {\n same = false;\n break;\n }\n }\n if (!same) rank++;\n }\n // Standard rank: position of first occurrence\n rank = 1;\n for (let j = 0; j < partSize; j++) {\n let same = true;\n for (const ok of orderKeys) {\n if (partRows[j]![ok.col] !== partRows[i]![ok.col]) {\n same = false;\n break;\n }\n }\n if (same) {\n rank = j + 1;\n break;\n }\n }\n value = rank;\n break;\n }\n\n case \"dense_rank\": {\n const uniqueKeys = new Set<string>();\n for (let j = 0; j <= i; j++) {\n const key = orderKeys\n .map((ok) => JSON.stringify(partRows[j]![ok.col]))\n .join(\"\\0\");\n uniqueKeys.add(key);\n }\n value = uniqueKeys.size;\n break;\n }\n\n case \"percent_rank\": {\n if (partSize <= 1) {\n value = 0;\n } else {\n // rank - 1 / (partSize - 1)\n let rank = 1;\n for (let j = 0; j < partSize; j++) {\n let same = true;\n for (const ok of orderKeys) {\n if (partRows[j]![ok.col] !== partRows[i]![ok.col]) {\n same = false;\n break;\n }\n }\n if (same) {\n rank = j + 1;\n break;\n }\n }\n value = (rank - 1) / (partSize - 1);\n }\n break;\n }\n\n case \"cume_dist\": {\n // Count rows with order value <= current\n let count = 0;\n for (let j = 0; j < partSize; j++) {\n let leq = true;\n for (const ok of orderKeys) {\n const va = partRows[j]![ok.col];\n const vb = partRows[i]![ok.col];\n if (!ok.desc) {\n if ((va as number) > (vb as number)) leq = false;\n } else {\n if ((va as number) < (vb as number)) leq = false;\n }\n }\n if (leq) count++;\n }\n value = count / partSize;\n break;\n }\n\n case \"ntile\": {\n const buckets =\n argNodes.length > 0 ? Number(evaluator.evaluate(argNodes[0]!, {})) : 1;\n value = Math.floor((i * buckets) / partSize) + 1;\n break;\n }\n\n case \"lag\": {\n const offset =\n argNodes.length > 1 ? Number(evaluator.evaluate(argNodes[1]!, {})) : 1;\n const defaultVal =\n argNodes.length > 2 ? evaluator.evaluate(argNodes[2]!, {}) : null;\n const lagIdx = i - offset;\n if (lagIdx >= 0 && lagIdx < partSize && argNodes.length > 0) {\n value = evaluator.evaluate(argNodes[0]!, partRows[lagIdx]!);\n } else {\n value = defaultVal;\n }\n break;\n }\n\n case \"lead\": {\n const offset =\n argNodes.length > 1 ? Number(evaluator.evaluate(argNodes[1]!, {})) : 1;\n const defaultVal =\n argNodes.length > 2 ? evaluator.evaluate(argNodes[2]!, {}) : null;\n const leadIdx = i + offset;\n if (leadIdx >= 0 && leadIdx < partSize && argNodes.length > 0) {\n value = evaluator.evaluate(argNodes[0]!, partRows[leadIdx]!);\n } else {\n value = defaultVal;\n }\n break;\n }\n\n case \"first_value\": {\n if (argNodes.length > 0 && partSize > 0) {\n value = evaluator.evaluate(argNodes[0]!, partRows[0]!);\n }\n break;\n }\n\n case \"last_value\": {\n if (argNodes.length > 0 && partSize > 0) {\n value = evaluator.evaluate(argNodes[0]!, partRows[partSize - 1]!);\n }\n break;\n }\n\n case \"nth_value\": {\n const nth =\n argNodes.length > 1 ? Number(evaluator.evaluate(argNodes[1]!, {})) : 1;\n if (argNodes.length > 0 && nth >= 1 && nth <= partSize) {\n value = evaluator.evaluate(argNodes[0]!, partRows[nth - 1]!);\n }\n break;\n }\n\n // Aggregate window functions\n // When ORDER BY is present, default frame is ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW\n // When ORDER BY is absent, default frame is the whole partition\n case \"sum\": {\n let sum = 0;\n let hasVal = false;\n const frameEnd = orderKeys.length > 0 ? i : partSize - 1;\n for (let j = 0; j <= frameEnd; j++) {\n const v =\n argNodes.length > 0\n ? evaluator.evaluate(argNodes[0]!, partRows[j]!)\n : null;\n if (v !== null && v !== undefined) {\n sum += Number(v);\n hasVal = true;\n }\n }\n value = hasVal ? sum : null;\n break;\n }\n\n case \"count\": {\n const frameEnd = orderKeys.length > 0 ? i : partSize - 1;\n if (isAggStar(valObj)) {\n value = frameEnd + 1;\n } else {\n let count = 0;\n for (let j = 0; j <= frameEnd; j++) {\n const v =\n argNodes.length > 0\n ? evaluator.evaluate(argNodes[0]!, partRows[j]!)\n : null;\n if (v !== null && v !== undefined) count++;\n }\n value = count;\n }\n break;\n }\n\n case \"avg\": {\n let sum = 0;\n let count = 0;\n const frameEndAvg = orderKeys.length > 0 ? i : partSize - 1;\n for (let j = 0; j <= frameEndAvg; j++) {\n const v =\n argNodes.length > 0\n ? evaluator.evaluate(argNodes[0]!, partRows[j]!)\n : null;\n if (v !== null && v !== undefined) {\n sum += Number(v);\n count++;\n }\n }\n value = count > 0 ? sum / count : null;\n break;\n }\n\n case \"min\": {\n let minVal: unknown = null;\n const frameEndMin = orderKeys.length > 0 ? i : partSize - 1;\n for (let j = 0; j <= frameEndMin; j++) {\n const v =\n argNodes.length > 0\n ? evaluator.evaluate(argNodes[0]!, partRows[j]!)\n : null;\n if (v !== null && v !== undefined) {\n if (minVal === null || (v as number) < (minVal as number)) {\n minVal = v;\n }\n }\n }\n value = minVal;\n break;\n }\n\n case \"max\": {\n let maxVal: unknown = null;\n const frameEndMax = orderKeys.length > 0 ? i : partSize - 1;\n for (let j = 0; j <= frameEndMax; j++) {\n const v =\n argNodes.length > 0\n ? evaluator.evaluate(argNodes[0]!, partRows[j]!)\n : null;\n if (v !== null && v !== undefined) {\n if (maxVal === null || (v as number) > (maxVal as number)) {\n maxVal = v;\n }\n }\n }\n value = maxVal;\n break;\n }\n\n default:\n value = null;\n break;\n }\n\n // Write value back to the row in the original rows array\n const origIdx = part.indices[i]!;\n rows[origIdx]![outputName] = value;\n }\n }\n }\n\n // Also evaluate non-window targets\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const val = nodeGet(resTarget, \"val\");\n const alias = nodeStr(resTarget, \"name\");\n\n if (val === null || val === undefined) continue;\n const valObj = asObj(val);\n if (isFuncCall(valObj) && hasOverClause(valObj)) continue; // already handled\n\n const colName = alias || this._deriveColumnName(valObj);\n if (isColumnRef(valObj)) {\n // Simple column reference -- already in rows\n const srcCol = extractColumnName(valObj);\n if (srcCol !== colName) {\n for (const row of rows) {\n row[colName] = row[srcCol];\n }\n }\n } else {\n // Computed expression\n for (const row of rows) {\n row[colName] = evaluator.evaluate(valObj, row);\n }\n }\n }\n\n return rows;\n }\n\n // -- DISTINCT -------------------------------------------------------\n\n private _applyDistinct(\n rows: Record<string, unknown>[],\n columns: string[],\n ): Record<string, unknown>[] {\n const seen = new Set<string>();\n const result: Record<string, unknown>[] = [];\n for (const row of rows) {\n const key = columns.map((c) => JSON.stringify(row[c])).join(\"\\0\");\n if (!seen.has(key)) {\n seen.add(key);\n result.push(row);\n }\n }\n return result;\n }\n\n // -- ORDER BY -------------------------------------------------------\n\n private _applyOrderBy(\n rows: Record<string, unknown>[],\n sortClause: Record<string, unknown>[],\n evaluator: ExprEvaluator,\n targetList?: Record<string, unknown>[],\n ): Record<string, unknown>[] {\n const sorted = [...rows];\n\n // Build ordinal and alias maps for resolution\n const ordinalMap = new Map<number, string>();\n const aliasNames = new Set<string>();\n const originalToAlias = new Map<string, string>();\n if (targetList) {\n for (let idx = 0; idx < targetList.length; idx++) {\n const resTarget = asObj(\n nodeGet(targetList[idx]!, \"ResTarget\") ?? targetList[idx]!,\n );\n const alias = nodeStr(resTarget, \"name\");\n const val = nodeGet(resTarget, \"val\");\n let colName = alias;\n if (!colName && val !== null && val !== undefined) {\n colName = this._deriveColumnName(asObj(val));\n }\n if (colName) {\n ordinalMap.set(idx + 1, colName);\n if (alias) {\n aliasNames.add(alias);\n if (val !== null && isColumnRef(asObj(val))) {\n try {\n const realCol = extractColumnName(asObj(val));\n originalToAlias.set(realCol, alias);\n } catch {\n // skip\n }\n }\n }\n }\n }\n }\n\n const sortSpecs = sortClause.map((item) => {\n const sortBy = asObj(nodeGet(item, \"SortBy\") ?? item);\n const sortNode = asObj(nodeGet(sortBy, \"node\"));\n const sortByDir = nodeGet(sortBy, \"sortby_dir\");\n const desc = sortByDir === 2 || sortByDir === \"SORTBY_DESC\";\n const sortByNulls = nodeGet(sortBy, \"sortby_nulls\");\n let nullsFirst: boolean;\n if (sortByNulls === 1 || sortByNulls === \"SORTBY_NULLS_FIRST\") {\n nullsFirst = true;\n } else if (sortByNulls === 2 || sortByNulls === \"SORTBY_NULLS_LAST\") {\n nullsFirst = false;\n } else {\n // PostgreSQL default: NULLS FIRST for DESC, NULLS LAST for ASC\n nullsFirst = desc;\n }\n\n // Check for ordinal reference (ORDER BY 1, 2, ...)\n let resolvedNode = sortNode;\n if (isAConst(sortNode)) {\n const val = extractConstValue(sortNode, []);\n if (typeof val === \"number\" && Number.isInteger(val)) {\n const ordinal = val;\n const col = ordinalMap.get(ordinal);\n if (col !== undefined) {\n // Create a ColumnRef-like node for this column\n resolvedNode = { ColumnRef: { fields: [{ String: { sval: col } }] } };\n }\n }\n }\n\n // If the sort column references an original column that was aliased\n // (e.g., ORDER BY salary when SELECT salary AS top_sal), resolve to the alias\n if (isColumnRef(resolvedNode)) {\n try {\n const colName = extractColumnName(resolvedNode);\n if (originalToAlias.has(colName)) {\n const aliasName = originalToAlias.get(colName)!;\n resolvedNode = { ColumnRef: { fields: [{ String: { sval: aliasName } }] } };\n }\n } catch {\n // ignore extraction errors\n }\n }\n\n return { node: resolvedNode, desc, nullsFirst };\n });\n\n sorted.sort((a, b) => {\n for (const spec of sortSpecs) {\n const va = evaluator.evaluate(spec.node, a);\n const vb = evaluator.evaluate(spec.node, b);\n\n // Handle nulls\n const aNull = va === null || va === undefined;\n const bNull = vb === null || vb === undefined;\n if (aNull && bNull) continue;\n if (aNull) return spec.nullsFirst ? -1 : 1;\n if (bNull) return spec.nullsFirst ? 1 : -1;\n\n let cmp: number;\n if (typeof va === \"string\" && typeof vb === \"string\") {\n cmp = va < vb ? -1 : va > vb ? 1 : 0;\n } else {\n cmp = (va as number) - (vb as number);\n }\n\n if (cmp !== 0) {\n return spec.desc ? -cmp : cmp;\n }\n }\n return 0;\n });\n\n return sorted;\n }\n\n // -- RETURNING clause -----------------------------------------------\n\n private _evaluateReturning(\n returningCols: Record<string, unknown>[],\n row: Record<string, unknown>,\n evaluator: ExprEvaluator,\n table?: Table,\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const col of returningCols) {\n const resTarget = asObj(nodeGet(col, \"ResTarget\") ?? col);\n const val = nodeGet(resTarget, \"val\");\n const alias = nodeStr(resTarget, \"name\");\n\n if (val !== null && val !== undefined) {\n const valObj = asObj(val);\n // Check for *\n if (isAStar(valObj)) {\n if (table) {\n for (const colName of table.columnNames) {\n result[colName] = row[colName] ?? null;\n }\n } else {\n Object.assign(result, row);\n }\n continue;\n }\n\n const colName = alias || this._deriveColumnName(valObj);\n result[colName] = evaluator.evaluate(valObj, row);\n }\n }\n return result;\n }\n\n private _extractReturningColumns(\n returningCols: Record<string, unknown>[],\n table?: Table,\n ): string[] {\n const columns: string[] = [];\n for (const col of returningCols) {\n const resTarget = asObj(nodeGet(col, \"ResTarget\") ?? col);\n const val = nodeGet(resTarget, \"val\");\n const alias = nodeStr(resTarget, \"name\");\n\n if (val !== null && val !== undefined) {\n const valObj = asObj(val);\n if (isAStar(valObj)) {\n if (table) {\n columns.push(...table.columnNames);\n }\n continue;\n }\n columns.push(alias || this._deriveColumnName(valObj));\n }\n }\n return columns;\n }\n\n // ==================================================================\n // Operator-based WHERE compilation (UQA extension functions)\n // ==================================================================\n //\n // When UQA extension functions (text_match, knn_match, fuse_*, etc.)\n // appear in a WHERE clause, they are compiled into Operator trees\n // rather than evaluated row-at-a-time by ExprEvaluator. This yields\n // posting-list-based retrieval with proper scoring.\n //\n // For queries that do not use UQA functions, the existing row-at-a-time\n // WHERE evaluation in _compileSelectBody is used.\n // ==================================================================\n\n /**\n * Name of the current graph being queried (set from FROM-clause table).\n */\n private _currentGraphName = \"\";\n\n /**\n * Build an ExecutionContext for a given table (or null for no-table queries).\n */\n private _contextForTable(table: Table | null): ExecutionContext {\n if (table === null) {\n return {};\n }\n // Convert Map to Record for ExecutionContext compatibility\n const vecIndexes: Record<string, unknown> = {};\n for (const [k, v] of table.vectorIndexes) {\n vecIndexes[k] = v;\n }\n const spIndexes: Record<string, unknown> = {};\n for (const [k, v] of table.spatialIndexes) {\n spIndexes[k] = v;\n }\n return {\n documentStore: table.documentStore,\n invertedIndex: table.invertedIndex,\n vectorIndexes: vecIndexes as Record<string, never>,\n spatialIndexes: spIndexes as Record<string, never>,\n };\n }\n\n /**\n * Check if an AST subtree contains any UQA posting-list functions.\n */\n private static _containsUQAFunction(node: Record<string, unknown>): boolean {\n // FuncCall check\n if (isFuncCall(node)) {\n const name = getFuncName(node);\n if (UQA_WHERE_FUNCTIONS.has(name)) return true;\n }\n const inner = asObj(nodeGet(node, \"FuncCall\") ?? {});\n if (Object.keys(inner).length > 0) {\n const name = getFuncName(inner);\n if (UQA_WHERE_FUNCTIONS.has(name)) return true;\n }\n // A_Expr with @@ operator\n const aExpr = asObj(nodeGet(node, \"A_Expr\") ?? {});\n if (Object.keys(aExpr).length > 0) {\n const nameList = asList(nodeGet(aExpr, \"name\"));\n if (nameList.length > 0 && extractString(nameList[0]!) === \"@@\") return true;\n }\n // Recurse into child nodes\n for (const attr of [\"lexpr\", \"rexpr\", \"args\", \"arg\"]) {\n const child = nodeGet(node, attr) ?? nodeGet(aExpr, attr);\n if (child === null || child === undefined) continue;\n if (Array.isArray(child)) {\n for (const c of child as Record<string, unknown>[]) {\n if (SQLCompiler._containsUQAFunction(asObj(c))) {\n return true;\n }\n }\n } else if (typeof child === \"object\") {\n if (SQLCompiler._containsUQAFunction(asObj(child))) return true;\n }\n }\n // BoolExpr args\n const boolExpr = asObj(nodeGet(node, \"BoolExpr\") ?? {});\n if (Object.keys(boolExpr).length > 0) {\n const boolArgs = asList(nodeGet(boolExpr, \"args\"));\n for (const ba of boolArgs) {\n if (SQLCompiler._containsUQAFunction(ba)) return true;\n }\n }\n return false;\n }\n\n /**\n * Split a WHERE clause into UQA function conjuncts and scalar conjuncts.\n * Returns [uqaNode, scalarNode] where either can be null.\n */\n private _splitUQAConjuncts(\n whereNode: Record<string, unknown>,\n ): [Record<string, unknown> | null, Record<string, unknown> | null] {\n const conjuncts = this._extractAndConjuncts(whereNode);\n const uqa: Record<string, unknown>[] = [];\n const scalar: Record<string, unknown>[] = [];\n for (const conj of conjuncts) {\n if (SQLCompiler._containsUQAFunction(conj)) {\n uqa.push(conj);\n } else {\n scalar.push(conj);\n }\n }\n const uqaNode =\n uqa.length === 0\n ? null\n : uqa.length === 1\n ? uqa[0]!\n : { BoolExpr: { boolop: 0, args: uqa } };\n const scalarNode =\n scalar.length === 0\n ? null\n : scalar.length === 1\n ? scalar[0]!\n : { BoolExpr: { boolop: 0, args: scalar } };\n return [uqaNode, scalarNode];\n }\n\n /**\n * Extract AND conjuncts from a WHERE clause node.\n */\n private _extractAndConjuncts(\n node: Record<string, unknown>,\n ): Record<string, unknown>[] {\n const boolExpr = asObj(nodeGet(node, \"BoolExpr\") ?? {});\n if (Object.keys(boolExpr).length > 0) {\n const boolop = nodeGet(boolExpr, \"boolop\");\n // AND_EXPR = 0\n if (boolop === 0 || boolop === \"AND_EXPR\") {\n const args = asList(nodeGet(boolExpr, \"args\"));\n const result: Record<string, unknown>[] = [];\n for (const arg of args) {\n result.push(...this._extractAndConjuncts(arg));\n }\n return result;\n }\n }\n return [node];\n }\n\n /**\n * Compile a WHERE AST node into an Operator tree.\n * This handles UQA extension functions, boolean logic, comparisons,\n * null tests, and sublink (IN/EXISTS) predicates.\n */\n private _compileWhere(\n node: Record<string, unknown>,\n ctx: ExecutionContext,\n ): Operator {\n // BoolExpr\n const boolExpr = asObj(nodeGet(node, \"BoolExpr\") ?? {});\n if (Object.keys(boolExpr).length > 0) {\n return this._compileBoolExpr(boolExpr, ctx);\n }\n // A_Expr\n if (isAExpr(node)) {\n return this._compileComparison(asObj(nodeGet(node, \"A_Expr\") ?? node), ctx);\n }\n const innerAExpr = nodeGet(node, \"A_Expr\");\n if (innerAExpr !== null && innerAExpr !== undefined) {\n return this._compileComparison(asObj(innerAExpr), ctx);\n }\n // FuncCall\n if (isFuncCall(node)) {\n return this._compileFuncInWhere(asObj(nodeGet(node, \"FuncCall\") ?? node), ctx);\n }\n const innerFunc = nodeGet(node, \"FuncCall\");\n if (innerFunc !== null && innerFunc !== undefined) {\n return this._compileFuncInWhere(asObj(innerFunc), ctx);\n }\n // NullTest\n if (isNullTest(node)) {\n return this._compileNullTest(asObj(nodeGet(node, \"NullTest\") ?? node));\n }\n const innerNull = nodeGet(node, \"NullTest\");\n if (innerNull !== null && innerNull !== undefined) {\n return this._compileNullTest(asObj(innerNull));\n }\n // SubLink\n if (isSubLink(node)) {\n return this._compileSublinkInWhere(asObj(nodeGet(node, \"SubLink\") ?? node), ctx);\n }\n const innerSub = nodeGet(node, \"SubLink\");\n if (innerSub !== null && innerSub !== undefined) {\n return this._compileSublinkInWhere(asObj(innerSub), ctx);\n }\n // Fallback: expression-based filter\n return new ExprFilterOperator(node, (stmt: Record<string, unknown>) =>\n this._compileSelect(stmt, this._params),\n );\n }\n\n /**\n * Compile a BoolExpr (AND/OR/NOT) into operators.\n */\n private _compileBoolExpr(\n node: Record<string, unknown>,\n ctx: ExecutionContext,\n ): Operator {\n const boolop = nodeGet(node, \"boolop\");\n const args = asList(nodeGet(node, \"args\"));\n\n // AND_EXPR = 0\n if (boolop === 0 || boolop === \"AND_EXPR\") {\n return this._compileAnd(args, ctx);\n }\n // OR_EXPR = 1\n if (boolop === 1 || boolop === \"OR_EXPR\") {\n return new UnionOperator(args.map((a) => this._compileWhere(a, ctx)));\n }\n // NOT_EXPR = 2\n if (boolop === 2 || boolop === \"NOT_EXPR\") {\n return new ComplementOperator(this._compileWhere(args[0]!, ctx));\n }\n throw new Error(`Unsupported BoolExpr type: ${String(boolop)}`);\n }\n\n /**\n * Compile AND: chain filters on top of scored retrievals.\n */\n private _compileAnd(\n args: Record<string, unknown>[],\n ctx: ExecutionContext,\n ): Operator {\n const scored: Operator[] = [];\n const filters: FilterOperator[] = [];\n\n for (const arg of args) {\n const compiled = this._compileWhere(arg, ctx);\n if (compiled instanceof FilterOperator && compiled.source === null) {\n filters.push(compiled);\n } else {\n scored.push(compiled);\n }\n }\n\n let base: Operator;\n if (scored.length > 0) {\n base = scored.length === 1 ? scored[0]! : new IntersectOperator(scored);\n } else if (filters.length > 0) {\n base = filters.shift()!;\n } else {\n return new ScanOperator();\n }\n\n for (const f of filters) {\n base = new FilterOperator(f.field, f.predicate, base);\n }\n return base;\n }\n\n /**\n * Compile a comparison expression (A_Expr) into an operator.\n */\n private _compileComparison(\n node: Record<string, unknown>,\n _ctx: ExecutionContext,\n ): Operator {\n const kind = nodeGet(node, \"kind\") as number | string;\n const nameList = asList(nodeGet(node, \"name\"));\n const opName =\n nameList.length > 0 ? extractString(nameList[nameList.length - 1]!) : \"\";\n\n // AEXPR_OP = 0\n if (kind === 0 || kind === \"AEXPR_OP\") {\n // @@ operator for full-text search\n if (opName === \"@@\") {\n const lexpr = asObj(nodeGet(node, \"lexpr\"));\n const rexpr = asObj(nodeGet(node, \"rexpr\"));\n const fieldName = extractColumnName(lexpr);\n const queryString = extractStringValue(rexpr, this._params);\n const effectiveField = fieldName === \"_all\" ? null : fieldName;\n return this._makeTextSearchOp(effectiveField, queryString, _ctx, false);\n }\n // Simple column op constant\n const lexpr = asObj(nodeGet(node, \"lexpr\"));\n const rexpr = asObj(nodeGet(node, \"rexpr\"));\n if (\n isColumnRef(lexpr) &&\n (isAConst(rexpr) || isParamRef(rexpr)) &&\n [\"=\", \"!=\", \"<>\", \">\", \">=\", \"<\", \"<=\"].includes(opName)\n ) {\n const fieldName = extractColumnName(lexpr);\n const value = extractConstValue(rexpr, this._params);\n return new FilterOperator(fieldName, _opToPredicate(opName, value));\n }\n // Expression-based comparison\n return new ExprFilterOperator(\n node.kind !== undefined ? node : { A_Expr: node },\n (stmt: Record<string, unknown>) => this._compileSelect(stmt, this._params),\n );\n }\n\n // AEXPR_IN = 7\n if (kind === 7 || kind === \"AEXPR_IN\") {\n const lexpr = asObj(nodeGet(node, \"lexpr\"));\n const fieldName = extractColumnName(lexpr);\n const rexprList = asList(nodeGet(node, \"rexpr\"));\n const values = new Set<unknown>();\n for (const v of rexprList) {\n values.add(extractConstValue(v, this._params));\n }\n return new FilterOperator(fieldName, new InSet(values));\n }\n\n // AEXPR_BETWEEN = 11\n if (kind === 11 || kind === \"AEXPR_BETWEEN\") {\n const lexpr = asObj(nodeGet(node, \"lexpr\"));\n const fieldName = extractColumnName(lexpr);\n const rexprList = asList(nodeGet(node, \"rexpr\"));\n const low = Number(extractConstValue(rexprList[0]!, this._params));\n const high = Number(extractConstValue(rexprList[1]!, this._params));\n return new FilterOperator(fieldName, new Between(low, high));\n }\n\n // AEXPR_NOT_BETWEEN = 12\n if (kind === 12 || kind === \"AEXPR_NOT_BETWEEN\") {\n const lexpr = asObj(nodeGet(node, \"lexpr\"));\n const fieldName = extractColumnName(lexpr);\n const rexprList = asList(nodeGet(node, \"rexpr\"));\n const low = Number(extractConstValue(rexprList[0]!, this._params));\n const high = Number(extractConstValue(rexprList[1]!, this._params));\n return new ComplementOperator(\n new FilterOperator(fieldName, new Between(low, high)),\n );\n }\n\n // AEXPR_LIKE = 8\n if (kind === 8 || kind === \"AEXPR_LIKE\") {\n const lexpr = asObj(nodeGet(node, \"lexpr\"));\n const rexpr = asObj(nodeGet(node, \"rexpr\"));\n const fieldName = extractColumnName(lexpr);\n const pattern = extractStringValue(rexpr, this._params);\n if (opName === \"!~~\") {\n return new FilterOperator(fieldName, new NotLike(pattern));\n }\n return new FilterOperator(fieldName, new Like(pattern));\n }\n\n // AEXPR_ILIKE = 9\n if (kind === 9 || kind === \"AEXPR_ILIKE\") {\n const lexpr = asObj(nodeGet(node, \"lexpr\"));\n const rexpr = asObj(nodeGet(node, \"rexpr\"));\n const fieldName = extractColumnName(lexpr);\n const pattern = extractStringValue(rexpr, this._params);\n if (opName === \"!~~*\") {\n return new FilterOperator(fieldName, new NotILike(pattern));\n }\n return new FilterOperator(fieldName, new ILike(pattern));\n }\n\n throw new Error(`Unsupported expression kind: ${String(kind)}`);\n }\n\n /**\n * Compile a NullTest into a FilterOperator.\n */\n private _compileNullTest(node: Record<string, unknown>): Operator {\n const arg = asObj(nodeGet(node, \"arg\"));\n const fieldName = extractColumnName(arg);\n const nullTestType = nodeGet(node, \"nulltesttype\");\n // IS_NULL = 0, IS_NOT_NULL = 1\n if (nullTestType === 0 || nullTestType === \"IS_NULL\") {\n return new FilterOperator(fieldName, new IsNull());\n }\n return new FilterOperator(fieldName, new IsNotNull());\n }\n\n /**\n * Compile a SubLink (IN/EXISTS subquery) in WHERE position.\n */\n private _compileSublinkInWhere(\n node: Record<string, unknown>,\n _ctx: ExecutionContext,\n ): Operator {\n const linkType = nodeGet(node, \"subLinkType\") as number | string;\n const subselect = asObj(nodeGet(node, \"subselect\"));\n const selectStmt = asObj(nodeGet(subselect, \"SelectStmt\") ?? subselect);\n\n // ANY_SUBLINK = 2 (IN subquery)\n if (linkType === 2 || linkType === \"ANY_SUBLINK\") {\n const innerResult = this._compileSelect(selectStmt, this._params);\n if (innerResult.columns.length === 0) {\n throw new Error(\"Subquery must return at least one column\");\n }\n const subCol = innerResult.columns[0]!;\n const values = new Set<unknown>();\n for (const row of innerResult.rows) {\n const v = row[subCol];\n if (v !== null && v !== undefined) values.add(v);\n }\n const testExpr = asObj(nodeGet(node, \"testexpr\"));\n const fieldName = extractColumnName(testExpr);\n return new FilterOperator(fieldName, new InSet(values));\n }\n\n // EXISTS_SUBLINK = 0\n if (linkType === 0 || linkType === \"EXISTS_SUBLINK\") {\n const innerResult = this._compileSelect(selectStmt, this._params);\n if (innerResult.rows.length > 0) {\n return new ScanOperator();\n }\n return new ComplementOperator(new ScanOperator());\n }\n\n throw new Error(`Unsupported subquery type: ${String(linkType)}`);\n }\n\n /**\n * Compile a function call in WHERE position into the appropriate operator.\n */\n private _compileFuncInWhere(\n node: Record<string, unknown>,\n ctx: ExecutionContext,\n ): Operator {\n const name = getFuncName(node).toLowerCase();\n const args = getFuncArgs(node);\n\n if (name === \"text_match\") {\n const fieldName = extractColumnName(args[0]!);\n const query = extractStringValue(args[1]!, this._params);\n return this._makeTextSearchOp(fieldName, query, ctx, false);\n }\n if (name === \"bayesian_match\") {\n const fieldName = extractColumnName(args[0]!);\n const query = extractStringValue(args[1]!, this._params);\n return this._makeTextSearchOp(fieldName, query, ctx, true);\n }\n if (name === \"bayesian_match_with_prior\") {\n return this._makeBayesianWithPriorOp(args, ctx);\n }\n if (name === \"knn_match\") {\n return this._makeKnnOp(args);\n }\n if (name === \"bayesian_knn_match\") {\n return this._makeCalibratedKnnOp(args, ctx, true);\n }\n if (name === \"traverse_match\") {\n return this._makeTraverseMatchOp(args);\n }\n if (name === \"temporal_traverse\") {\n return this._makeTemporalTraverseOp(args);\n }\n if (name === \"path_filter\") {\n return this._makePathFilterOp(args);\n }\n if (name === \"vector_exclude\") {\n return this._makeVectorExcludeOp(args);\n }\n if (name === \"spatial_within\") {\n return this._makeSpatialWithinOp(args);\n }\n if (name === \"fuse_log_odds\") {\n return this._makeFusionOp(args, ctx, \"log_odds\");\n }\n if (name === \"fuse_prob_and\") {\n return this._makeFusionOp(args, ctx, \"prob_and\");\n }\n if (name === \"fuse_prob_or\") {\n return this._makeFusionOp(args, ctx, \"prob_or\");\n }\n if (name === \"fuse_prob_not\") {\n return this._makeProbNotOp(args, ctx);\n }\n if (name === \"fuse_attention\") {\n return this._makeAttentionFusionOp(args, ctx);\n }\n if (name === \"fuse_multihead\") {\n return this._makeMultiheadFusionOp(args, ctx);\n }\n if (name === \"fuse_learned\") {\n return this._makeLearnedFusionOp(args, ctx);\n }\n if (name === \"sparse_threshold\") {\n return this._makeSparseThresholdOp(args, ctx);\n }\n if (name === \"multi_field_match\") {\n return this._makeMultiFieldMatchOp(args);\n }\n if (name === \"message_passing\") {\n return this._makeMessagePassingOp(args);\n }\n if (name === \"graph_embedding\") {\n return this._makeGraphEmbeddingOp(args);\n }\n if (name === \"staged_retrieval\") {\n return this._makeStagedRetrievalOp(args, ctx);\n }\n if (name === \"pagerank\") {\n return this._makePageRankOp(args);\n }\n if (name === \"hits\") {\n return this._makeHITSOp(args);\n }\n if (name === \"betweenness\") {\n return this._makeBetweennessOp(args);\n }\n if (name === \"weighted_rpq\") {\n return this._makeWeightedRpqOp(args);\n }\n if (name === \"progressive_fusion\") {\n return this._makeProgressiveFusionOp(args, ctx);\n }\n if (name === \"deep_fusion\") {\n return this._makeDeepFusionOp(args, ctx);\n }\n // Fallback: expression-based filter for scalar functions\n return new ExprFilterOperator(node, (stmt: Record<string, unknown>) =>\n this._compileSelect(stmt, this._params),\n );\n }\n\n /**\n * Compile a signal function into an operator that produces calibrated\n * probabilities in (0, 1). Used by fusion operators.\n */\n private _compileCalibratedSignal(\n node: Record<string, unknown>,\n ctx: ExecutionContext,\n ): Operator {\n const fc = asObj(nodeGet(node, \"FuncCall\") ?? node);\n const name = getFuncName(fc).toLowerCase();\n const args = getFuncArgs(fc);\n\n if (name === \"text_match\" || name === \"bayesian_match\") {\n const fieldName = extractColumnName(args[0]!);\n const query = extractStringValue(args[1]!, this._params);\n return this._makeTextSearchOp(fieldName, query, ctx, true);\n }\n if (name === \"knn_match\") {\n return this._makeCalibratedKnnOp(args, ctx, false);\n }\n if (name === \"bayesian_knn_match\") {\n return this._makeCalibratedKnnOp(args, ctx, true);\n }\n if (name === \"traverse_match\") {\n return this._makeTraverseMatchOp(args);\n }\n if (name === \"spatial_within\") {\n return this._makeSpatialWithinOp(args);\n }\n if (name === \"pagerank\") {\n return this._makePageRankOp(args);\n }\n if (name === \"hits\") {\n return this._makeHITSOp(args);\n }\n if (name === \"betweenness\") {\n return this._makeBetweennessOp(args);\n }\n if (name === \"weighted_rpq\") {\n return this._makeWeightedRpqOp(args);\n }\n if (name === \"message_passing\") {\n return this._makeMessagePassingOp(args);\n }\n throw new Error(\n `Unknown signal function for fusion: ${name}. ` +\n `Use text_match, bayesian_match, knn_match, bayesian_knn_match, ` +\n `traverse_match, spatial_within, pagerank, hits, betweenness, or weighted_rpq.`,\n );\n }\n\n // ==================================================================\n // UQA operator builders\n // ==================================================================\n\n /**\n * Build a text search operator (TermOperator + scorer).\n * When bayesian=true, uses BayesianBM25Scorer; otherwise BM25Scorer.\n */\n private _makeTextSearchOp(\n fieldName: string | null,\n query: string,\n ctx: ExecutionContext,\n bayesian: boolean,\n ): Operator {\n const idx = ctx.invertedIndex;\n let terms: string[] = [];\n if (idx) {\n const idxAny = idx as unknown as Record<string, unknown>;\n const analyzer =\n fieldName && typeof idxAny[\"getSearchAnalyzer\"] === \"function\"\n ? (\n idx as unknown as {\n getSearchAnalyzer(f: string): { analyze(q: string): string[] };\n }\n ).getSearchAnalyzer(fieldName)\n : (idx as unknown as { analyzer: { analyze(q: string): string[] } }).analyzer;\n terms = analyzer.analyze(query);\n }\n const retrieval = new TermOperator(query, fieldName ?? undefined);\n\n if (bayesian) {\n // BayesianBM25 scoring\n try {\n const stats = idx ? (idx as unknown as { stats: unknown }).stats : null;\n if (stats) {\n const scorer = new BayesianBM25Scorer(\n createBayesianBM25Params(),\n stats as IndexStats,\n );\n return new ScoreOperator(\n scorer as never,\n retrieval,\n terms,\n fieldName ?? undefined,\n );\n }\n } catch {\n // BayesianBM25 not available, fall back to BM25\n }\n }\n\n // BM25 scoring\n try {\n const stats = idx ? (idx as unknown as { stats: unknown }).stats : null;\n if (stats) {\n const scorer = new BM25Scorer(createBM25Params(), stats as IndexStats);\n return new ScoreOperator(\n scorer as never,\n retrieval,\n terms,\n fieldName ?? undefined,\n );\n }\n } catch {\n // BM25 not available\n }\n\n return retrieval;\n }\n\n /**\n * multi_field_match(field1, field2, ..., query [, weight1, weight2, ...])\n */\n private _makeMultiFieldMatchOp(args: Record<string, unknown>[]): Operator {\n if (args.length < 3) {\n throw new Error(\n \"multi_field_match() requires at least 3 arguments: \" +\n \"multi_field_match(field1, field2, ..., query)\",\n );\n }\n\n const fields: string[] = [];\n let query: string | null = null;\n const weights: number[] = [];\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (isColumnRef(arg) || nodeGet(arg, \"ColumnRef\") !== null) {\n fields.push(extractColumnName(arg));\n } else {\n const val = extractConstValue(arg, this._params);\n if (typeof val === \"string\" && query === null) {\n query = val;\n } else if (typeof val === \"number\") {\n weights.push(val);\n } else if (typeof val === \"string\") {\n throw new Error(`Unexpected string argument at position ${String(i)}`);\n }\n }\n }\n\n if (query === null || fields.length < 2) {\n throw new Error(\n \"multi_field_match() requires at least 2 field names and a query string\",\n );\n }\n\n if (weights.length > 0 && weights.length !== fields.length) {\n throw new Error(\n `Number of weights (${String(weights.length)}) must match ` +\n `number of fields (${String(fields.length)})`,\n );\n }\n\n return new MultiFieldSearchOperator(\n fields,\n query,\n weights.length > 0 ? weights : undefined,\n );\n }\n\n /**\n * message_passing(k_layers, aggregation, property_name)\n */\n private _makeMessagePassingOp(args: Record<string, unknown>[]): Operator {\n const k = args.length > 0 ? extractIntValue(args[0]!, this._params) : 2;\n const agg = args.length > 1 ? extractStringValue(args[1]!, this._params) : \"mean\";\n const prop =\n args.length > 2 ? extractStringValue(args[2]!, this._params) : undefined;\n return new MessagePassingOperator({\n kLayers: k,\n aggregation: agg as \"mean\" | \"sum\" | \"max\",\n propertyName: prop,\n graph: this._currentGraphName || \"\",\n });\n }\n\n /**\n * graph_embedding(dimensions, k_layers)\n */\n private _makeGraphEmbeddingOp(args: Record<string, unknown>[]): Operator {\n const k = args.length > 1 ? extractIntValue(args[1]!, this._params) : 2;\n return new GraphEmbeddingOperator({\n graph: this._currentGraphName || \"\",\n kHops: k,\n });\n }\n\n /**\n * bayesian_match_with_prior(field, query, prior_field, prior_mode)\n */\n private _makeBayesianWithPriorOp(\n args: Record<string, unknown>[],\n ctx: ExecutionContext,\n ): Operator {\n if (args.length < 4) {\n throw new Error(\n \"bayesian_match_with_prior() requires 4 arguments: \" +\n \"bayesian_match_with_prior(field, query, prior_field, prior_mode)\",\n );\n }\n const fieldName = extractColumnName(args[0]!);\n const query = extractStringValue(args[1]!, this._params);\n const priorField = extractStringValue(args[2]!, this._params);\n const priorMode = extractStringValue(args[3]!, this._params);\n\n if (priorMode !== \"recency\" && priorMode !== \"authority\") {\n throw new Error(\n `Unknown prior mode: ${priorMode}. Use 'recency' or 'authority'.`,\n );\n }\n\n // Build prior function\n let priorFn: (doc: Record<string, unknown>) => number;\n if (priorMode === \"recency\") {\n try {\n priorFn = recencyPrior(priorField);\n } catch {\n priorFn = (_doc: Record<string, unknown>) => 0.5;\n }\n } else {\n try {\n priorFn = authorityPrior(priorField);\n } catch {\n priorFn = (_doc: Record<string, unknown>) => 0.5;\n }\n }\n\n const idx = ctx.invertedIndex;\n let terms: string[] = [];\n if (idx) {\n const analyzer = (\n idx as unknown as { analyzer: { analyze(q: string): string[] } }\n ).analyzer;\n terms = analyzer.analyze(query);\n }\n const retrieval = new TermOperator(query, fieldName);\n\n // Build ExternalPriorSearchOperator\n try {\n const stats = idx ? (idx as unknown as { stats: unknown }).stats : null;\n if (stats) {\n const scorer = new ExternalPriorScorer(\n createBayesianBM25Params(),\n stats as IndexStats,\n priorFn,\n );\n return new ExternalPriorSearchOperator(\n retrieval,\n scorer as never,\n terms,\n fieldName,\n ctx.documentStore ?? null,\n );\n }\n } catch {\n // ExternalPriorScorer not available\n }\n\n return retrieval;\n }\n\n /**\n * knn_match(field, vector, k)\n */\n private _makeKnnOp(args: Record<string, unknown>[]): Operator {\n if (args.length !== 3) {\n throw new Error(\"knn_match() requires 3 arguments: knn_match(field, vector, k)\");\n }\n const fieldName = extractColumnName(args[0]!);\n const queryVector = extractVectorArg(args[1]!, this._params);\n const k = extractIntValue(args[2]!, this._params);\n return new KNNOperator(queryVector, k, fieldName);\n }\n\n /**\n * KNN search with calibrated probability scores.\n * When force_calibrated is true or IVF background stats are available,\n * uses CalibratedVectorOperator; otherwise falls back to\n * CalibratedKNNOperator (linear rescaling P = (1 + cos) / 2).\n */\n private _makeCalibratedKnnOp(\n args: Record<string, unknown>[],\n ctx: ExecutionContext,\n forceCal: boolean,\n ): Operator {\n // Separate positional args from named options\n const positional: Record<string, unknown>[] = [];\n const options: Record<string, unknown> = {};\n for (const arg of args) {\n const namedArg = nodeGet(arg, \"NamedArgExpr\");\n if (namedArg !== null && namedArg !== undefined) {\n const nObj = asObj(namedArg);\n const argName = nodeStr(nObj, \"name\");\n const argVal = asObj(nodeGet(nObj, \"arg\"));\n options[argName] = extractConstValue(argVal, this._params);\n } else {\n positional.push(arg);\n }\n }\n\n if (positional.length !== 3) {\n throw new Error(\n \"knn_match() requires 3 positional arguments: knn_match(field, vector, k)\",\n );\n }\n const fieldName = extractColumnName(positional[0]!);\n const queryVector = extractVectorArg(positional[1]!, this._params);\n const k = extractIntValue(positional[2]!, this._params);\n\n // Check for IVF background stats\n const vecIdx = ctx.vectorIndexes?.[fieldName];\n const vecIdxAny = vecIdx as unknown as Record<string, unknown> | null;\n const hasBg =\n vecIdxAny !== null &&\n typeof vecIdxAny === \"object\" &&\n \"backgroundStats\" in vecIdxAny &&\n vecIdxAny[\"backgroundStats\"] !== null;\n\n if (hasBg || forceCal || Object.keys(options).length > 0) {\n const validOptions = new Set([\n \"method\",\n \"weight_source\",\n \"bm25_query\",\n \"bm25_field\",\n \"base_rate\",\n \"bandwidth_scale\",\n \"density_gamma\",\n ]);\n const unknown = Object.keys(options).filter((k) => !validOptions.has(k));\n if (unknown.length > 0) {\n throw new Error(\n `Unknown option(s) for bayesian_knn_match: ${unknown.join(\", \")}. ` +\n `Valid options: ${[...validOptions].sort().join(\", \")}`,\n );\n }\n return new CalibratedVectorOperator(\n queryVector,\n k,\n fieldName,\n (options[\"method\"] as string | undefined) ?? \"kde\",\n Number(options[\"base_rate\"] ?? 0.5),\n (options[\"weight_source\"] as string | undefined) ?? \"density_prior\",\n options[\"bm25_query\"] != null\n ? String(options[\"bm25_query\"] as string | number)\n : undefined,\n options[\"bm25_field\"] != null\n ? String(options[\"bm25_field\"] as string | number)\n : undefined,\n Number(options[\"density_gamma\"] ?? 1.0),\n Number(options[\"bandwidth_scale\"] ?? 1.0),\n );\n }\n // Fallback: linear calibration P = (1 + cos) / 2\n return new CalibratedKNNOperator(queryVector, k, fieldName);\n }\n\n /**\n * spatial_within(field, POINT(x, y), distance)\n */\n private _makeSpatialWithinOp(args: Record<string, unknown>[]): Operator {\n if (args.length !== 3) {\n throw new Error(\n \"spatial_within() requires 3 arguments: \" +\n \"spatial_within(field, POINT(x, y), distance)\",\n );\n }\n const fieldName = extractColumnName(args[0]!);\n const [cx, cy] = this._extractPointArg(args[1]!);\n const distance = Number(extractConstValue(args[2]!, this._params));\n return new SpatialWithinOperator(fieldName, cx, cy, distance);\n }\n\n /**\n * Extract (x, y) from a POINT(x, y) FuncCall or $N parameter.\n */\n private _extractPointArg(node: Record<string, unknown>): [number, number] {\n const fc = asObj(nodeGet(node, \"FuncCall\") ?? {});\n if (Object.keys(fc).length > 0) {\n const ptName = getFuncName(fc);\n if (ptName !== \"point\") {\n throw new Error(`Expected POINT(x, y), got ${ptName}()`);\n }\n const ptArgs = getFuncArgs(fc);\n if (ptArgs.length !== 2) {\n throw new Error(\"POINT() requires exactly 2 arguments\");\n }\n const x = Number(extractConstValue(ptArgs[0]!, this._params));\n const y = Number(extractConstValue(ptArgs[1]!, this._params));\n return [x, y];\n }\n if (isParamRef(node)) {\n const val = extractConstValue(node, this._params);\n if (Array.isArray(val) && val.length === 2) {\n return [Number(val[0]), Number(val[1])];\n }\n throw new Error(\"Parameter for POINT must be a [x, y] array\");\n }\n throw new Error(\"Expected POINT(x, y) or $N parameter\");\n }\n\n /**\n * traverse_match(start_id, 'label', max_hops) as WHERE signal.\n */\n private _makeTraverseMatchOp(args: Record<string, unknown>[]): Operator {\n const start = extractIntValue(args[0]!, this._params);\n const label =\n args.length > 1 ? extractStringValue(args[1]!, this._params) : undefined;\n const maxHops = args.length > 2 ? extractIntValue(args[2]!, this._params) : 1;\n return new TraverseOperator(\n start,\n this._currentGraphName || \"\",\n label ?? null,\n maxHops,\n );\n }\n\n /**\n * temporal_traverse(start, label, hops, timestamp) or\n * temporal_traverse(start, label, hops, from_ts, to_ts)\n */\n private _makeTemporalTraverseOp(args: Record<string, unknown>[]): Operator {\n if (args.length < 4) {\n throw new Error(\n \"temporal_traverse() requires at least 4 arguments: \" +\n \"temporal_traverse(start, label, hops, timestamp)\",\n );\n }\n const start = extractIntValue(args[0]!, this._params);\n const label =\n args.length > 1 ? extractStringValue(args[1]!, this._params) : undefined;\n const maxHops = args.length > 2 ? extractIntValue(args[2]!, this._params) : 1;\n\n let tf: TemporalFilter;\n if (args.length === 4) {\n const ts = Number(extractConstValue(args[3]!, this._params));\n tf = new TemporalFilter({ timestamp: ts });\n } else if (args.length >= 5) {\n const fromTs = Number(extractConstValue(args[3]!, this._params));\n const toTs = Number(extractConstValue(args[4]!, this._params));\n tf = new TemporalFilter({ timeRange: [fromTs, toTs] });\n } else {\n tf = new TemporalFilter();\n }\n\n return new TemporalTraverseOperator({\n startVertex: start,\n graph: this._currentGraphName || \"\",\n temporalFilter: tf,\n label: label ?? null,\n maxHops,\n });\n }\n\n /**\n * path_filter('path', value) or path_filter('path', 'op', value)\n */\n private _makePathFilterOp(args: Record<string, unknown>[]): Operator {\n if (args.length < 2) {\n throw new Error(\n \"path_filter() requires at least 2 arguments: \" +\n \"path_filter('path', value) or path_filter('path', 'op', value)\",\n );\n }\n\n const pathStr = extractStringValue(args[0]!, this._params);\n const pathExpr: (string | number)[] = [];\n for (const component of pathStr.split(\".\")) {\n if (/^\\d+$/.test(component)) {\n pathExpr.push(parseInt(component, 10));\n } else {\n pathExpr.push(component);\n }\n }\n\n if (args.length === 2) {\n const value = extractConstValue(args[1]!, this._params);\n return new PathFilterOperator(pathExpr, new Equals(value));\n }\n\n const opStr = extractStringValue(args[1]!, this._params);\n const value = extractConstValue(args[2]!, this._params);\n return new PathFilterOperator(pathExpr, _opToPredicate(opStr, value));\n }\n\n /**\n * vector_exclude(field, positive_vector, negative_vector, k, threshold)\n */\n private _makeVectorExcludeOp(args: Record<string, unknown>[]): Operator {\n if (args.length !== 5) {\n throw new Error(\n \"vector_exclude() requires 5 arguments: \" +\n \"vector_exclude(field, positive_vector, negative_vector, k, threshold)\",\n );\n }\n const fieldName = extractColumnName(args[0]!);\n const positiveVector = extractVectorArg(args[1]!, this._params);\n const negativeVector = extractVectorArg(args[2]!, this._params);\n const k = extractIntValue(args[3]!, this._params);\n const threshold = Number(extractConstValue(args[4]!, this._params));\n\n const positive = new KNNOperator(positiveVector, k, fieldName);\n return new VectorExclusionOperator(positive, negativeVector, threshold, fieldName);\n }\n\n /**\n * fuse_prob_not(signal) -- probabilistic complement.\n */\n private _makeProbNotOp(\n args: Record<string, unknown>[],\n ctx: ExecutionContext,\n ): Operator {\n if (args.length !== 1) {\n throw new Error(\"fuse_prob_not() requires exactly 1 signal function argument\");\n }\n const signal = this._compileCalibratedSignal(args[0]!, ctx);\n return new ProbNotOperator(signal);\n }\n\n /**\n * sparse_threshold(signal, threshold)\n */\n private _makeSparseThresholdOp(\n args: Record<string, unknown>[],\n ctx: ExecutionContext,\n ): Operator {\n if (args.length !== 2) {\n throw new Error(\n \"sparse_threshold() requires 2 arguments: \" +\n \"sparse_threshold(signal, threshold)\",\n );\n }\n const signal = this._compileCalibratedSignal(args[0]!, ctx);\n const threshold = Number(extractConstValue(args[1]!, this._params));\n return new SparseThresholdOperator(signal, threshold);\n }\n\n /**\n * Build a fusion operator from nested function calls.\n * fuse_log_odds(signal1, signal2, ...[, alpha[, 'gating']])\n * fuse_prob_and(signal1, signal2, ...)\n * fuse_prob_or(signal1, signal2, ...)\n */\n private _makeFusionOp(\n args: Record<string, unknown>[],\n ctx: ExecutionContext,\n mode: string,\n ): Operator {\n const signals: Operator[] = [];\n let alpha = 0.5;\n let gating: string | null = null;\n let gatingBeta: number | null = null;\n\n for (const arg of args) {\n if (isFuncCall(arg) || nodeGet(arg, \"FuncCall\") !== null) {\n signals.push(this._compileCalibratedSignal(arg, ctx));\n } else {\n const namedArg = nodeGet(arg, \"NamedArgExpr\");\n if (namedArg !== null && namedArg !== undefined && mode === \"log_odds\") {\n const nObj = asObj(namedArg);\n const argName = nodeStr(nObj, \"name\");\n const val = extractConstValue(asObj(nodeGet(nObj, \"arg\")), this._params);\n if (argName === \"alpha\") {\n alpha = Number(val);\n } else if (argName === \"gating\") {\n gating = String(val);\n } else if (argName === \"gating_beta\") {\n gatingBeta = Number(val);\n } else {\n throw new Error(\n `Unknown option for fuse_log_odds: ${argName}. ` +\n `Valid options: alpha, gating, gating_beta`,\n );\n }\n } else if (isAConst(arg) && mode === \"log_odds\") {\n const val = extractConstValue(arg, this._params);\n if (typeof val === \"string\") {\n gating = val;\n } else {\n alpha = Number(val);\n }\n } else {\n throw new Error(\n \"Fusion function arguments must be signal functions \" +\n \"(text_match, knn_match, etc.)\",\n );\n }\n }\n }\n\n if (signals.length < 2) {\n throw new Error(\"Fusion requires at least 2 signal functions\");\n }\n\n if (mode === \"log_odds\") {\n return new LogOddsFusionOperator(signals, alpha, null, gating, gatingBeta);\n }\n if (mode === \"prob_and\") {\n return new ProbBoolFusionOperator(signals, \"and\");\n }\n return new ProbBoolFusionOperator(signals, \"or\");\n }\n\n /**\n * staged_retrieval(signal1, k1, signal2, k2, ...)\n */\n private _makeStagedRetrievalOp(\n args: Record<string, unknown>[],\n ctx: ExecutionContext,\n ): Operator {\n const stages: [Operator, number][] = [];\n let i = 0;\n while (i < args.length - 1) {\n if (!isFuncCall(args[i]!) && nodeGet(args[i]!, \"FuncCall\") === null) {\n throw new Error(\n `staged_retrieval: argument ${String(i)} must be a signal function`,\n );\n }\n const signal = this._compileCalibratedSignal(args[i]!, ctx);\n let cutoffVal = extractConstValue(args[i + 1]!, this._params) as number;\n if (typeof cutoffVal === \"number\" && cutoffVal === Math.floor(cutoffVal)) {\n cutoffVal = Math.floor(cutoffVal);\n }\n stages.push([signal, cutoffVal]);\n i += 2;\n }\n\n if (stages.length === 0) {\n throw new Error(\"staged_retrieval requires at least one (signal, cutoff) pair\");\n }\n\n return new MultiStageOperator(stages);\n }\n\n /**\n * Split centrality args into numeric args and graph name.\n */\n private _splitCentralityArgs(\n args: Record<string, unknown>[],\n ): [Record<string, unknown>[], string] {\n const numeric: Record<string, unknown>[] = [];\n let graphName = this._currentGraphName;\n for (const a of args) {\n try {\n const val = extractConstValue(a, this._params);\n if (typeof val === \"string\") {\n graphName = val;\n continue;\n }\n } catch {\n // Not a constant\n }\n numeric.push(a);\n }\n return [numeric, graphName];\n }\n\n /**\n * pagerank([damping[, max_iter[, tolerance]]][, 'graph'])\n */\n private _makePageRankOp(args: Record<string, unknown>[]): Operator {\n const [numericArgs, graphName] = this._splitCentralityArgs(args);\n const damping =\n numericArgs.length > 0\n ? Number(extractConstValue(numericArgs[0]!, this._params))\n : 0.85;\n const maxIter =\n numericArgs.length > 1 ? extractIntValue(numericArgs[1]!, this._params) : 100;\n const tol =\n numericArgs.length > 2\n ? Number(extractConstValue(numericArgs[2]!, this._params))\n : 1e-6;\n return new PageRankOperator({\n damping,\n maxIterations: maxIter,\n tolerance: tol,\n graph: graphName || \"\",\n });\n }\n\n /**\n * hits([max_iter[, tolerance]][, 'graph'])\n */\n private _makeHITSOp(args: Record<string, unknown>[]): Operator {\n const [numericArgs, graphName] = this._splitCentralityArgs(args);\n const maxIter =\n numericArgs.length > 0 ? extractIntValue(numericArgs[0]!, this._params) : 100;\n const tol =\n numericArgs.length > 1\n ? Number(extractConstValue(numericArgs[1]!, this._params))\n : 1e-6;\n return new HITSOperator({\n maxIterations: maxIter,\n tolerance: tol,\n graph: graphName || \"\",\n });\n }\n\n /**\n * betweenness(['graph'])\n */\n private _makeBetweennessOp(args: Record<string, unknown>[]): Operator {\n const [, graphName] = this._splitCentralityArgs(args);\n return new BetweennessCentralityOperator({\n graph: graphName || \"\",\n });\n }\n\n /**\n * weighted_rpq('path_expr', start, 'weight_prop'[, 'agg_fn'[, threshold]])\n */\n private _makeWeightedRpqOp(args: Record<string, unknown>[]): Operator {\n if (args.length < 3) {\n throw new Error(\n \"weighted_rpq() requires at least 3 arguments: \" +\n \"weighted_rpq('path_expr', start, 'weight_property'\" +\n \"[, 'agg_fn'[, threshold]])\",\n );\n }\n const exprStr = extractStringValue(args[0]!, this._params);\n const start = extractIntValue(args[1]!, this._params);\n const weightProp = extractStringValue(args[2]!, this._params);\n const aggFn = args.length > 3 ? extractStringValue(args[3]!, this._params) : \"sum\";\n let weightThreshold: number | null = null;\n if (args.length > 4) {\n weightThreshold = Number(extractConstValue(args[4]!, this._params));\n }\n\n // Try to import WeightedPathQueryOperator; if not available, fall back\n // to a basic approach with the existing graph operators.\n try {\n return new WeightedPathQueryOperator(\n parseRpq(exprStr),\n this._currentGraphName || \"\",\n {\n startVertex: start,\n weightProperty: weightProp,\n aggregation: aggFn as \"sum\" | \"min\" | \"max\" | \"product\",\n weightThreshold,\n },\n );\n } catch {\n // WeightedPathQueryOperator not available -- fall through to error\n throw new Error(\"weighted_rpq() requires the WeightedPathQueryOperator\");\n }\n }\n\n /**\n * progressive_fusion(sig1, sig2, k1, sig3, k2[, alpha][, 'gating'])\n */\n private _makeProgressiveFusionOp(\n args: Record<string, unknown>[],\n ctx: ExecutionContext,\n ): Operator {\n const signals: Operator[] = [];\n const stages: [Operator[], number][] = [];\n let alpha = 0.5;\n let gating: string | null = null;\n\n for (const arg of args) {\n if (isFuncCall(arg) || nodeGet(arg, \"FuncCall\") !== null) {\n signals.push(this._compileCalibratedSignal(arg, ctx));\n } else if (isAConst(arg) || isParamRef(arg)) {\n const val = extractConstValue(arg, this._params);\n if (typeof val === \"string\") {\n gating = val;\n } else if (typeof val === \"number\" && val !== Math.floor(val)) {\n alpha = val;\n } else {\n // Integer: this is a k cutoff\n const k = Math.floor(Number(val));\n if (signals.length === 0) {\n throw new Error(\"progressive_fusion: k must follow signal functions\");\n }\n stages.push([[...signals], k]);\n signals.length = 0;\n }\n } else {\n throw new Error(\"progressive_fusion: unexpected argument type\");\n }\n }\n\n if (signals.length > 0) {\n throw new Error(\"progressive_fusion: trailing signals without k cutoff\");\n }\n if (stages.length === 0) {\n throw new Error(\"progressive_fusion requires at least one (signals, k) stage\");\n }\n\n return new ProgressiveFusionOperator(stages, alpha, gating);\n }\n\n /**\n * deep_fusion(layer(...), propagate(...), ...[, named args])\n *\n * Builds a multi-layer deep fusion operator.\n */\n private _makeDeepFusionOp(\n args: Record<string, unknown>[],\n ctx: ExecutionContext,\n ): Operator {\n const layers: FusionLayer[] = [];\n let alpha = 0.5;\n let gating = \"none\";\n\n for (const arg of args) {\n // FuncCall (layer, propagate, convolve, etc.)\n const fc = asObj(nodeGet(arg, \"FuncCall\") ?? (isFuncCall(arg) ? arg : {}));\n if (Object.keys(fc).length > 0) {\n const innerName = getFuncName(fc).toLowerCase();\n const innerArgs = getFuncArgs(fc);\n\n if (innerName === \"layer\") {\n const sigs: Operator[] = [];\n for (const ia of innerArgs) {\n if (isFuncCall(ia) || nodeGet(ia, \"FuncCall\") !== null) {\n sigs.push(this._compileCalibratedSignal(ia, ctx));\n } else {\n throw new Error(\"layer() arguments must be signal functions\");\n }\n }\n if (sigs.length === 0) {\n throw new Error(\"layer() requires at least one signal\");\n }\n layers.push({ type: \"signal\", signals: sigs } as unknown as FusionLayer);\n } else if (innerName === \"propagate\") {\n if (innerArgs.length < 2) {\n throw new Error(\n \"propagate() requires at least 2 arguments: \" +\n \"propagate('edge_label', 'aggregation'[, 'direction'])\",\n );\n }\n const edgeLabel = extractStringValue(innerArgs[0]!, this._params);\n const aggregation = extractStringValue(innerArgs[1]!, this._params);\n if (![\"mean\", \"sum\", \"max\"].includes(aggregation)) {\n throw new Error(\n `propagate() aggregation must be 'mean', 'sum', or 'max', got '${aggregation}'`,\n );\n }\n let direction = \"both\";\n if (innerArgs.length >= 3) {\n direction = extractStringValue(innerArgs[2]!, this._params);\n if (![\"both\", \"out\", \"in\"].includes(direction)) {\n throw new Error(\n `propagate() direction must be 'both', 'out', or 'in', got '${direction}'`,\n );\n }\n }\n layers.push({\n type: \"propagate\",\n edgeLabel,\n aggregation,\n direction,\n } as unknown as FusionLayer);\n } else if (innerName === \"convolve\") {\n const convPos: Record<string, unknown>[] = [];\n const convNamed: Record<string, unknown> = {};\n for (const ia of innerArgs) {\n const na = nodeGet(ia, \"NamedArgExpr\");\n if (na !== null && na !== undefined) {\n const nObj = asObj(na);\n convNamed[nodeStr(nObj, \"name\")] = extractConstValue(\n asObj(nodeGet(nObj, \"arg\")),\n this._params,\n );\n } else {\n convPos.push(ia);\n }\n }\n if (convPos.length === 0) {\n throw new Error(\"convolve() requires edge_label as first argument\");\n }\n const edgeLabel = extractStringValue(convPos[0]!, this._params);\n const nChannels = Number(convNamed[\"n_channels\"] ?? 0);\n const direction = \"both\";\n\n if (nChannels > 1) {\n // Multi-channel convolution\n const seed = Number(convNamed[\"seed\"] ?? 42);\n const initMode = (convNamed[\"init\"] as string | undefined) ?? \"kaiming\";\n let prevOutCh = 1;\n for (let li = layers.length - 1; li >= 0; li--) {\n const prev = layers[li]!;\n if ((prev as unknown as Record<string, unknown>)[\"type\"] === \"conv\") {\n const ks = (prev as unknown as Record<string, unknown>)[\n \"kernelShape\"\n ] as number[] | undefined;\n if (ks) prevOutCh = ks[0]!;\n break;\n }\n }\n try {\n const kernels = _genKernels(nChannels, prevOutCh, seed, initMode);\n layers.push({\n type: \"conv\",\n edgeLabel,\n hopWeights: [1.0],\n direction,\n kernel: Array.from(kernels),\n kernelShape: [nChannels, prevOutCh],\n } as unknown as FusionLayer);\n } catch {\n layers.push({\n type: \"conv\",\n edgeLabel,\n hopWeights: [1.0],\n direction,\n } as unknown as FusionLayer);\n }\n } else {\n // Single-channel: hop_weights from ARRAY\n if (convPos.length < 2) {\n throw new Error(\n \"convolve() requires ARRAY[w0, w1, ...] or n_channels => N\",\n );\n }\n const hopWeights = extractVectorArg(convPos[1]!, this._params);\n layers.push({\n type: \"conv\",\n edgeLabel,\n hopWeights: Array.from(hopWeights),\n direction,\n } as unknown as FusionLayer);\n }\n } else if (innerName === \"pool\") {\n if (innerArgs.length < 3) {\n throw new Error(\n \"pool() requires at least 3 arguments: \" +\n \"pool('edge_label', 'method', pool_size[, 'direction'])\",\n );\n }\n const edgeLabel = extractStringValue(innerArgs[0]!, this._params);\n const method = extractStringValue(innerArgs[1]!, this._params);\n if (![\"max\", \"avg\"].includes(method)) {\n throw new Error(`pool() method must be 'max' or 'avg', got '${method}'`);\n }\n const poolSize = extractIntValue(innerArgs[2]!, this._params);\n let direction = \"both\";\n if (innerArgs.length >= 4) {\n direction = extractStringValue(innerArgs[3]!, this._params);\n if (![\"both\", \"out\", \"in\"].includes(direction)) {\n throw new Error(\n `pool() direction must be 'both', 'out', or 'in', got '${direction}'`,\n );\n }\n }\n layers.push({\n type: \"pool\",\n edgeLabel,\n poolSize,\n method,\n direction,\n } as unknown as FusionLayer);\n } else if (innerName === \"dense\") {\n const densePos: Record<string, unknown>[] = [];\n const denseNamed: Record<string, number> = {};\n for (const ia of innerArgs) {\n const na = nodeGet(ia, \"NamedArgExpr\");\n if (na !== null && na !== undefined) {\n const nObj = asObj(na);\n denseNamed[nodeStr(nObj, \"name\")] = Number(\n extractConstValue(asObj(nodeGet(nObj, \"arg\")), this._params),\n );\n } else {\n densePos.push(ia);\n }\n }\n if (densePos.length < 2) {\n throw new Error(\n \"dense() requires at least 2 positional arguments: ARRAY[weights], ARRAY[bias]\",\n );\n }\n const weights = extractVectorArg(densePos[0]!, this._params);\n const biasVec = extractVectorArg(densePos[1]!, this._params);\n const outCh = denseNamed[\"output_channels\"];\n const inCh = denseNamed[\"input_channels\"];\n if (outCh === undefined || inCh === undefined) {\n throw new Error(\n \"dense() requires output_channels and input_channels named arguments\",\n );\n }\n if (weights.length !== outCh * inCh) {\n throw new Error(\n `dense() weights array length (${String(weights.length)}) must equal ` +\n `output_channels * input_channels (${String(outCh * inCh)})`,\n );\n }\n if (biasVec.length !== outCh) {\n throw new Error(\n `dense() bias array length (${String(biasVec.length)}) must equal ` +\n `output_channels (${String(outCh)})`,\n );\n }\n layers.push({\n type: \"dense\",\n weights: Array.from(weights),\n bias: Array.from(biasVec),\n outputChannels: outCh,\n inputChannels: inCh,\n } as unknown as FusionLayer);\n } else if (innerName === \"flatten\") {\n layers.push({ type: \"flatten\" } as unknown as FusionLayer);\n } else if (innerName === \"softmax\") {\n layers.push({ type: \"softmax\" } as unknown as FusionLayer);\n } else if (innerName === \"batch_norm\") {\n let epsilon = 1e-5;\n for (const ia of innerArgs) {\n const na = nodeGet(ia, \"NamedArgExpr\");\n if (na !== null && na !== undefined) {\n const nObj = asObj(na);\n if (nodeStr(nObj, \"name\") === \"epsilon\") {\n epsilon = Number(\n extractConstValue(asObj(nodeGet(nObj, \"arg\")), this._params),\n );\n }\n }\n }\n layers.push({ type: \"batchNorm\", epsilon } as unknown as FusionLayer);\n } else if (innerName === \"dropout\") {\n if (innerArgs.length < 1) {\n throw new Error(\"dropout() requires 1 argument: dropout(p)\");\n }\n const p = Number(extractConstValue(innerArgs[0]!, this._params));\n layers.push({ type: \"dropout\", p } as unknown as FusionLayer);\n } else if (innerName === \"attention\") {\n let attnNHeads = 1;\n let attnMode = \"content\";\n for (const ia of innerArgs) {\n const na = nodeGet(ia, \"NamedArgExpr\");\n if (na !== null && na !== undefined) {\n const nObj = asObj(na);\n const attrName = nodeStr(nObj, \"name\");\n if (attrName === \"n_heads\") {\n attnNHeads = Number(\n extractConstValue(asObj(nodeGet(nObj, \"arg\")), this._params),\n );\n } else if (attrName === \"mode\") {\n attnMode = String(\n extractConstValue(asObj(nodeGet(nObj, \"arg\")), this._params),\n );\n }\n }\n }\n layers.push({\n type: \"attention\",\n nHeads: attnNHeads,\n mode: attnMode,\n } as unknown as FusionLayer);\n } else if (innerName === \"embed\") {\n const embedPos: Record<string, unknown>[] = [];\n const embedNamed: Record<string, number> = {};\n for (const ia of innerArgs) {\n const na = nodeGet(ia, \"NamedArgExpr\");\n if (na !== null && na !== undefined) {\n const nObj = asObj(na);\n embedNamed[nodeStr(nObj, \"name\")] = Number(\n extractConstValue(asObj(nodeGet(nObj, \"arg\")), this._params),\n );\n } else {\n embedPos.push(ia);\n }\n }\n if (embedPos.length === 0) {\n throw new Error(\"embed() requires vector argument\");\n }\n const vec = extractVectorArg(embedPos[0]!, this._params);\n const eInCh = embedNamed[\"in_channels\"] ?? 1;\n let eGh: number;\n let eGw: number;\n if (\n embedNamed[\"grid_h\"] !== undefined &&\n embedNamed[\"grid_w\"] !== undefined\n ) {\n eGh = embedNamed[\"grid_h\"]!;\n eGw = embedNamed[\"grid_w\"]!;\n } else {\n const side = Math.floor(Math.sqrt(vec.length / eInCh));\n if (side * side * eInCh === vec.length) {\n eGh = side;\n eGw = side;\n } else {\n eGh = 0;\n eGw = 0;\n }\n }\n layers.push({\n type: \"embed\",\n embedding: Array.from(vec),\n gridH: eGh,\n gridW: eGw,\n inChannels: eInCh,\n } as unknown as FusionLayer);\n } else if (innerName === \"global_pool\") {\n let gpMethod = \"avg\";\n for (const ia of innerArgs) {\n const na = nodeGet(ia, \"NamedArgExpr\");\n if (na !== null && na !== undefined) {\n const nObj = asObj(na);\n if (nodeStr(nObj, \"name\") === \"method\") {\n gpMethod = String(\n extractConstValue(asObj(nodeGet(nObj, \"arg\")), this._params),\n );\n }\n } else {\n gpMethod = extractStringValue(ia, this._params);\n }\n }\n if (![\"avg\", \"max\", \"avg_max\"].includes(gpMethod)) {\n throw new Error(\n `global_pool() method must be 'avg', 'max', or 'avg_max', got '${gpMethod}'`,\n );\n }\n layers.push({\n type: \"globalPool\",\n method: gpMethod,\n } as unknown as FusionLayer);\n } else {\n throw new Error(`deep_fusion() unknown layer function: ${innerName}()`);\n }\n continue;\n }\n // NamedArgExpr\n const namedArg = nodeGet(arg, \"NamedArgExpr\");\n if (namedArg !== null && namedArg !== undefined) {\n const nObj = asObj(namedArg);\n const argName = nodeStr(nObj, \"name\");\n const val = extractConstValue(asObj(nodeGet(nObj, \"arg\")), this._params);\n if (argName === \"alpha\") {\n alpha = Number(val);\n } else if (argName === \"gating\") {\n gating = String(val);\n } else {\n throw new Error(\n `Unknown option for deep_fusion: ${argName}. Valid options: alpha, gating`,\n );\n }\n continue;\n }\n throw new Error(\"deep_fusion() arguments must be layer() or propagate() calls\");\n }\n\n if (layers.length === 0) {\n throw new Error(\"deep_fusion requires at least one layer\");\n }\n\n return new DeepFusionOperator(\n layers,\n alpha,\n gating,\n this._currentGraphName || undefined,\n );\n }\n\n /**\n * fuse_attention(signal1, signal2, ...[, named options])\n */\n private _makeAttentionFusionOp(\n args: Record<string, unknown>[],\n ctx: ExecutionContext,\n ): Operator {\n const signals: Operator[] = [];\n const options: Record<string, unknown> = {};\n for (const arg of args) {\n if (isFuncCall(arg) || nodeGet(arg, \"FuncCall\") !== null) {\n signals.push(this._compileCalibratedSignal(arg, ctx));\n } else {\n const namedArg = nodeGet(arg, \"NamedArgExpr\");\n if (namedArg !== null && namedArg !== undefined) {\n const nObj = asObj(namedArg);\n options[nodeStr(nObj, \"name\")] = extractConstValue(\n asObj(nodeGet(nObj, \"arg\")),\n this._params,\n );\n }\n }\n }\n\n if (signals.length < 2) {\n throw new Error(\"fuse_attention requires at least 2 signals\");\n }\n\n const validOpts = new Set([\"normalized\", \"alpha\", \"base_rate\"]);\n const unknownOpts = Object.keys(options).filter((k) => !validOpts.has(k));\n if (unknownOpts.length > 0) {\n throw new Error(\n `Unknown option(s) for fuse_attention: ${unknownOpts.join(\", \")}. ` +\n `Valid options: ${[...validOpts].sort().join(\", \")}`,\n );\n }\n\n try {\n const nSignals = signals.length;\n const attention = new AttentionFusion(\n nSignals,\n 6,\n Number(options[\"alpha\"] ?? 0.5),\n Boolean(options[\"normalized\"] ?? false),\n (options[\"base_rate\"] as number | undefined) ?? undefined,\n );\n\n const queryFeatures = this._extractQueryFeatures(args, ctx);\n return new AttentionFusionOperator(signals, attention as never, queryFeatures);\n } catch {\n // AttentionFusion not available, fall back to log-odds\n return new LogOddsFusionOperator(signals, Number(options[\"alpha\"] ?? 0.5));\n }\n }\n\n /**\n * fuse_multihead(signal1, signal2, ...[, named options])\n */\n private _makeMultiheadFusionOp(\n args: Record<string, unknown>[],\n ctx: ExecutionContext,\n ): Operator {\n const signals: Operator[] = [];\n const options: Record<string, unknown> = {};\n for (const arg of args) {\n if (isFuncCall(arg) || nodeGet(arg, \"FuncCall\") !== null) {\n signals.push(this._compileCalibratedSignal(arg, ctx));\n } else {\n const namedArg = nodeGet(arg, \"NamedArgExpr\");\n if (namedArg !== null && namedArg !== undefined) {\n const nObj = asObj(namedArg);\n options[nodeStr(nObj, \"name\")] = extractConstValue(\n asObj(nodeGet(nObj, \"arg\")),\n this._params,\n );\n }\n }\n }\n\n if (signals.length < 2) {\n throw new Error(\"fuse_multihead requires at least 2 signals\");\n }\n\n const validOpts = new Set([\"n_heads\", \"normalized\", \"alpha\"]);\n const unknownOpts = Object.keys(options).filter((k) => !validOpts.has(k));\n if (unknownOpts.length > 0) {\n throw new Error(\n `Unknown option(s) for fuse_multihead: ${unknownOpts.join(\", \")}. ` +\n `Valid options: ${[...validOpts].sort().join(\", \")}`,\n );\n }\n\n try {\n const nSignals = signals.length;\n const fusion = new MultiHeadAttentionFusion(\n nSignals,\n Number(options[\"n_heads\"] ?? 4),\n 6,\n Number(options[\"alpha\"] ?? 0.5),\n Boolean(options[\"normalized\"] ?? false),\n );\n\n const queryFeatures = this._extractQueryFeatures(args, ctx);\n return new AttentionFusionOperator(signals, fusion as never, queryFeatures);\n } catch {\n // MultiHeadAttentionFusion not available, fall back to log-odds\n return new LogOddsFusionOperator(signals, Number(options[\"alpha\"] ?? 0.5));\n }\n }\n\n /**\n * fuse_learned(signal1, signal2, ...[, named options])\n */\n private _makeLearnedFusionOp(\n args: Record<string, unknown>[],\n ctx: ExecutionContext,\n ): Operator {\n const signals: Operator[] = [];\n const options: Record<string, unknown> = {};\n for (const arg of args) {\n if (isFuncCall(arg) || nodeGet(arg, \"FuncCall\") !== null) {\n signals.push(this._compileCalibratedSignal(arg, ctx));\n } else {\n const namedArg = nodeGet(arg, \"NamedArgExpr\");\n if (namedArg !== null && namedArg !== undefined) {\n const nObj = asObj(namedArg);\n options[nodeStr(nObj, \"name\")] = extractConstValue(\n asObj(nodeGet(nObj, \"arg\")),\n this._params,\n );\n }\n }\n }\n\n if (signals.length < 2) {\n throw new Error(\"fuse_learned requires at least 2 signals\");\n }\n\n const validOpts = new Set([\"alpha\"]);\n const unknownOpts = Object.keys(options).filter((k) => !validOpts.has(k));\n if (unknownOpts.length > 0) {\n throw new Error(\n `Unknown option(s) for fuse_learned: ${unknownOpts.join(\", \")}. ` +\n `Valid options: ${[...validOpts].sort().join(\", \")}`,\n );\n }\n\n try {\n const learned = new LearnedFusion(\n signals.length,\n Number(options[\"alpha\"] ?? 0.5),\n );\n return new LearnedFusionOperator(signals, learned as never);\n } catch {\n // LearnedFusion not available, fall back to log-odds\n return new LogOddsFusionOperator(signals, Number(options[\"alpha\"] ?? 0.5));\n }\n }\n\n /**\n * Extract query features from the first text signal in args.\n */\n private _extractQueryFeatures(\n args: Record<string, unknown>[],\n ctx: ExecutionContext,\n ): Float64Array {\n const queryFeatures = new Float64Array(6);\n if (ctx.invertedIndex) {\n try {\n const extractor = new QueryFeatureExtractor(ctx.invertedIndex);\n for (const arg of args) {\n const fc = asObj(nodeGet(arg, \"FuncCall\") ?? (isFuncCall(arg) ? arg : {}));\n if (Object.keys(fc).length > 0) {\n const fnName = getFuncName(fc);\n if (fnName === \"text_match\" || fnName === \"bayesian_match\") {\n const fArgs = getFuncArgs(fc);\n if (fArgs.length >= 2) {\n const queryStr = extractStringValue(fArgs[1]!, this._params);\n const analyzer = (\n ctx.invertedIndex as unknown as {\n analyzer: { analyze(q: string): string[] };\n }\n ).analyzer;\n const terms = analyzer.analyze(queryStr);\n return extractor.extract(terms);\n }\n }\n }\n }\n } catch {\n // QueryFeatureExtractor not available\n }\n }\n return queryFeatures;\n }\n\n // ==================================================================\n // Constant folding\n // ==================================================================\n\n /**\n * Return a new stmt with the WHERE clause constant-folded.\n */\n private _foldStmtWhere(stmt: Record<string, unknown>): Record<string, unknown> {\n const whereClause = nodeGet(stmt, \"whereClause\");\n if (whereClause === null || whereClause === undefined) return stmt;\n const folded = this._foldConstants(asObj(whereClause));\n if (folded === whereClause) return stmt;\n return { ...stmt, whereClause: folded };\n }\n\n /**\n * Bottom-up constant folding for AST expressions.\n */\n private _foldConstants(node: Record<string, unknown>): Record<string, unknown> {\n if (Object.keys(node).length === 0) return node;\n\n // A_Const -- already a constant\n if (isAConst(node) || nodeGet(node, \"A_Const\") !== null) return node;\n\n // ColumnRef -- not foldable\n if (isColumnRef(node) || nodeGet(node, \"ColumnRef\") !== null) return node;\n\n // A_Expr: fold if both operands are constant\n if (isAExpr(node) || nodeGet(node, \"A_Expr\") !== null) {\n return this._foldAExpr(node);\n }\n\n // BoolExpr: fold if all args are constant, or partial fold\n if (isBoolExpr(node) || nodeGet(node, \"BoolExpr\") !== null) {\n return this._foldBoolExpr(node);\n }\n\n // FuncCall: fold only if all args are constant and function is pure\n if (isFuncCall(node) || nodeGet(node, \"FuncCall\") !== null) {\n return this._foldFuncCall(node);\n }\n\n return node;\n }\n\n /**\n * Try to fold an A_Expr with constant operands.\n */\n private _foldAExpr(node: Record<string, unknown>): Record<string, unknown> {\n const aExpr = asObj(nodeGet(node, \"A_Expr\") ?? node);\n const newLexpr = this._foldConstants(asObj(nodeGet(aExpr, \"lexpr\") ?? {}));\n const newRexpr = this._foldConstants(asObj(nodeGet(aExpr, \"rexpr\") ?? {}));\n\n // If both sides are now constant, try to evaluate\n if (\n (isAConst(newLexpr) || nodeGet(newLexpr, \"A_Const\") !== null) &&\n (isAConst(newRexpr) || nodeGet(newRexpr, \"A_Const\") !== null)\n ) {\n try {\n const evaluator = new ExprEvaluator({ params: this._params });\n const folded = {\n A_Expr: {\n ...aExpr,\n lexpr: newLexpr,\n rexpr: newRexpr,\n },\n };\n const result = evaluator.evaluate(folded, {});\n return _valueToAConst(result);\n } catch {\n // Cannot fold -- return with updated operands\n }\n }\n\n if (newLexpr !== nodeGet(aExpr, \"lexpr\") || newRexpr !== nodeGet(aExpr, \"rexpr\")) {\n const updated = { ...aExpr, lexpr: newLexpr, rexpr: newRexpr };\n return nodeGet(node, \"A_Expr\") !== null ? { A_Expr: updated } : updated;\n }\n return node;\n }\n\n /**\n * Try to fold a BoolExpr, including partial evaluation.\n */\n private _foldBoolExpr(node: Record<string, unknown>): Record<string, unknown> {\n const boolExpr = asObj(nodeGet(node, \"BoolExpr\") ?? node);\n const boolop = nodeGet(boolExpr, \"boolop\");\n const args = asList(nodeGet(boolExpr, \"args\"));\n const newArgs = args.map((a) => this._foldConstants(a));\n\n // Full fold: all args are constants\n const allConst = newArgs.every(\n (a) => isAConst(a) || nodeGet(a, \"A_Const\") !== null,\n );\n if (allConst) {\n try {\n const evaluator = new ExprEvaluator({ params: this._params });\n const folded = { BoolExpr: { boolop, args: newArgs } };\n const result = evaluator.evaluate(folded, {});\n return _valueToAConst(result);\n } catch {\n // Cannot fold\n }\n }\n\n // Partial fold for AND (boolop=0): remove True constants, short-circuit on False\n if (boolop === 0 || boolop === \"AND_EXPR\") {\n const surviving: Record<string, unknown>[] = [];\n for (const a of newArgs) {\n if (isAConst(a) || nodeGet(a, \"A_Const\") !== null) {\n const val = _constToBool(a);\n if (val === false) {\n return { A_Const: { boolval: false } };\n }\n // True -> skip (identity for AND)\n continue;\n }\n surviving.push(a);\n }\n if (surviving.length === 0) return { A_Const: { boolval: true } };\n if (surviving.length === 1) return surviving[0]!;\n const updated = { boolop: 0, args: surviving };\n return nodeGet(node, \"BoolExpr\") !== null ? { BoolExpr: updated } : updated;\n }\n\n // Partial fold for OR (boolop=1): remove False constants, short-circuit on True\n if (boolop === 1 || boolop === \"OR_EXPR\") {\n const surviving: Record<string, unknown>[] = [];\n for (const a of newArgs) {\n if (isAConst(a) || nodeGet(a, \"A_Const\") !== null) {\n const val = _constToBool(a);\n if (val === true) {\n return { A_Const: { boolval: true } };\n }\n // False -> skip (identity for OR)\n continue;\n }\n surviving.push(a);\n }\n if (surviving.length === 0) return { A_Const: { boolval: false } };\n if (surviving.length === 1) return surviving[0]!;\n const updated = { boolop: 1, args: surviving };\n return nodeGet(node, \"BoolExpr\") !== null ? { BoolExpr: updated } : updated;\n }\n\n // Return with updated args if anything changed\n const argsChanged = newArgs.some((a, i) => a !== args[i]);\n if (argsChanged) {\n const updated = { boolop, args: newArgs };\n return nodeGet(node, \"BoolExpr\") !== null ? { BoolExpr: updated } : updated;\n }\n return node;\n }\n\n /**\n * Fold a FuncCall if all args are constant and function is pure.\n */\n private _foldFuncCall(node: Record<string, unknown>): Record<string, unknown> {\n const fc = asObj(nodeGet(node, \"FuncCall\") ?? node);\n const funcName = getFuncName(fc);\n if (NO_FOLD_FUNCS.has(funcName)) return node;\n\n const funcArgs = asList(nodeGet(fc, \"args\"));\n if (funcArgs.length === 0) return node;\n\n const newArgs = funcArgs.map((a) => this._foldConstants(a));\n const changed = newArgs.some((a, i) => a !== funcArgs[i]);\n if (changed) {\n const updated = { ...fc, args: newArgs };\n return nodeGet(node, \"FuncCall\") !== null ? { FuncCall: updated } : updated;\n }\n return node;\n }\n\n // ==================================================================\n // Query optimization and plan execution\n // ==================================================================\n\n /**\n * Run the operator tree through the QueryOptimizer.\n */\n private _optimize(\n op: Operator,\n ctx: ExecutionContext,\n _table: Table | null,\n ): Operator {\n try {\n const idx = ctx.invertedIndex;\n if (!idx) return op;\n const stats = (idx as unknown as { stats: unknown }).stats;\n const columnStats = _table\n ? (_table as unknown as { _stats: unknown })._stats\n : null;\n const tableName = _table ? _table.name : undefined;\n const optimizer = new QueryOptimizer(stats as IndexStats, {\n columnStats: columnStats as Map<string, ColumnStats> | undefined,\n indexManager: ctx.indexManager ?? undefined,\n tableName,\n });\n return optimizer.optimize(op);\n } catch {\n return op;\n }\n }\n\n /**\n * Execute an operator tree via PlanExecutor.\n */\n private _executePlan(op: Operator, ctx: ExecutionContext): PostingList {\n try {\n const executor = new PlanExecutor(ctx);\n return executor.execute(op);\n } catch {\n // PlanExecutor not available, execute directly\n return op.execute(ctx);\n }\n }\n\n /**\n * Format the optimized query plan as an EXPLAIN result.\n */\n private _explainPlan(op: Operator, ctx: ExecutionContext): SQLResult {\n try {\n const executor = new PlanExecutor(ctx);\n const planText = executor.explain(op);\n const lines = planText.split(\"\\n\");\n const rows = lines.map((line: string) => ({ plan: line }));\n return { columns: [\"plan\"], rows };\n } catch {\n return { columns: [\"plan\"], rows: [{ plan: op.constructor.name }] };\n }\n }\n\n /**\n * Scan all documents from a table into a PostingList.\n */\n private _scanAll(ctx: ExecutionContext, limit?: number): PostingList {\n if (!ctx.documentStore) {\n return new PostingList([createPostingEntry(0, { score: 0.0 })]);\n }\n const ds = ctx.documentStore;\n let allIds = [...ds.docIds].sort((a, b) => a - b);\n if (limit !== undefined && limit < allIds.length) {\n allIds = allIds.slice(0, limit);\n }\n return new PostingList(allIds.map((d) => createPostingEntry(d, { score: 0.0 })));\n }\n\n /**\n * Chain a WHERE operator on top of a source operator.\n */\n private _chainOnSource(whereOp: Operator, sourceOp: Operator): Operator {\n if (whereOp instanceof FilterOperator && whereOp.source === null) {\n return new FilterOperator(whereOp.field, whereOp.predicate, sourceOp);\n }\n return new IntersectOperator([sourceOp, whereOp]);\n }\n\n /**\n * Check if a source operator is a graph operator.\n */\n private static _isGraphOperator(op: unknown): boolean {\n if (op === null || op === undefined) return false;\n const name = (op as { constructor: { name: string } }).constructor.name;\n return [\n \"TraverseOperator\",\n \"RegularPathQueryOperator\",\n \"PatternMatchOperator\",\n \"TemporalTraverseOperator\",\n \"TemporalPatternMatchOperator\",\n \"CypherQueryOperator\",\n ].includes(name);\n }\n\n /**\n * Check if a source operator is a join operator.\n */\n private static _isJoinOperator(op: unknown): boolean {\n if (op === null || op === undefined) return false;\n const name = (op as { constructor: { name: string } }).constructor.name;\n return [\n \"InnerJoinOperator\",\n \"OuterJoinOperator\",\n \"CrossJoinOperator\",\n \"IndexJoinOperator\",\n \"SortMergeJoinOperator\",\n \"ExprJoinOperator\",\n \"LateralJoinOperator\",\n \"TableScanOperator\",\n ].includes(name);\n }\n\n /**\n * Collect (alias, columns[]) pairs for all tables in a FROM clause.\n * Used by SELECT * on joins to expand columns in correct order.\n */\n private _collectJoinTables(\n fromClause: Record<string, unknown>[],\n ): [string, string[]][] {\n const result: [string, string[]][] = [];\n for (const fromNode of fromClause) {\n this._walkFromForTables(fromNode, result);\n }\n return result;\n }\n\n private _walkFromForTables(\n node: Record<string, unknown>,\n result: [string, string[]][],\n ): void {\n // RangeVar\n const rv = asObj(nodeGet(node, \"RangeVar\") ?? {});\n if (Object.keys(rv).length > 0) {\n const tName = extractRelName(rv);\n const alias = extractAlias(rv) ?? tName;\n const table = this._tables.get(tName);\n if (table) {\n result.push([alias, table.columnNames]);\n }\n return;\n }\n\n // JoinExpr\n const je = asObj(nodeGet(node, \"JoinExpr\") ?? {});\n if (Object.keys(je).length > 0) {\n const larg = nodeGet(je, \"larg\");\n const rarg = nodeGet(je, \"rarg\");\n if (larg !== null && larg !== undefined)\n this._walkFromForTables(asObj(larg), result);\n if (rarg !== null && rarg !== undefined)\n this._walkFromForTables(asObj(rarg), result);\n return;\n }\n\n // RangeSubselect\n const rss = asObj(nodeGet(node, \"RangeSubselect\") ?? {});\n if (Object.keys(rss).length > 0) {\n const alias = extractAlias(rss) ?? \"_derived\";\n const table = this._tables.get(alias);\n if (table) {\n result.push([alias, table.columnNames]);\n }\n }\n }\n\n /**\n * Apply deferred WHERE predicates as ExprEvaluator-based filter\n * on already-joined/graph-sourced rows. For simple column-to-constant\n * comparisons, uses direct predicate matching. For cross-table or\n * complex expressions, delegates to ExprEvaluator.\n */\n private _applyDeferredWhere(\n rows: Record<string, unknown>[],\n whereNode: Record<string, unknown>,\n evaluator: ExprEvaluator,\n ): Record<string, unknown>[] {\n return rows.filter((row) => {\n const result = evaluator.evaluate(whereNode, row);\n return result === true;\n });\n }\n\n // -- AST table reference collection -----------------------------------\n\n /**\n * Recursively collect all table names from an AST node.\n * Walks FROM, JOINs, subqueries, and CTEs.\n * Virtual schemas (information_schema, pg_catalog) are excluded.\n */\n private static _collectAstTableRefs(node: unknown): Set<string> {\n const refs = new Set<string>();\n SQLCompiler._walkAstForTables(node, refs);\n return refs;\n }\n\n private static _walkAstForTables(node: unknown, refs: Set<string>): void {\n if (node === null || node === undefined) return;\n if (typeof node !== \"object\") return;\n\n if (Array.isArray(node)) {\n for (const item of node) {\n SQLCompiler._walkAstForTables(item, refs);\n }\n return;\n }\n\n const obj = node as Record<string, unknown>;\n\n // Check for RangeVar\n const rv = obj[\"RangeVar\"] as Record<string, unknown> | undefined;\n if (rv !== undefined) {\n const schema = nodeStr(rv, \"schemaname\");\n if (schema !== \"information_schema\" && schema !== \"pg_catalog\") {\n const relname = nodeStr(rv, \"relname\");\n if (relname) refs.add(relname);\n }\n return;\n }\n\n // Direct relname check\n const relname = obj[\"relname\"];\n if (typeof relname === \"string\" && relname) {\n const schema = obj[\"schemaname\"];\n if (schema !== \"information_schema\" && schema !== \"pg_catalog\") {\n refs.add(relname);\n }\n }\n\n // Recurse into child values\n for (const value of Object.values(obj)) {\n if (value !== null && typeof value === \"object\") {\n SQLCompiler._walkAstForTables(value, refs);\n }\n }\n }\n\n // -- Join predicate pushdown helpers ---------------------------------\n\n /**\n * Partition WHERE conjuncts into per-alias pushable and remaining.\n * Single-alias conjuncts are pushable; cross-table predicates remain.\n * Returns [pushable_per_alias, remaining_node].\n */\n private _partitionWhereForJoins(\n whereClause: Record<string, unknown>,\n fromAliases: Set<string>,\n ): [Map<string, Record<string, unknown>[]>, Record<string, unknown> | null] {\n const conjuncts = this._extractAndConjuncts(whereClause);\n const pushable = new Map<string, Record<string, unknown>[]>();\n const remaining: Record<string, unknown>[] = [];\n\n for (const conj of conjuncts) {\n const aliases = SQLCompiler._collectConjunctAliases(conj);\n if (aliases.size === 1) {\n const alias = aliases.values().next().value as string;\n if (fromAliases.has(alias)) {\n if (!pushable.has(alias)) pushable.set(alias, []);\n pushable.get(alias)!.push(conj);\n continue;\n }\n }\n remaining.push(conj);\n }\n\n const remainingNode = SQLCompiler._reconstructAnd(remaining);\n return [pushable, remainingNode];\n }\n\n /**\n * Collect table alias prefixes from ColumnRef nodes in an AST subtree.\n */\n private static _collectConjunctAliases(node: Record<string, unknown>): Set<string> {\n const aliases = new Set<string>();\n SQLCompiler._walkForColumnAliases(node, aliases);\n return aliases;\n }\n\n private static _walkForColumnAliases(\n node: Record<string, unknown>,\n aliases: Set<string>,\n ): void {\n // Check for ColumnRef with qualified name (table.column)\n const cr = asObj(nodeGet(node, \"ColumnRef\") ?? {});\n if (Object.keys(cr).length > 0) {\n const fields = asList(nodeGet(cr, \"fields\"));\n if (fields.length >= 2) {\n const first = fields[0]!;\n const alias = extractString(first);\n if (alias) aliases.add(alias);\n }\n return;\n }\n if (isColumnRef(node)) {\n const fields = asList(\n nodeGet(asObj(nodeGet(node, \"ColumnRef\") ?? node), \"fields\"),\n );\n if (fields.length >= 2) {\n const first = fields[0]!;\n const alias = extractString(first);\n if (alias) aliases.add(alias);\n }\n return;\n }\n\n // Recurse\n for (const attr of [\"lexpr\", \"rexpr\", \"args\", \"arg\", \"xpr\", \"val\"]) {\n const child = nodeGet(node, attr);\n if (child === null || child === undefined) continue;\n if (Array.isArray(child)) {\n for (const c of child as Record<string, unknown>[]) {\n if (typeof c === \"object\") {\n SQLCompiler._walkForColumnAliases(c, aliases);\n }\n }\n } else if (typeof child === \"object\") {\n SQLCompiler._walkForColumnAliases(child as Record<string, unknown>, aliases);\n }\n }\n\n // BoolExpr args\n const boolExpr = asObj(nodeGet(node, \"BoolExpr\") ?? {});\n if (Object.keys(boolExpr).length > 0) {\n const boolArgs = asList(nodeGet(boolExpr, \"args\"));\n for (const ba of boolArgs) {\n SQLCompiler._walkForColumnAliases(ba, aliases);\n }\n }\n\n // A_Expr children\n const aExpr = asObj(nodeGet(node, \"A_Expr\") ?? {});\n if (Object.keys(aExpr).length > 0) {\n const lexpr = nodeGet(aExpr, \"lexpr\");\n const rexpr = nodeGet(aExpr, \"rexpr\");\n if (lexpr !== null && typeof lexpr === \"object\") {\n SQLCompiler._walkForColumnAliases(lexpr as Record<string, unknown>, aliases);\n }\n if (rexpr !== null && typeof rexpr === \"object\") {\n SQLCompiler._walkForColumnAliases(rexpr as Record<string, unknown>, aliases);\n }\n }\n }\n\n /**\n * Rebuild a BoolExpr AND node from a list of conjuncts.\n */\n private static _reconstructAnd(\n conjuncts: Record<string, unknown>[],\n ): Record<string, unknown> | null {\n if (conjuncts.length === 0) return null;\n if (conjuncts.length === 1) return conjuncts[0]!;\n return { BoolExpr: { boolop: 0, args: conjuncts } };\n }\n\n /**\n * Extract equijoin predicates from WHERE for implicit cross joins.\n * Returns an array of {leftAlias, leftCol, rightAlias, rightCol} objects.\n */\n private _extractImplicitEquijoinPredicates(\n whereNode: Record<string, unknown>,\n aliasSet: Set<string>,\n ): { leftAlias: string; leftCol: string; rightAlias: string; rightCol: string }[] {\n const predicates: {\n leftAlias: string;\n leftCol: string;\n rightAlias: string;\n rightCol: string;\n }[] = [];\n\n // Get conjuncts\n const boolExpr = asObj(nodeGet(whereNode, \"BoolExpr\") ?? {});\n let conjuncts: Record<string, unknown>[];\n if (Object.keys(boolExpr).length > 0) {\n const boolop = nodeGet(boolExpr, \"boolop\");\n if (boolop === 0 || boolop === \"AND_EXPR\") {\n conjuncts = asList(nodeGet(boolExpr, \"args\"));\n } else {\n conjuncts = [whereNode];\n }\n } else {\n conjuncts = [whereNode];\n }\n\n for (const node of conjuncts) {\n const aExpr = asObj(nodeGet(node, \"A_Expr\") ?? {});\n if (Object.keys(aExpr).length === 0) continue;\n\n // Must be equality operator\n const nameList = asList(nodeGet(aExpr, \"name\"));\n if (nameList.length === 0) continue;\n const opName = extractString(nameList[nameList.length - 1]!);\n if (opName !== \"=\") continue;\n\n // Both sides must be column refs\n const lexpr = nodeGet(aExpr, \"lexpr\");\n const rexpr = nodeGet(aExpr, \"rexpr\");\n if (lexpr === null || rexpr === null) continue;\n if (!isColumnRef(asObj(lexpr)) || !isColumnRef(asObj(rexpr))) continue;\n\n // Both must be qualified (table.column)\n const leftCr = asObj(nodeGet(asObj(lexpr), \"ColumnRef\") ?? asObj(lexpr));\n const rightCr = asObj(nodeGet(asObj(rexpr), \"ColumnRef\") ?? asObj(rexpr));\n const leftFields = asList(nodeGet(leftCr, \"fields\"));\n const rightFields = asList(nodeGet(rightCr, \"fields\"));\n\n if (leftFields.length < 2 || rightFields.length < 2) continue;\n\n const leftAlias = extractString(leftFields[0]!);\n const leftCol = extractString(leftFields[leftFields.length - 1]!);\n const rightAlias = extractString(rightFields[0]!);\n const rightCol = extractString(rightFields[rightFields.length - 1]!);\n\n if (!leftAlias || !leftCol || !rightAlias || !rightCol) continue;\n if (!aliasSet.has(leftAlias) || !aliasSet.has(rightAlias)) continue;\n\n predicates.push({ leftAlias, leftCol, rightAlias, rightCol });\n }\n\n return predicates;\n }\n\n // -- FK validator registration ------------------------------------------\n\n /**\n * Register foreign key validators (insert/update/delete hooks).\n * Enforces referential integrity between child and parent tables.\n */\n private _registerFkValidators(\n tableName: string,\n table: Table,\n foreignKeys: ForeignKeyDef[],\n ): void {\n for (const fk of foreignKeys) {\n const parentTableName = fk.refTable;\n const childCol = fk.column;\n const parentCol = fk.refColumn;\n\n // Insert validator: child FK value must exist in parent\n table.fkInsertValidators.push((doc: Record<string, unknown>) => {\n const val = doc[childCol];\n if (val === null || val === undefined) return; // NULL FK allowed\n const parent = this._tables.get(parentTableName);\n if (!parent) {\n throw new Error(\n `Foreign key violation: parent table \"${parentTableName}\" does not exist`,\n );\n }\n const hasValue = parent.documentStore.hasValue(parentCol, val);\n if (!hasValue) {\n throw new Error(\n `Foreign key violation: ${tableName}.${childCol} = ${JSON.stringify(val)} ` +\n `not found in ${parentTableName}.${parentCol}`,\n );\n }\n });\n\n // Update validator: when child row changes FK column, new value must exist in parent\n table.fkUpdateValidators.push(\n (_oldDoc: Record<string, unknown>, newDoc: Record<string, unknown>) => {\n const val = newDoc[childCol];\n if (val === null || val === undefined) return; // NULL FK allowed\n const parent = this._tables.get(parentTableName);\n if (!parent) {\n throw new Error(\n `FOREIGN KEY constraint violated: parent table \"${parentTableName}\" does not exist`,\n );\n }\n const hasValue = parent.documentStore.hasValue(parentCol, val);\n if (!hasValue) {\n throw new Error(\n `FOREIGN KEY constraint violated: ${tableName}.${childCol} = ${JSON.stringify(val)} ` +\n `not found in ${parentTableName}.${parentCol}`,\n );\n }\n },\n );\n\n // Delete validator on parent: row cannot be deleted if referenced by child\n const parent = this._tables.get(parentTableName);\n if (parent) {\n const childTableName = tableName;\n const childTable = table;\n parent.fkDeleteValidators.push((docId: number) => {\n const parentDoc = parent.documentStore.get(docId);\n if (!parentDoc) return;\n const parentVal = parentDoc[parentCol];\n if (parentVal === null || parentVal === undefined) return;\n // Check if any child row references this value\n if (childTable.documentStore.hasValue(childCol, parentVal)) {\n throw new Error(\n `FOREIGN KEY constraint violated: row in \"${parentTableName}\" ` +\n `is still referenced from \"${childTableName}\"`,\n );\n }\n });\n\n // Update validator on parent: PK changes must not orphan child rows\n parent.fkUpdateValidators.push(\n (oldDoc: Record<string, unknown>, newDoc: Record<string, unknown>) => {\n const oldVal = oldDoc[parentCol];\n const newVal = newDoc[parentCol];\n // If the referenced column value did not change, no violation\n if (oldVal === newVal) return;\n if (oldVal === null || oldVal === undefined) return;\n // Check if any child row references the old value\n if (childTable.documentStore.hasValue(childCol, oldVal)) {\n throw new Error(\n `FOREIGN KEY constraint violated: row in \"${parentTableName}\" ` +\n `is still referenced from \"${childTableName}\"`,\n );\n }\n },\n );\n }\n }\n }\n\n // -- Predicate pushdown helpers -----------------------------------------\n\n /**\n * Check if a WHERE predicate is safe to push down into a view/subquery.\n * Only simple column comparisons referencing subquery output columns qualify.\n */\n private _isPushablePredicate(\n node: Record<string, unknown>,\n subqueryColumns: Set<string>,\n ): boolean {\n // Simple A_Expr comparisons\n const aExpr = nodeGet(node, \"A_Expr\");\n if (aExpr !== null && aExpr !== undefined) {\n const expr = asObj(aExpr);\n const lexpr = nodeGet(expr, \"lexpr\");\n const rexpr = nodeGet(expr, \"rexpr\");\n // Left must be a column ref to a subquery column\n if (lexpr !== null && isColumnRef(asObj(lexpr))) {\n try {\n const col = extractColumnName(asObj(lexpr));\n if (!subqueryColumns.has(col)) return false;\n } catch {\n return false;\n }\n } else {\n return false;\n }\n // Right must be a constant or parameter\n if (rexpr !== null) {\n const rObj = asObj(rexpr);\n if (!isAConst(rObj) && !isParamRef(rObj)) return false;\n }\n return true;\n }\n\n // NullTest on a subquery column\n const nullTest = nodeGet(node, \"NullTest\");\n if (nullTest !== null && nullTest !== undefined) {\n const nt = asObj(nullTest);\n const arg = nodeGet(nt, \"arg\");\n if (arg !== null && isColumnRef(asObj(arg))) {\n try {\n const col = extractColumnName(asObj(arg));\n return subqueryColumns.has(col);\n } catch {\n return false;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Push safe WHERE predicates into a view or derived table subquery.\n * Only applies when FROM is a single view/derived table and\n * WHERE references only the subquery's output columns.\n */\n private _tryPredicatePushdown(\n stmt: Record<string, unknown>,\n _params: unknown[],\n ): Record<string, unknown> {\n const whereClause = nodeGet(stmt, \"whereClause\");\n if (whereClause === null || whereClause === undefined) return stmt;\n const fromClause = asList(nodeGet(stmt, \"fromClause\"));\n if (fromClause.length !== 1) return stmt;\n\n const fromNode = fromClause[0]!;\n\n // Identify the subquery\n let subquery: Record<string, unknown> | null = null;\n const rv = asObj(nodeGet(fromNode, \"RangeVar\") ?? {});\n const rss = asObj(nodeGet(fromNode, \"RangeSubselect\") ?? {});\n\n if (Object.keys(rv).length > 0) {\n const tName = extractRelName(rv);\n // Check if it's a view\n if (this._views.has(tName)) {\n subquery = this._views.get(tName)!;\n } else if (this._inlinedCTEs.has(tName)) {\n subquery = this._inlinedCTEs.get(tName)!;\n }\n } else if (Object.keys(rss).length > 0) {\n const sq = nodeGet(rss, \"subquery\");\n if (sq !== null && sq !== undefined) {\n subquery = asObj(nodeGet(asObj(sq), \"SelectStmt\") ?? sq);\n }\n }\n\n if (subquery === null) return stmt;\n\n // Do not push into subqueries with aggregates, GROUP BY, DISTINCT, LIMIT, window\n if (\n nodeGet(subquery, \"groupClause\") !== null &&\n asList(nodeGet(subquery, \"groupClause\")).length > 0\n )\n return stmt;\n if (\n nodeGet(subquery, \"distinctClause\") !== null &&\n nodeGet(subquery, \"distinctClause\") !== undefined\n )\n return stmt;\n if (\n nodeGet(subquery, \"limitCount\") !== null &&\n nodeGet(subquery, \"limitCount\") !== undefined\n )\n return stmt;\n const sqTargetList = asList(nodeGet(subquery, \"targetList\"));\n for (const t of sqTargetList) {\n const rt = asObj(nodeGet(t, \"ResTarget\") ?? t);\n const val = nodeGet(rt, \"val\");\n if (\n val !== null &&\n val !== undefined &&\n isFuncCall(asObj(val)) &&\n hasOverClause(asObj(val))\n )\n return stmt;\n }\n if (this._hasAggregates(sqTargetList)) return stmt;\n\n // Collect output column names\n const subqueryColumns = new Set<string>();\n for (const t of sqTargetList) {\n const rt = asObj(nodeGet(t, \"ResTarget\") ?? t);\n const alias = nodeStr(rt, \"name\");\n if (alias) {\n subqueryColumns.add(alias);\n } else {\n const val = nodeGet(rt, \"val\");\n if (val !== null && isColumnRef(asObj(val))) {\n try {\n subqueryColumns.add(extractColumnName(asObj(val)));\n } catch {\n // skip\n }\n }\n }\n }\n if (subqueryColumns.size === 0) return stmt;\n\n // Split WHERE into pushable and remaining\n const [pushable, remaining] = this._splitPushable(\n asObj(whereClause),\n subqueryColumns,\n );\n if (pushable.length === 0) return stmt;\n\n // Build the pushed predicate\n const pushedPred =\n pushable.length === 1\n ? pushable[0]!\n : { BoolExpr: { boolop: 0, args: pushable } };\n\n // Inject into the subquery/view\n if (Object.keys(rv).length > 0) {\n const tName = extractRelName(rv);\n if (this._views.has(tName)) {\n this._views.set(\n tName,\n SQLCompiler._injectWhere(this._views.get(tName)!, pushedPred),\n );\n } else if (this._inlinedCTEs.has(tName)) {\n this._inlinedCTEs.set(\n tName,\n SQLCompiler._injectWhere(this._inlinedCTEs.get(tName)!, pushedPred),\n );\n }\n }\n\n // Return stmt with reduced WHERE\n return { ...stmt, whereClause: remaining };\n }\n\n /**\n * Split a WHERE clause into pushable and remaining predicates.\n */\n private _splitPushable(\n whereNode: Record<string, unknown>,\n subqueryColumns: Set<string>,\n ): [Record<string, unknown>[], Record<string, unknown> | null] {\n const boolExpr = asObj(nodeGet(whereNode, \"BoolExpr\") ?? {});\n if (Object.keys(boolExpr).length > 0) {\n const boolop = nodeGet(boolExpr, \"boolop\");\n if (boolop === 0 || boolop === \"AND_EXPR\") {\n const args = asList(nodeGet(boolExpr, \"args\"));\n const pushable: Record<string, unknown>[] = [];\n const remaining: Record<string, unknown>[] = [];\n for (const arg of args) {\n if (this._isPushablePredicate(arg, subqueryColumns)) {\n pushable.push(arg);\n } else {\n remaining.push(arg);\n }\n }\n let remainingNode: Record<string, unknown> | null = null;\n if (remaining.length === 1) {\n remainingNode = remaining[0]!;\n } else if (remaining.length > 1) {\n remainingNode = { BoolExpr: { boolop: 0, args: remaining } };\n }\n return [pushable, remainingNode];\n }\n }\n\n // Single predicate\n if (this._isPushablePredicate(whereNode, subqueryColumns)) {\n return [[whereNode], null];\n }\n return [[], whereNode];\n }\n\n /**\n * Return a copy of *query* with *predicate* AND-merged into WHERE.\n */\n private static _injectWhere(\n query: Record<string, unknown>,\n predicate: Record<string, unknown>,\n ): Record<string, unknown> {\n const existing = nodeGet(query, \"whereClause\");\n let newWhere: Record<string, unknown>;\n if (existing === null || existing === undefined) {\n newWhere = predicate;\n } else {\n newWhere = {\n BoolExpr: { boolop: 0, args: [existing, predicate] },\n };\n }\n return { ...query, whereClause: newWhere };\n }\n\n /**\n * Extract a numeric value from an AST constant node or parameter reference.\n */\n private _extractNumericValue(node: Record<string, unknown>): number {\n const val = extractConstValue(node, this._params);\n if (typeof val === \"number\") return val;\n if (typeof val === \"string\") {\n const n = Number(val);\n if (!isNaN(n)) return n;\n }\n throw new Error(\n \"Expected numeric constant or $N parameter, got \" +\n JSON.stringify(node).slice(0, 200),\n );\n }\n\n /**\n * Check if a target list contains SELECT *.\n */\n private static _isSelectStar(targetList: Record<string, unknown>[]): boolean {\n if (targetList.length === 0) return true;\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const val = nodeGet(resTarget, \"val\");\n if (val !== null && val !== undefined && isAStar(asObj(val))) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if any SELECT target is a computed expression (not a simple column).\n * This includes function calls, CASE, CAST, arithmetic, etc.\n */\n private static _hasComputedExpressions(\n targetList: Record<string, unknown>[],\n ): boolean {\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const val = nodeGet(resTarget, \"val\");\n if (val === null || val === undefined) continue;\n const valObj = asObj(val);\n if (isColumnRef(valObj)) continue;\n if (isFuncCall(valObj)) {\n const fn = getFuncName(valObj);\n if (AGG_FUNC_NAMES.has(fn)) continue;\n // UQA scoring functions are not computed expressions in the usual sense\n if (\n fn === \"text_match\" ||\n fn === \"bayesian_match\" ||\n fn === \"bayesian_match_with_prior\" ||\n fn === \"knn_match\" ||\n fn === \"bayesian_knn_match\" ||\n fn === \"traverse_match\" ||\n fn === \"spatial_within\"\n )\n continue;\n return true;\n }\n // A_Const, A_Expr, CaseExpr, TypeCast, CoalesceExpr, NullTest, SubLink\n if (\n isAConst(valObj) ||\n isAExpr(valObj) ||\n nodeGet(valObj, \"A_Expr\") !== null ||\n nodeGet(valObj, \"CaseExpr\") !== null ||\n isTypeCast(valObj) ||\n nodeGet(valObj, \"CoalesceExpr\") !== null ||\n isNullTest(valObj) ||\n isSubLink(valObj) ||\n nodeGet(valObj, \"SubLink\") !== null\n ) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Infer the output column name for a single SELECT target.\n * Follows PostgreSQL naming conventions.\n */\n private _inferTargetName(target: Record<string, unknown>): string {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const alias = nodeStr(resTarget, \"name\");\n if (alias) return alias;\n\n const val = nodeGet(resTarget, \"val\");\n if (val === null || val === undefined) return \"?column?\";\n const valObj = asObj(val);\n\n if (isColumnRef(valObj)) {\n try {\n return extractColumnName(valObj);\n } catch {\n return \"?column?\";\n }\n }\n\n if (isFuncCall(valObj)) {\n const fn = getFuncName(valObj);\n if (AGG_FUNC_NAMES.has(fn)) {\n if (isAggStar(valObj)) return fn;\n const args = getFuncArgs(valObj);\n if (args.length > 0 && isColumnRef(args[0]!)) {\n try {\n const argCol = extractColumnName(args[0]!);\n return `${fn}_${argCol}`;\n } catch {\n return fn;\n }\n }\n return fn;\n }\n if (\n fn === \"text_match\" ||\n fn === \"bayesian_match\" ||\n fn === \"bayesian_match_with_prior\"\n ) {\n return \"_score\";\n }\n return fn;\n }\n\n if (isTypeCast(valObj)) {\n const tc = asObj(nodeGet(valObj, \"TypeCast\") ?? valObj);\n const arg = nodeGet(tc, \"arg\");\n if (arg !== null && isColumnRef(asObj(arg))) {\n try {\n return extractColumnName(asObj(arg));\n } catch {\n // fall through\n }\n }\n }\n\n return \"?column?\";\n }\n\n /**\n * Build (output_name, ast_node) pairs for SELECT targets.\n * Text search functions are mapped to read _score from the row.\n */\n private _buildExprTargets(\n targetList: Record<string, unknown>[],\n ): [string, Record<string, unknown>][] {\n const targets: [string, Record<string, unknown>][] = [];\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const outputName = this._inferTargetName(target);\n let val = nodeGet(resTarget, \"val\");\n if (val === null || val === undefined) continue;\n const valObj = asObj(val);\n if (isFuncCall(valObj)) {\n const fn = getFuncName(valObj);\n if (\n fn === \"text_match\" ||\n fn === \"bayesian_match\" ||\n fn === \"bayesian_match_with_prior\"\n ) {\n val = { ColumnRef: { fields: [{ String: { sval: \"_score\" } }] } };\n }\n }\n targets.push([outputName, asObj(val)]);\n }\n return targets;\n }\n\n /**\n * Check if ORDER BY references columns not in the SELECT list.\n */\n private _sortNeedsExtraCols(\n sortClause: Record<string, unknown>[],\n targetList: Record<string, unknown>[],\n ): boolean {\n const projected = new Set<string>();\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const val = nodeGet(resTarget, \"val\");\n if (val !== null && val !== undefined && isAStar(asObj(val))) return false;\n if (val !== null && isColumnRef(asObj(val))) {\n try {\n projected.add(extractColumnName(asObj(val)));\n } catch {\n // skip\n }\n const alias = nodeStr(resTarget, \"name\");\n if (alias) projected.add(alias);\n } else {\n const alias = nodeStr(resTarget, \"name\");\n if (alias) projected.add(alias);\n }\n }\n\n for (const item of sortClause) {\n const sortBy = asObj(nodeGet(item, \"SortBy\") ?? item);\n const sortNode = asObj(nodeGet(sortBy, \"node\"));\n if (isColumnRef(sortNode)) {\n try {\n const col = extractColumnName(sortNode);\n if (!projected.has(col)) return true;\n } catch {\n // skip\n }\n }\n }\n return false;\n }\n\n /**\n * Build group column -> alias mapping for GROUP BY queries.\n */\n private _buildGroupAliases(\n groupCols: string[],\n targetList: Record<string, unknown>[],\n ): Map<string, string> {\n const aliases = new Map<string, string>();\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const val = nodeGet(resTarget, \"val\");\n const alias = nodeStr(resTarget, \"name\");\n if (val !== null && isColumnRef(asObj(val)) && alias) {\n try {\n const col = extractColumnName(asObj(val));\n if (groupCols.includes(col)) {\n aliases.set(col, alias);\n }\n } catch {\n // skip\n }\n }\n }\n return aliases;\n }\n\n /**\n * Build ExprProjectOp targets for non-aggregate computed expressions\n * in a GROUP BY SELECT list. Returns null when no post-group computation needed.\n */\n private _buildPostGroupTargets(\n targetList: Record<string, unknown>[],\n groupCols: string[],\n aggAliases: Set<string>,\n ): [string, Record<string, unknown>][] | null {\n let hasComputed = false;\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const val = nodeGet(resTarget, \"val\");\n if (val === null || val === undefined) continue;\n const valObj = asObj(val);\n if (isFuncCall(valObj)) {\n const fn = getFuncName(valObj);\n if (!AGG_FUNC_NAMES.has(fn) || hasOverClause(valObj)) {\n hasComputed = true;\n break;\n }\n } else if (!isColumnRef(valObj)) {\n const name = nodeStr(resTarget, \"name\") || \"?column?\";\n if (!aggAliases.has(name)) {\n hasComputed = true;\n break;\n }\n }\n }\n\n if (!hasComputed) return null;\n\n const groupSet = new Set(groupCols);\n const targets: [string, Record<string, unknown>][] = [];\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const name = nodeStr(resTarget, \"name\") || this._inferTargetName(target);\n if (aggAliases.has(name) || groupSet.has(name)) {\n targets.push([name, { ColumnRef: { fields: [{ String: { sval: name } }] } }]);\n } else {\n const val = nodeGet(resTarget, \"val\");\n if (val !== null && isColumnRef(asObj(val))) {\n try {\n const col = extractColumnName(asObj(val));\n targets.push([\n name,\n { ColumnRef: { fields: [{ String: { sval: col } }] } },\n ]);\n } catch {\n targets.push([name, asObj(val)]);\n }\n } else {\n targets.push([name, asObj(val ?? {})]);\n }\n }\n }\n return targets;\n }\n\n /**\n * Build pre-aggregation targets for GROUP BY computed expressions\n * or aggregate expression args (e.g., SUM(CASE ...)).\n */\n private _buildPreAggTargets(\n groupClause: Record<string, unknown>[],\n groupCols: string[],\n aggSpecs: { inputExpr?: Record<string, unknown> }[],\n table: Table | null,\n ): [string, Record<string, unknown>][] | null {\n const exprTargets: [string, Record<string, unknown>][] = [];\n\n // GROUP BY computed expressions\n for (let idx = 0; idx < groupClause.length; idx++) {\n const g = groupClause[idx]!;\n if (isFuncCall(g) || nodeGet(g, \"FuncCall\") !== null) {\n if (idx < groupCols.length) {\n exprTargets.push([groupCols[idx]!, g]);\n }\n }\n }\n\n // Aggregate expression args\n for (const spec of aggSpecs) {\n if (spec.inputExpr !== undefined) {\n // The expression needs to be pre-computed\n exprTargets.push([\"_agg_expr\", spec.inputExpr]);\n }\n }\n\n if (exprTargets.length === 0) return null;\n\n // Pass through all table columns, then append computed expression columns\n const targets: [string, Record<string, unknown>][] = [];\n if (table) {\n for (const colName of table.columnNames) {\n targets.push([\n colName,\n { ColumnRef: { fields: [{ String: { sval: colName } }] } },\n ]);\n }\n }\n for (const [alias, node] of exprTargets) {\n targets.push([alias, node]);\n }\n return targets;\n }\n\n /**\n * Resolve GROUP BY items: column names, aliases, or ordinals.\n * Returns the list of group column names.\n */\n private _resolveGroupByCols(\n groupClause: Record<string, unknown>[],\n targetList: Record<string, unknown>[],\n ): string[] {\n // Build alias map from SELECT list\n const aliasMap = new Map<string, string>();\n const selectCols: string[] = [];\n for (const target of targetList) {\n const resTarget = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const val = nodeGet(resTarget, \"val\");\n const alias = nodeStr(resTarget, \"name\");\n if (val !== null && isColumnRef(asObj(val))) {\n try {\n const col = extractColumnName(asObj(val));\n selectCols.push(alias || col);\n if (alias) aliasMap.set(alias, col);\n } catch {\n selectCols.push(alias || \"?column?\");\n }\n } else if (val !== null && isFuncCall(asObj(val))) {\n const fn = getFuncName(asObj(val));\n let name: string;\n if (isAggStar(asObj(val))) {\n name = fn;\n } else {\n const args = getFuncArgs(asObj(val));\n let colArg: string | null = null;\n for (const a of args) {\n if (isColumnRef(a)) {\n try {\n colArg = extractColumnName(a);\n } catch {\n // skip\n }\n }\n }\n name = colArg !== null ? `${fn}_${colArg}` : fn;\n }\n selectCols.push(alias || name);\n } else {\n selectCols.push(alias || \"?column?\");\n }\n }\n\n const result: string[] = [];\n for (const g of groupClause) {\n // Ordinal reference: GROUP BY 1, 2\n if (isAConst(g)) {\n const val = extractConstValue(g, []);\n if (typeof val === \"number\" && Number.isInteger(val)) {\n const idx = val - 1;\n if (idx >= 0 && idx < selectCols.length) {\n result.push(selectCols[idx]!);\n continue;\n }\n throw new Error(`GROUP BY position ${String(val)} is not in select list`);\n }\n }\n\n // Column reference\n if (isColumnRef(g)) {\n try {\n const col = extractColumnName(g);\n result.push(aliasMap.get(col) ?? col);\n continue;\n } catch {\n // fall through\n }\n }\n\n // FuncCall in GROUP BY\n if (isFuncCall(g) || nodeGet(g, \"FuncCall\") !== null) {\n const fn = getFuncName(g);\n // Match against SELECT targets by function name\n let matched: string | null = null;\n for (const target of targetList) {\n const rt = asObj(nodeGet(target, \"ResTarget\") ?? target);\n const tVal = nodeGet(rt, \"val\");\n const tAlias = nodeStr(rt, \"name\");\n if (\n tVal !== null &&\n isFuncCall(asObj(tVal)) &&\n getFuncName(asObj(tVal)) === fn &&\n tAlias\n ) {\n matched = tAlias;\n break;\n }\n }\n if (matched !== null) {\n result.push(matched);\n } else {\n const args = getFuncArgs(g);\n let colArg: string | null = null;\n for (const a of args) {\n if (isColumnRef(a)) {\n try {\n colArg = extractColumnName(a);\n } catch {\n // skip\n }\n }\n }\n result.push(colArg !== null ? `${fn}_${colArg}` : fn);\n }\n continue;\n }\n\n // Fallback\n try {\n result.push(extractColumnName(g));\n } catch {\n result.push(\"?column?\");\n }\n }\n return result;\n }\n\n /**\n * Get a table by name, throwing if it doesn't exist.\n */\n private _getTable(tableName: string): Table {\n const table = this._tables.get(tableName);\n if (!table) {\n throw new Error(`Table \"${tableName}\" does not exist`);\n }\n return table;\n }\n\n /**\n * Substitute $N parameter references in an AST with A_Const values.\n */\n private _substituteParams(\n node: Record<string, unknown>,\n paramValues: Map<number, Record<string, unknown>>,\n ): Record<string, unknown> {\n // If this is a ParamRef, replace it\n const paramRef = nodeGet(node, \"ParamRef\");\n if (paramRef !== null && paramRef !== undefined) {\n const prObj = asObj(paramRef);\n const num = prObj[\"number\"] as number;\n const replacement = paramValues.get(num);\n if (replacement !== undefined) {\n return replacement;\n }\n return node;\n }\n\n // Recursively process child nodes\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(node)) {\n if (Array.isArray(value)) {\n result[key] = (value as unknown[]).map((item: unknown): unknown => {\n if (item !== null && typeof item === \"object\") {\n return this._substituteParams(item as Record<string, unknown>, paramValues);\n }\n return item;\n });\n } else if (value !== null && typeof value === \"object\") {\n result[key] = this._substituteParams(\n value as Record<string, unknown>,\n paramValues,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n /**\n * Check whether an AST node has outer-row references (correlated subquery).\n */\n private _hasOuterRefs(\n node: Record<string, unknown>,\n outerColumns: Set<string>,\n ): boolean {\n // Check ColumnRef against outer columns\n if (isColumnRef(node)) {\n try {\n const col = extractColumnName(node);\n if (outerColumns.has(col)) return true;\n const qual = extractQualifiedColumnName(node);\n if (outerColumns.has(qual)) return true;\n } catch {\n // Not a valid column ref\n }\n }\n\n // Recurse into child nodes\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n if (\n item !== null &&\n typeof item === \"object\" &&\n this._hasOuterRefs(item as Record<string, unknown>, outerColumns)\n ) {\n return true;\n }\n }\n } else if (value !== null && typeof value === \"object\") {\n if (this._hasOuterRefs(value as Record<string, unknown>, outerColumns)) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Build sort key specifications from an ORDER BY clause.\n * Handles column names, aliases, ordinal references, and NULLS FIRST/LAST.\n */\n private _buildSortKeys(\n sortClause: Record<string, unknown>[],\n targetList: Record<string, unknown>[],\n ): Array<{ column: string; ascending: boolean; nullsFirst: boolean }> {\n // Build ordinal and alias maps from the SELECT list\n const ordinalMap = new Map<number, string>();\n const aliasNames = new Set<string>();\n const originalToAlias = new Map<string, string>();\n\n for (let idx = 0; idx < targetList.length; idx++) {\n const resTarget = asObj(\n nodeGet(targetList[idx]!, \"ResTarget\") ?? targetList[idx],\n );\n const val = nodeGet(resTarget, \"val\");\n const name = nodeStr(resTarget, \"name\");\n if (val !== null && val !== undefined && !isAStar(asObj(val))) {\n let colName: string;\n try {\n colName = name || this._deriveColumnName(asObj(val));\n } catch {\n colName = name || \"?column?\";\n }\n ordinalMap.set(idx + 1, colName);\n if (name) {\n aliasNames.add(name);\n if (isColumnRef(asObj(val))) {\n try {\n const realCol = extractColumnName(asObj(val));\n originalToAlias.set(realCol, name);\n } catch {\n // ignore\n }\n }\n }\n }\n }\n\n const sortKeys: Array<{ column: string; ascending: boolean; nullsFirst: boolean }> =\n [];\n for (const sortItem of sortClause) {\n const item = asObj(nodeGet(sortItem, \"SortBy\") ?? sortItem);\n const sortNode = asObj(nodeGet(item, \"node\"));\n\n // Determine direction\n const dir = nodeGet(item, \"sortby_dir\");\n const isDesc = dir === 2 || dir === \"SORTBY_DESC\" || String(dir).includes(\"DESC\");\n const ascending = !isDesc;\n\n // Determine nulls placement\n const nullsDir = nodeGet(item, \"sortby_nulls\");\n let nullsFirst: boolean;\n if (\n nullsDir === 1 ||\n nullsDir === \"SORTBY_NULLS_FIRST\" ||\n String(nullsDir).includes(\"FIRST\")\n ) {\n nullsFirst = true;\n } else if (\n nullsDir === 2 ||\n nullsDir === \"SORTBY_NULLS_LAST\" ||\n String(nullsDir).includes(\"LAST\")\n ) {\n nullsFirst = false;\n } else {\n // PostgreSQL default: NULLS FIRST for DESC, NULLS LAST for ASC\n nullsFirst = isDesc;\n }\n\n // Resolve column name: ordinal, alias, or column reference\n let col: string;\n if (isAConst(sortNode)) {\n const ordinal = Number(extractConstValue(sortNode, this._params));\n const mapped = ordinalMap.get(ordinal);\n if (!mapped) {\n throw new Error(`ORDER BY position ${String(ordinal)} is not in select list`);\n }\n col = mapped;\n } else {\n try {\n col = extractColumnName(sortNode);\n } catch {\n col = this._deriveColumnName(sortNode);\n }\n // If col is an original column that was aliased, use alias\n if (!aliasNames.has(col) && originalToAlias.has(col)) {\n col = originalToAlias.get(col)!;\n }\n }\n\n sortKeys.push({ column: col, ascending, nullsFirst });\n }\n\n return sortKeys;\n }\n}\n\n// ======================================================================\n// Internal operator classes\n// ======================================================================\n\n/**\n * Scans all documents in the store.\n */\nclass ScanOperator extends Operator {\n execute(context: ExecutionContext): PostingList {\n const ds = context.documentStore;\n if (!ds) return new PostingList();\n const allIds = [...ds.docIds].sort((a, b) => a - b);\n return new PostingList(allIds.map((d) => createPostingEntry(d, { score: 0.0 })));\n }\n\n costEstimate(stats: IndexStats): number {\n return stats.totalDocs;\n }\n}\n\n/**\n * Scans a specific table, eagerly loading document fields.\n * Used by JOIN operators that need full document data for ON evaluation.\n */\nclass TableScanOperator extends Operator {\n readonly _table: Table;\n readonly _alias: string | null;\n\n constructor(table: Table, alias: string | null = null) {\n super();\n this._table = table;\n this._alias = alias;\n }\n\n execute(_context: ExecutionContext): PostingList {\n const entries: PostingEntryType[] = [];\n const alias = this._alias;\n const colNames = this._table.columnNames;\n const ds = this._table.documentStore;\n for (const docId of [...ds.docIds].sort((a, b) => a - b)) {\n const doc = ds.get(docId);\n const fields: Record<string, unknown> = doc ? { ...doc } : {};\n for (const colName of colNames) {\n if (!(colName in fields)) {\n fields[colName] = null;\n }\n }\n if (alias) {\n const qualified: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(fields)) {\n qualified[`${alias}.${k}`] = v;\n }\n Object.assign(fields, qualified);\n }\n entries.push(createPostingEntry(docId, { score: 0.0, fields }));\n }\n return new PostingList(entries);\n }\n\n costEstimate(_stats: { totalDocs: number }): number {\n return this._table.documentStore.docIds.size;\n }\n}\n\n/**\n * Execute compiled UQA operators against a table for JOIN predicate pushdown.\n */\nexport class CompiledWhereScanOperator extends Operator {\n private readonly _table: Table;\n private readonly _uqaOp: Operator;\n private readonly _ctx: ExecutionContext;\n private readonly _alias: string | null;\n private readonly _scalarFilter: Record<string, unknown> | null;\n private readonly _subqueryExecutor:\n | ((stmt: Record<string, unknown>, params: unknown[]) => SQLResult)\n | null;\n private readonly _params: unknown[];\n\n constructor(\n table: Table,\n uqaOp: Operator,\n ctx: ExecutionContext,\n alias: string | null = null,\n scalarFilter: Record<string, unknown> | null = null,\n subqueryExecutor:\n | ((stmt: Record<string, unknown>, params: unknown[]) => SQLResult)\n | null = null,\n params: unknown[] = [],\n ) {\n super();\n this._table = table;\n this._uqaOp = uqaOp;\n this._ctx = ctx;\n this._alias = alias;\n this._scalarFilter = scalarFilter;\n this._subqueryExecutor = subqueryExecutor;\n this._params = params;\n }\n\n execute(_context: ExecutionContext): PostingList {\n const pl = this._uqaOp.execute(this._ctx);\n\n let evaluator: ExprEvaluator | null = null;\n if (this._scalarFilter !== null) {\n evaluator = new ExprEvaluator({ params: this._params });\n }\n\n const alias = this._alias;\n const colNames = this._table.columnNames;\n const ds = this._table.documentStore;\n const entries: PostingEntryType[] = [];\n\n for (const entry of pl) {\n const doc = ds.get(entry.docId);\n if (!doc) continue;\n const fields: Record<string, unknown> = { ...doc };\n for (const colName of colNames) {\n if (!(colName in fields)) {\n fields[colName] = null;\n }\n }\n if (alias) {\n const qualified: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(fields)) {\n qualified[`${alias}.${k}`] = v;\n }\n Object.assign(fields, qualified);\n }\n if (evaluator && !evaluator.evaluate(this._scalarFilter!, fields)) {\n continue;\n }\n entries.push(\n createPostingEntry(entry.docId, {\n score: entry.payload.score,\n fields,\n }),\n );\n }\n return new PostingList(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return stats.totalDocs * 0.3;\n }\n}\n\n/**\n * Wraps a scan operator and filters its output using a WHERE predicate.\n */\nexport class FilteredScanOperator extends Operator {\n private readonly _scan: TableScanOperator;\n private readonly _whereNode: Record<string, unknown>;\n private readonly _subqueryExecutor:\n | ((stmt: Record<string, unknown>, params: unknown[]) => SQLResult)\n | null;\n private readonly _params: unknown[];\n\n constructor(\n scan: TableScanOperator,\n whereNode: Record<string, unknown>,\n subqueryExecutor:\n | ((stmt: Record<string, unknown>, params: unknown[]) => SQLResult)\n | null = null,\n params: unknown[] = [],\n ) {\n super();\n this._scan = scan;\n this._whereNode = whereNode;\n this._subqueryExecutor = subqueryExecutor;\n this._params = params;\n }\n\n execute(context: ExecutionContext): PostingList {\n const pl = this._scan.execute(context);\n const evaluator = new ExprEvaluator({ params: this._params });\n const filtered: PostingEntryType[] = [];\n for (const entry of pl) {\n if (\n evaluator.evaluate(\n this._whereNode,\n entry.payload.fields as Record<string, unknown>,\n )\n ) {\n filtered.push(entry);\n }\n }\n return new PostingList(filtered);\n }\n\n costEstimate(stats: IndexStats): number {\n return this._scan.costEstimate(stats) * 0.5;\n }\n}\n\n/**\n * Filter rows using an arbitrary expression via ExprEvaluator.\n * Used for WHERE clauses that cannot be reduced to simple FilterOperator.\n */\nclass ExprFilterOperator extends Operator {\n readonly exprNode: Record<string, unknown>;\n private readonly _subqueryExecutor:\n | ((stmt: Record<string, unknown>) => SQLResult)\n | null;\n\n constructor(\n exprNode: Record<string, unknown>,\n subqueryExecutor: ((stmt: Record<string, unknown>) => SQLResult) | null = null,\n ) {\n super();\n this.exprNode = exprNode;\n this._subqueryExecutor = subqueryExecutor;\n }\n\n execute(context: ExecutionContext): PostingList {\n const evaluator = new ExprEvaluator();\n const ds = context.documentStore;\n if (!ds) return new PostingList();\n\n const entries: PostingEntryType[] = [];\n for (const docId of [...ds.docIds].sort((a, b) => a - b)) {\n const doc = ds.get(docId);\n if (!doc) continue;\n const result = evaluator.evaluate(this.exprNode, doc);\n if (result) {\n entries.push(createPostingEntry(docId, { score: 0.0 }));\n }\n }\n return new PostingList(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return stats.totalDocs;\n }\n}\n\n/**\n * Internal operator for Bayesian BM25 with external prior.\n */\nclass ExternalPriorSearchOperator extends Operator {\n readonly source: Operator;\n readonly scorer: unknown;\n readonly terms: string[];\n readonly field: string | null;\n readonly documentStore: unknown;\n\n constructor(\n source: Operator,\n scorer: unknown,\n terms: string[],\n field: string | null,\n documentStore: unknown,\n ) {\n super();\n this.source = source;\n this.scorer = scorer;\n this.terms = terms;\n this.field = field;\n this.documentStore = documentStore;\n }\n\n execute(context: ExecutionContext): PostingList {\n const sourcePl = this.source.execute(context);\n const docStore = (this.documentStore ?? context.documentStore) as {\n get(id: number): Record<string, unknown> | null;\n } | null;\n const idx = context.invertedIndex;\n const entries: PostingEntryType[] = [];\n\n const scorerObj = this.scorer as {\n scoreWithPrior(\n tf: number,\n docLength: number,\n docFreq: number,\n docFields: Record<string, unknown>,\n ): number;\n };\n\n for (const entry of sourcePl) {\n const docId = entry.docId;\n const docFields = docStore?.get(docId) ?? {};\n const tf =\n entry.payload.positions.length > 0 ? entry.payload.positions.length : 1;\n const fieldKey = this.field ?? \"_default\";\n let docLength = tf;\n const idxObj = idx as unknown as Record<string, unknown>;\n if (idx && typeof idxObj[\"getDocLength\"] === \"function\") {\n docLength = (\n idx as unknown as { getDocLength(id: number, field: string): number }\n ).getDocLength(docId, fieldKey);\n }\n const docFreq = sourcePl.length;\n\n const score = scorerObj.scoreWithPrior(tf, docLength, docFreq, docFields);\n entries.push(createPostingEntry(docId, { score }));\n }\n\n return new PostingList(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return this.source.costEstimate(stats) * 1.1;\n }\n}\n\n/**\n * KNN search with scores calibrated to probabilities.\n * P_vector = (1 + cosine_similarity) / 2 (Definition 7.1.2, Paper 3)\n */\nclass CalibratedKNNOperator extends Operator {\n readonly queryVector: Float64Array;\n readonly k: number;\n readonly field: string;\n\n constructor(queryVector: Float64Array, k: number, field = \"embedding\") {\n super();\n this.queryVector = queryVector;\n this.k = k;\n this.field = field;\n }\n\n execute(context: ExecutionContext): PostingList {\n // Try vector index first, then fallback to brute-force KNN\n const vecIdx = context.vectorIndexes?.[this.field];\n let rawPl: PostingList;\n if (vecIdx) {\n rawPl = (\n vecIdx as unknown as {\n searchKnn(vec: Float64Array, k: number): PostingList;\n }\n ).searchKnn(this.queryVector, this.k);\n } else {\n // Brute-force KNN\n const knnOp = new KNNOperator(this.queryVector, this.k, this.field);\n rawPl = knnOp.execute(context);\n }\n // Calibrate: P = (1 + cos) / 2\n const entries: PostingEntryType[] = [];\n for (const e of rawPl) {\n entries.push(\n createPostingEntry(e.docId, {\n score: (1.0 + e.payload.score) / 2.0,\n }),\n );\n }\n return new PostingList(entries);\n }\n\n costEstimate(stats: IndexStats): number {\n return (stats.dimensions || 128) * Math.log2(stats.totalDocs + 1);\n }\n}\n\n/**\n * Lazy semi-join filter for decorrelated EXISTS subqueries.\n */\nexport class SemiJoinFilterOperator extends Operator {\n private readonly _outerCol: string;\n private readonly _innerCol: string;\n private readonly _innerSubselect: Record<string, unknown>;\n private readonly _subqueryExecutor: (\n stmt: Record<string, unknown>,\n params?: unknown[],\n ) => SQLResult;\n\n constructor(\n outerCol: string,\n innerCol: string,\n innerSubselect: Record<string, unknown>,\n subqueryExecutor: (stmt: Record<string, unknown>, params?: unknown[]) => SQLResult,\n ) {\n super();\n this._outerCol = outerCol;\n this._innerCol = innerCol;\n this._innerSubselect = innerSubselect;\n this._subqueryExecutor = subqueryExecutor;\n }\n\n execute(context: ExecutionContext): PostingList {\n const innerResult = this._subqueryExecutor(this._innerSubselect);\n if (innerResult.rows.length === 0) {\n return new PostingList();\n }\n\n const values = new Set<unknown>();\n for (const row of innerResult.rows) {\n const v = row[this._innerCol];\n if (v !== null && v !== undefined) values.add(v);\n }\n return new FilterOperator(this._outerCol, new InSet(values)).execute(context);\n }\n\n costEstimate(stats: IndexStats): number {\n return stats.totalDocs * 1.5;\n }\n}\n\n/**\n * Nested-loop join with arbitrary ON expression evaluation.\n */\nexport class ExprJoinOperator extends Operator {\n private readonly _left: Operator;\n private readonly _right: Operator;\n private readonly _quals: Record<string, unknown>;\n private readonly _joinType: number | string;\n private readonly _params: unknown[];\n\n constructor(\n left: Operator,\n right: Operator,\n quals: Record<string, unknown>,\n joinType: number | string,\n params: unknown[] = [],\n ) {\n super();\n this._left = left;\n this._right = right;\n this._quals = quals;\n this._joinType = joinType;\n this._params = params;\n }\n\n execute(context: ExecutionContext): PostingList {\n const evaluator = new ExprEvaluator({ params: this._params });\n const leftEntries = [...this._left.execute(context)];\n const rightEntries = [...this._right.execute(context)];\n\n const jt = this._joinType;\n const quals = this._quals;\n\n // JOIN_INNER = 0\n if (jt === 0 || jt === \"JOIN_INNER\") {\n return ExprJoinOperator._inner(evaluator, quals, leftEntries, rightEntries);\n }\n // JOIN_LEFT = 1\n if (jt === 1 || jt === \"JOIN_LEFT\") {\n return ExprJoinOperator._leftOuter(evaluator, quals, leftEntries, rightEntries);\n }\n // JOIN_RIGHT = 2\n if (jt === 2 || jt === \"JOIN_RIGHT\") {\n return ExprJoinOperator._rightOuter(evaluator, quals, leftEntries, rightEntries);\n }\n // JOIN_FULL = 3\n if (jt === 3 || jt === \"JOIN_FULL\") {\n return ExprJoinOperator._fullOuter(evaluator, quals, leftEntries, rightEntries);\n }\n throw new Error(`Unsupported join type for expression join: ${String(jt)}`);\n }\n\n private static _inner(\n evaluator: ExprEvaluator,\n quals: Record<string, unknown>,\n leftEntries: PostingEntryType[],\n rightEntries: PostingEntryType[],\n ): PostingList {\n const result: PostingEntryType[] = [];\n for (const left of leftEntries) {\n for (const right of rightEntries) {\n const merged = {\n ...(left.payload.fields as Record<string, unknown>),\n ...(right.payload.fields as Record<string, unknown>),\n };\n if (evaluator.evaluate(quals, merged)) {\n result.push(\n createPostingEntry(left.docId, {\n score: left.payload.score + right.payload.score,\n fields: merged,\n }),\n );\n }\n }\n }\n return new PostingList(result);\n }\n\n private static _leftOuter(\n evaluator: ExprEvaluator,\n quals: Record<string, unknown>,\n leftEntries: PostingEntryType[],\n rightEntries: PostingEntryType[],\n ): PostingList {\n const result: PostingEntryType[] = [];\n for (const left of leftEntries) {\n let matched = false;\n for (const right of rightEntries) {\n const merged = {\n ...(left.payload.fields as Record<string, unknown>),\n ...(right.payload.fields as Record<string, unknown>),\n };\n if (evaluator.evaluate(quals, merged)) {\n matched = true;\n result.push(\n createPostingEntry(left.docId, {\n score: left.payload.score + right.payload.score,\n fields: merged,\n }),\n );\n }\n }\n if (!matched) {\n result.push(\n createPostingEntry(left.docId, {\n score: left.payload.score,\n fields: { ...(left.payload.fields as Record<string, unknown>) },\n }),\n );\n }\n }\n return new PostingList(result);\n }\n\n private static _rightOuter(\n evaluator: ExprEvaluator,\n quals: Record<string, unknown>,\n leftEntries: PostingEntryType[],\n rightEntries: PostingEntryType[],\n ): PostingList {\n const result: PostingEntryType[] = [];\n const matchedRight = new Set<number>();\n for (const left of leftEntries) {\n for (const right of rightEntries) {\n const merged = {\n ...(left.payload.fields as Record<string, unknown>),\n ...(right.payload.fields as Record<string, unknown>),\n };\n if (evaluator.evaluate(quals, merged)) {\n matchedRight.add(right.docId);\n result.push(\n createPostingEntry(left.docId, {\n score: left.payload.score + right.payload.score,\n fields: merged,\n }),\n );\n }\n }\n }\n for (const right of rightEntries) {\n if (!matchedRight.has(right.docId)) {\n result.push(\n createPostingEntry(right.docId, {\n score: right.payload.score,\n fields: { ...(right.payload.fields as Record<string, unknown>) },\n }),\n );\n }\n }\n return new PostingList(result);\n }\n\n private static _fullOuter(\n evaluator: ExprEvaluator,\n quals: Record<string, unknown>,\n leftEntries: PostingEntryType[],\n rightEntries: PostingEntryType[],\n ): PostingList {\n const result: PostingEntryType[] = [];\n const matchedRight = new Set<number>();\n for (const left of leftEntries) {\n let matched = false;\n for (const right of rightEntries) {\n const merged = {\n ...(left.payload.fields as Record<string, unknown>),\n ...(right.payload.fields as Record<string, unknown>),\n };\n if (evaluator.evaluate(quals, merged)) {\n matched = true;\n matchedRight.add(right.docId);\n result.push(\n createPostingEntry(left.docId, {\n score: left.payload.score + right.payload.score,\n fields: merged,\n }),\n );\n }\n }\n if (!matched) {\n result.push(\n createPostingEntry(left.docId, {\n score: left.payload.score,\n fields: { ...(left.payload.fields as Record<string, unknown>) },\n }),\n );\n }\n }\n for (const right of rightEntries) {\n if (!matchedRight.has(right.docId)) {\n result.push(\n createPostingEntry(right.docId, {\n score: right.payload.score,\n fields: { ...(right.payload.fields as Record<string, unknown>) },\n }),\n );\n }\n }\n return new PostingList(result);\n }\n}\n\n/**\n * LATERAL subquery join operator.\n */\nexport class LateralJoinOperator extends Operator {\n private readonly _left: Operator;\n private readonly _subquery: Record<string, unknown>;\n private readonly _alias: string;\n private readonly _subqueryExecutor: (\n stmt: Record<string, unknown>,\n params: unknown[],\n outerRow?: Record<string, unknown>,\n ) => SQLResult;\n\n constructor(\n left: Operator,\n subquery: Record<string, unknown>,\n alias: string,\n subqueryExecutor: (\n stmt: Record<string, unknown>,\n params: unknown[],\n outerRow?: Record<string, unknown>,\n ) => SQLResult,\n ) {\n super();\n this._left = left;\n this._subquery = subquery;\n this._alias = alias;\n this._subqueryExecutor = subqueryExecutor;\n }\n\n execute(context: ExecutionContext): PostingList {\n const leftEntries = [...this._left.execute(context)];\n const result: PostingEntryType[] = [];\n const alias = this._alias;\n\n for (const leftEntry of leftEntries) {\n const leftFields = leftEntry.payload.fields as Record<string, unknown>;\n const outerRow: Record<string, unknown> = { ...leftFields };\n const subResult = this._subqueryExecutor(this._subquery, [], outerRow);\n\n for (const row of subResult.rows) {\n const rightFields: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(row)) {\n rightFields[k] = v;\n rightFields[`${alias}.${k}`] = v;\n }\n const merged = { ...leftFields, ...rightFields };\n result.push(\n createPostingEntry(leftEntry.docId, {\n score: leftEntry.payload.score,\n fields: merged,\n }),\n );\n }\n }\n\n return new PostingList(result);\n }\n}\n\n// ======================================================================\n// Module-level helpers\n// ======================================================================\n\n/**\n * Convert an operator comparison string to a Predicate object.\n */\nfunction _opToPredicate(opName: string, value: unknown): Predicate {\n switch (opName) {\n case \"=\":\n return new Equals(value);\n case \"!=\":\n case \"<>\":\n return new NotEquals(value);\n case \">\":\n return new GreaterThan(Number(value));\n case \">=\":\n return new GreaterThanOrEqual(Number(value));\n case \"<\":\n return new LessThan(Number(value));\n case \"<=\":\n return new LessThanOrEqual(Number(value));\n default:\n throw new Error(`Unsupported operator: ${opName}`);\n }\n}\n\n/**\n * Convert a Python value to an A_Const-like AST node.\n */\nfunction _valueToAConst(value: unknown): Record<string, unknown> {\n if (value === null || value === undefined) {\n return { A_Const: { isnull: true } };\n }\n if (typeof value === \"boolean\") {\n return { A_Const: { boolval: value } };\n }\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) {\n return { A_Const: { ival: value } };\n }\n return { A_Const: { fval: String(value) } };\n }\n if (typeof value === \"string\") {\n return { A_Const: { sval: value } };\n }\n throw new Error(`Cannot convert ${typeof value} to A_Const`);\n}\n\n/**\n * Extract boolean truth value from an A_Const node.\n */\nfunction _constToBool(node: Record<string, unknown>): boolean | null {\n const aConst = asObj(nodeGet(node, \"A_Const\") ?? node);\n if (nodeGet(aConst, \"isnull\") === true) return null;\n const boolval = nodeGet(aConst, \"boolval\");\n if (boolval !== null && boolval !== undefined) return Boolean(boolval);\n const ival = nodeGet(aConst, \"ival\");\n if (ival !== null && ival !== undefined) return Number(ival) !== 0;\n const fval = nodeGet(aConst, \"fval\");\n if (fval !== null && fval !== undefined)\n return parseFloat(String(fval as string | number)) !== 0.0;\n const sval = nodeGet(aConst, \"sval\");\n if (sval !== null && sval !== undefined)\n return String(sval as string | number).length > 0;\n return null;\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- join base types\n// 1:1 port of uqa/joins/base.py\n\nimport type { DocId, GeneralizedPostingEntry, PostingEntry } from \"../core/types.js\";\nimport type { GeneralizedPostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"../operators/base.js\";\n\nexport interface JoinCondition {\n readonly leftField: string;\n readonly rightField: string;\n}\n\nexport type JoinEntry = PostingEntry | GeneralizedPostingEntry;\n\nexport function entryDocId(entry: JoinEntry): DocId {\n if (\"docIds\" in entry) return entry.docIds[0]!;\n return entry.docId;\n}\n\nexport abstract class JoinOperator {\n readonly left: unknown;\n readonly right: unknown;\n readonly condition: JoinCondition;\n\n constructor(left: unknown, right: unknown, condition: JoinCondition) {\n this.left = left;\n this.right = right;\n this.condition = condition;\n }\n\n abstract execute(context: ExecutionContext): GeneralizedPostingList;\n\n protected _getEntries(source: unknown, context: ExecutionContext): JoinEntry[] {\n if (\n source !== null &&\n typeof source === \"object\" &&\n \"execute\" in source &&\n typeof (source as { execute: unknown }).execute === \"function\"\n ) {\n const result = (\n source as { execute(ctx: ExecutionContext): { entries: JoinEntry[] } }\n ).execute(context);\n return [...result.entries];\n }\n return source as JoinEntry[];\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- inner join\n// 1:1 port of uqa/joins/inner.py\n\nimport type { GeneralizedPostingEntry } from \"../core/types.js\";\nimport { createPayload } from \"../core/types.js\";\nimport { GeneralizedPostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"../operators/base.js\";\nimport type { JoinEntry } from \"./base.js\";\nimport { JoinOperator, entryDocId } from \"./base.js\";\n\nexport class InnerJoinOperator extends JoinOperator {\n execute(context: ExecutionContext): GeneralizedPostingList {\n const leftEntries = this._getEntries(this.left, context);\n const rightEntries = this._getEntries(this.right, context);\n\n // Build hash index on smaller side\n const leftSmaller = leftEntries.length <= rightEntries.length;\n const buildEntries = leftSmaller ? leftEntries : rightEntries;\n const probeEntries = leftSmaller ? rightEntries : leftEntries;\n const buildField = leftSmaller\n ? this.condition.leftField\n : this.condition.rightField;\n const probeField = leftSmaller\n ? this.condition.rightField\n : this.condition.leftField;\n\n const index = new Map<unknown, JoinEntry[]>();\n for (const entry of buildEntries) {\n const key = (entry.payload.fields as Record<string, unknown>)[buildField];\n if (key === undefined || key === null) continue;\n let bucket = index.get(key);\n if (!bucket) {\n bucket = [];\n index.set(key, bucket);\n }\n bucket.push(entry);\n }\n\n const result: GeneralizedPostingEntry[] = [];\n for (const probeEntry of probeEntries) {\n const probeKey = (probeEntry.payload.fields as Record<string, unknown>)[\n probeField\n ];\n if (probeKey === undefined || probeKey === null) continue;\n const matches = index.get(probeKey);\n if (!matches) continue;\n\n for (const buildEntry of matches) {\n const leftE = leftSmaller ? buildEntry : probeEntry;\n const rightE = leftSmaller ? probeEntry : buildEntry;\n const leftId = entryDocId(leftE);\n const rightId = entryDocId(rightE);\n\n result.push({\n docIds: [leftId, rightId],\n payload: createPayload({\n score: leftE.payload.score + rightE.payload.score,\n fields: {\n ...(leftE.payload.fields as Record<string, unknown>),\n ...(rightE.payload.fields as Record<string, unknown>),\n },\n }),\n });\n }\n }\n\n return new GeneralizedPostingList(result);\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Fluent query builder\n// 1:1 port of uqa/api/query_builder.py\n\nimport type { PathExpr, Predicate } from \"../core/types.js\";\nimport { PostingList } from \"../core/posting-list.js\";\nimport type { ExecutionContext } from \"../operators/base.js\";\nimport type { Operator } from \"../operators/base.js\";\nimport type { VectorIndex } from \"../storage/vector-index.js\";\nimport type { SpatialIndex } from \"../storage/spatial-index.js\";\nimport {\n TermOperator,\n KNNOperator,\n VectorSimilarityOperator,\n FilterOperator,\n FacetOperator,\n ScoreOperator,\n} from \"../operators/primitive.js\";\nimport {\n UnionOperator,\n IntersectOperator,\n ComplementOperator,\n} from \"../operators/boolean.js\";\nimport type { Table } from \"../sql/table.js\";\nimport { CalibratedVectorOperator } from \"../operators/calibrated-vector.js\";\nimport {\n PathFilterOperator,\n PathProjectOperator,\n PathUnnestOperator,\n PathAggregateOperator,\n} from \"../operators/hierarchical.js\";\nimport { InnerJoinOperator } from \"../joins/inner.js\";\nimport type { JoinCondition } from \"../joins/base.js\";\nimport { VectorSimilarityJoinOperator } from \"../joins/cross-paradigm.js\";\nimport {\n TraverseOperator,\n PatternMatchOperator,\n RegularPathQueryOperator,\n VertexAggregationOperator,\n} from \"../graph/operators.js\";\nimport { TemporalTraverseOperator } from \"../graph/temporal-traverse.js\";\nimport { TemporalFilter } from \"../graph/temporal-filter.js\";\nimport { parseRpq } from \"../graph/pattern.js\";\nimport type { GraphPattern } from \"../graph/pattern.js\";\nimport { MessagePassingOperator } from \"../graph/message-passing.js\";\nimport {\n VectorExclusionOperator,\n FacetVectorOperator,\n LogOddsFusionOperator,\n ProbBoolFusionOperator,\n} from \"../operators/hybrid.js\";\nimport { SparseThresholdOperator } from \"../operators/sparse.js\";\nimport type { AggregationMonoid } from \"../operators/aggregation.js\";\nimport {\n CountMonoid,\n SumMonoid,\n AvgMonoid,\n MinMonoid,\n MaxMonoid,\n} from \"../operators/aggregation.js\";\nimport { BM25Scorer, createBM25Params } from \"../scoring/bm25.js\";\nimport {\n BayesianBM25Scorer,\n createBayesianBM25Params,\n} from \"../scoring/bayesian-bm25.js\";\nimport { MultiFieldSearchOperator } from \"../operators/multi-field.js\";\nimport { AttentionFusionOperator } from \"../operators/attention.js\";\nimport { AttentionFusion } from \"../fusion/attention.js\";\nimport { LearnedFusionOperator } from \"../operators/learned-fusion.js\";\nimport { LearnedFusion } from \"../fusion/learned.js\";\nimport { MultiStageOperator } from \"../operators/multi-stage.js\";\nimport { QueryOptimizer } from \"../planner/optimizer.js\";\nimport { PlanExecutor } from \"../planner/executor.js\";\n\n// -- Result types -------------------------------------------------------------\n\nexport class AggregateResult {\n readonly value: unknown;\n\n constructor(value: unknown) {\n this.value = value;\n }\n}\n\nexport class FacetResult {\n readonly counts: Map<string, number>;\n\n constructor(counts: Map<string, number>) {\n this.counts = counts;\n }\n}\n\n// -- QueryBuilder -------------------------------------------------------------\n\ninterface EngineHandle {\n getTable(name: string): Table;\n _contextForTable(name: string): ExecutionContext;\n}\n\nexport class QueryBuilder {\n private _engine: EngineHandle;\n private _table: string;\n _root: Operator | null;\n\n constructor(engine: unknown, table: string) {\n this._engine = engine as EngineHandle;\n this._table = table;\n this._root = null;\n }\n\n // -- Term retrieval (Definition 3.1.1) --\n\n term(term: string, field?: string | null): QueryBuilder {\n const op = new TermOperator(term, field);\n return this._chain(op);\n }\n\n // -- Vector search (Definitions 3.1.2, 3.1.3) --\n\n vector(query: Float64Array, threshold: number, field?: string): QueryBuilder {\n const op = new VectorSimilarityOperator(query, threshold, field ?? \"embedding\");\n return this._chain(op);\n }\n\n knn(query: Float64Array, k: number, field?: string): QueryBuilder {\n const op = new KNNOperator(query, k, field ?? \"embedding\");\n return this._chain(op);\n }\n\n bayesianKnn(\n query: Float64Array,\n k: number,\n field = \"embedding\",\n opts?: {\n estimationMethod?: string;\n baseRate?: number;\n weightSource?: string;\n bm25Query?: string | null;\n bm25Field?: string | null;\n densityGamma?: number;\n bandwidthScale?: number;\n },\n ): QueryBuilder {\n const op = new CalibratedVectorOperator(\n query,\n k,\n field,\n opts?.estimationMethod ?? \"kde\",\n opts?.baseRate ?? 0.5,\n opts?.weightSource ?? \"density_prior\",\n opts?.bm25Query ?? null,\n opts?.bm25Field ?? null,\n opts?.densityGamma ?? 1.0,\n opts?.bandwidthScale ?? 1.0,\n );\n return this._chain(op);\n }\n\n // -- Boolean algebra --\n\n and(other: QueryBuilder): QueryBuilder {\n if (this._root === null || other._root === null) {\n throw new Error(\"Both builders must have operators before combining\");\n }\n const op = new IntersectOperator([this._root, other._root]);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n or(other: QueryBuilder): QueryBuilder {\n if (this._root === null || other._root === null) {\n throw new Error(\"Both builders must have operators before combining\");\n }\n const op = new UnionOperator([this._root, other._root]);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n not(): QueryBuilder {\n if (this._root === null) {\n throw new Error(\"Builder must have an operator before negation\");\n }\n const op = new ComplementOperator(this._root);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n // -- Filter (Definition 3.1.4 / 5.3.5) --\n\n filter(field: string, predicate: Predicate): QueryBuilder {\n if (field.includes(\".\")) {\n const path: (string | number)[] = [];\n for (const component of field.split(\".\")) {\n if (/^\\d+$/.test(component)) {\n path.push(parseInt(component, 10));\n } else {\n path.push(component);\n }\n }\n const op = new PathFilterOperator(path, predicate, this._root);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n const op = new FilterOperator(field, predicate, this._root);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n // -- Joins (Section 4, Paper 1) --\n\n join(other: QueryBuilder, leftField: string, rightField: string): QueryBuilder {\n if (this._root === null || other._root === null) {\n throw new Error(\"Both builders must have operators before joining\");\n }\n const condition: JoinCondition = { leftField, rightField };\n const joinOp = new InnerJoinOperator(this._root, other._root, condition);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = joinOp as unknown as Operator;\n return qb;\n }\n\n vectorJoin(\n other: QueryBuilder,\n leftField: string,\n rightField: string,\n threshold: number,\n ): QueryBuilder {\n if (this._root === null || other._root === null) {\n throw new Error(\"Both builders must have operators before joining\");\n }\n const joinOp = new VectorSimilarityJoinOperator(\n this._root,\n other._root,\n leftField,\n rightField,\n threshold,\n );\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = joinOp as unknown as Operator;\n return qb;\n }\n\n // -- Graph operations (Paper 2) --\n\n traverse(start: number, label?: string | null, maxHops = 1): QueryBuilder {\n const op = new TraverseOperator(start, this._table, label ?? null, maxHops);\n return this._chain(op);\n }\n\n temporalTraverse(\n start: number,\n label?: string | null,\n maxHops = 1,\n opts?: { timestamp?: number | null; timeRange?: [number, number] | null },\n ): QueryBuilder {\n const op = new TemporalTraverseOperator({\n startVertex: start,\n graph: this._table,\n temporalFilter: new TemporalFilter({\n timestamp: opts?.timestamp ?? null,\n timeRange: opts?.timeRange ?? null,\n }),\n label: label ?? null,\n maxHops,\n });\n return this._chain(op);\n }\n\n matchPattern(pattern: unknown): QueryBuilder {\n const op = new PatternMatchOperator(pattern as GraphPattern, this._table);\n return this._chain(op);\n }\n\n rpq(expr: string, start?: number | null): QueryBuilder {\n const pathExpr = parseRpq(expr);\n const op = new RegularPathQueryOperator(pathExpr, this._table, start ?? null);\n return this._chain(op);\n }\n\n vertexAggregate(propertyName: string, aggFn = \"sum\"): AggregateResult {\n if (this._root === null) {\n throw new Error(\"vertexAggregate requires a graph traversal source\");\n }\n const aggFnMap: Record<string, (values: number[]) => number> = {\n sum: (v) => v.reduce((a, b) => a + b, 0),\n avg: (v) => (v.length > 0 ? v.reduce((a, b) => a + b, 0) / v.length : 0),\n min: (v) => (v.length > 0 ? Math.min(...v) : 0),\n max: (v) => (v.length > 0 ? Math.max(...v) : 0),\n count: (v) => v.length,\n };\n const op = new VertexAggregationOperator(this._root, propertyName, aggFnMap[aggFn]);\n const ctx = this._engine._contextForTable(this._table);\n const resultGpl = op.execute(ctx);\n if (resultGpl.length > 0) {\n const entry = resultGpl.entries[0]!;\n return new AggregateResult(entry.payload.fields[\"_vertex_agg_result\"]);\n }\n return new AggregateResult(0.0);\n }\n\n // -- Vector exclusion (Definition 3.3.3) --\n\n vectorExclude(negativeVector: Float64Array, threshold: number): QueryBuilder {\n if (this._root === null) {\n throw new Error(\"vectorExclude requires a source query\");\n }\n const op = new VectorExclusionOperator(this._root, negativeVector, threshold);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n // -- Sparse thresholding (Section 6.5, Paper 4) --\n\n sparseThreshold(threshold: number): QueryBuilder {\n if (this._root === null) {\n throw new Error(\"sparseThreshold requires a source query\");\n }\n const op = new SparseThresholdOperator(this._root, threshold);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n // -- GNN integration (Paper 2 + Paper 4) --\n\n messagePassing(\n kLayers = 2,\n aggregation = \"mean\",\n propertyName?: string | null,\n ): QueryBuilder {\n const op = new MessagePassingOperator({\n kLayers,\n aggregation: aggregation as \"mean\" | \"sum\" | \"max\",\n propertyName: propertyName ?? undefined,\n graph: this._table,\n });\n return this._chain(op);\n }\n\n // -- Aggregation (Section 5.1, Paper 1) --\n\n aggregate(field: string, agg: string): AggregateResult {\n const table = this._engine.getTable(this._table);\n const context = this._buildContext(table);\n\n let pl: PostingList;\n if (this._root !== null) {\n pl = this._root.execute(context);\n } else {\n const docStore = table.documentStore;\n const entries = [...docStore.docIds]\n .sort((a, b) => a - b)\n .map((docId) => ({\n docId,\n payload: { positions: [] as number[], score: 0, fields: {} },\n }));\n pl = PostingList.fromSorted(entries);\n }\n\n const docStore = table.documentStore;\n const values: number[] = [];\n for (const entry of pl) {\n const val = docStore.getField(entry.docId, field);\n if (typeof val === \"number\") {\n values.push(val);\n }\n }\n\n let result: unknown;\n switch (agg.toLowerCase()) {\n case \"count\":\n result = values.length;\n break;\n case \"sum\":\n result = values.reduce((a, b) => a + b, 0);\n break;\n case \"avg\": {\n const sum = values.reduce((a, b) => a + b, 0);\n result = values.length > 0 ? sum / values.length : 0;\n break;\n }\n case \"min\":\n result = values.length > 0 ? Math.min(...values) : null;\n break;\n case \"max\":\n result = values.length > 0 ? Math.max(...values) : null;\n break;\n default:\n throw new Error(`Unknown aggregation function: ${agg}`);\n }\n\n return new AggregateResult(result);\n }\n\n facet(field: string): FacetResult {\n const table = this._engine.getTable(this._table);\n const context = this._buildContext(table);\n\n const facetOp = new FacetOperator(field, this._root);\n const pl = facetOp.execute(context);\n\n const counts = new Map<string, number>();\n for (const entry of pl) {\n const facetValue = entry.payload.fields[\"_facet_value\"];\n const facetCount = entry.payload.fields[\"_facet_count\"];\n if (facetValue !== undefined && facetCount !== undefined) {\n counts.set(String(facetValue as string | number), facetCount as number);\n }\n }\n\n return new FacetResult(counts);\n }\n\n vectorFacet(\n field: string,\n queryVector: Float64Array,\n threshold: number,\n ): FacetResult {\n const table = this._engine.getTable(this._table);\n const context = this._buildContext(table);\n const op = new FacetVectorOperator(field, queryVector, threshold, this._root);\n const resultPl = op.execute(context);\n\n const counts = new Map<string, number>();\n for (const entry of resultPl) {\n const val = entry.payload.fields[\"_facet_value\"];\n const count = entry.payload.fields[\"_facet_count\"];\n if (val !== undefined && count !== undefined) {\n counts.set(String(val as string | number), count as number);\n }\n }\n return new FacetResult(counts);\n }\n\n // -- Hierarchical (Section 5.2-5.3, Paper 1) --\n\n pathFilter(path: PathExpr, predicate: Predicate): QueryBuilder {\n const op = new PathFilterOperator(path, predicate, this._root);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n pathProject(...paths: PathExpr[]): QueryBuilder {\n const op = new PathProjectOperator(paths, this._root!);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n unnest(path: PathExpr): QueryBuilder {\n const op = new PathUnnestOperator(path, this._root!);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n pathAggregate(path: string | PathExpr, agg: string): QueryBuilder {\n const monoidMap: Record<string, new () => unknown> = {\n count: CountMonoid,\n sum: SumMonoid,\n avg: AvgMonoid,\n min: MinMonoid,\n max: MaxMonoid,\n };\n const MonoidCls = monoidMap[agg.toLowerCase()];\n if (MonoidCls === undefined) {\n throw new Error(`Unknown aggregation: ${agg}`);\n }\n\n let pathExpr: PathExpr;\n if (typeof path === \"string\") {\n const parts: (string | number)[] = [];\n for (const component of path.split(\".\")) {\n if (/^\\d+$/.test(component)) {\n parts.push(parseInt(component, 10));\n } else {\n parts.push(component);\n }\n }\n pathExpr = parts;\n } else {\n pathExpr = path;\n }\n\n const op = new PathAggregateOperator(\n pathExpr,\n new MonoidCls() as AggregationMonoid<unknown, unknown, unknown>,\n this._root,\n );\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n // -- Scoring --\n\n scoreBm25(query: string, field?: string | null): QueryBuilder {\n const ctx = this._engine._contextForTable(this._table);\n const idx = ctx.invertedIndex!;\n const analyzer = field ? idx.getFieldAnalyzer(field) : idx.analyzer;\n const terms = analyzer.analyze(query);\n\n const scorer = new BM25Scorer(createBM25Params(), idx.stats);\n const op = new ScoreOperator(\n scorer as ScoreOperator[\"scorer\"],\n this._root!,\n terms,\n field ?? null,\n );\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n scoreBayesianBm25(query: string, field?: string | null): QueryBuilder {\n const ctx = this._engine._contextForTable(this._table);\n const idx = ctx.invertedIndex!;\n const analyzer = field ? idx.getFieldAnalyzer(field) : idx.analyzer;\n const terms = analyzer.analyze(query);\n\n const scorer = new BayesianBM25Scorer(createBayesianBM25Params(), idx.stats);\n const op = new ScoreOperator(\n scorer as ScoreOperator[\"scorer\"],\n this._root!,\n terms,\n field ?? null,\n );\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n scoreMultiFieldBayesian(\n query: string,\n fields: string[],\n weights?: number[] | null,\n ): QueryBuilder {\n const op = new MultiFieldSearchOperator(fields, query, weights ?? null);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n scoreBayesianWithPrior(\n query: string,\n field?: string | null,\n opts?: { priorFn?: unknown },\n ): QueryBuilder {\n if (opts?.priorFn === undefined || opts.priorFn === null) {\n throw new Error(\"priorFn is required for scoreBayesianWithPrior\");\n }\n // Simplified: apply Bayesian BM25 scoring + prior\n return this.scoreBayesianBm25(query, field);\n }\n\n learnParams(\n query: string,\n labels: number[],\n opts?: { mode?: string; field?: string | null },\n ): Record<string, number> {\n const f = opts?.field ?? \"_default\";\n return (\n this._engine as unknown as {\n learnScoringParams(\n table: string,\n field: string,\n query: string,\n labels: number[],\n opts?: { mode?: string },\n ): Record<string, number>;\n }\n ).learnScoringParams(this._table, f, query, labels, {\n mode: opts?.mode ?? \"balanced\",\n });\n }\n\n // -- Fusion (Paper 4) --\n\n fuseLogOdds(...builders: (QueryBuilder | number)[]): QueryBuilder {\n // Last numeric argument is alpha\n let alpha = 0.5;\n const sources: QueryBuilder[] = [];\n for (const b of builders) {\n if (typeof b === \"number\") {\n alpha = b;\n } else if (b._root !== null) {\n sources.push(b);\n }\n }\n if (sources.length === 0) return this;\n\n // Collect the fusion operator from builder helper\n const ops = sources.map((s) => s._root!);\n\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = new LogOddsFusionOperator(ops, alpha);\n return qb;\n }\n\n fuseProbAnd(...builders: QueryBuilder[]): QueryBuilder {\n const ops = builders.filter((b) => b._root !== null).map((b) => b._root!);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = new ProbBoolFusionOperator(ops, \"and\");\n return qb;\n }\n\n fuseProbOr(...builders: QueryBuilder[]): QueryBuilder {\n const ops = builders.filter((b) => b._root !== null).map((b) => b._root!);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = new ProbBoolFusionOperator(ops, \"or\");\n return qb;\n }\n\n fuseAttention(builders: QueryBuilder[], alpha = 0.5): QueryBuilder {\n const sources = builders.filter((b) => b._root !== null).map((b) => b._root!);\n if (sources.length < 2) {\n throw new Error(\"fuseAttention requires at least 2 signals\");\n }\n const attention = new AttentionFusion(sources.length, 6, alpha);\n const queryFeatures = new Float64Array(6);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = new AttentionFusionOperator(sources, attention, queryFeatures);\n return qb;\n }\n\n fuseLearned(builders: QueryBuilder[], alpha = 0.5): QueryBuilder {\n const sources = builders.filter((b) => b._root !== null).map((b) => b._root!);\n if (sources.length < 2) {\n throw new Error(\"fuseLearned requires at least 2 signals\");\n }\n const learned = new LearnedFusion(sources.length, alpha);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = new LearnedFusionOperator(sources, learned);\n return qb;\n }\n\n // -- Multi-stage pipeline (Section 9, Paper 4) --\n\n multiStage(stages: [QueryBuilder, number][]): QueryBuilder {\n const stageList: [Operator, number][] = [];\n for (const [builder, cutoff] of stages) {\n if (builder._root === null) {\n throw new Error(\"Each stage must have an operator\");\n }\n stageList.push([builder._root, cutoff]);\n }\n const op = new MultiStageOperator(stageList);\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n // -- Execution --\n\n execute(): PostingList {\n if (this._root === null) {\n return new PostingList();\n }\n\n const context = this._engine._contextForTable(this._table);\n\n // Optimize the operator tree through the QueryOptimizer\n let optimized: Operator = this._root;\n if (context.invertedIndex) {\n const stats = context.invertedIndex.stats;\n const optimizer = new QueryOptimizer(stats);\n optimized = optimizer.optimize(this._root);\n }\n\n // Execute via PlanExecutor for timing stats\n const executor = new PlanExecutor(context);\n return executor.execute(optimized);\n }\n\n explain(): string {\n if (this._root === null) {\n return \"(empty query)\";\n }\n\n const context = this._engine._contextForTable(this._table);\n\n let optimized: Operator = this._root;\n if (context.invertedIndex) {\n const stats = context.invertedIndex.stats;\n const optimizer = new QueryOptimizer(stats);\n optimized = optimizer.optimize(this._root);\n }\n\n const executor = new PlanExecutor(context);\n return executor.explain(optimized);\n }\n\n // -- Internal ---------------------------------------------------------------\n\n private _chain(op: Operator): QueryBuilder {\n if (this._root !== null) {\n op = new IntersectOperator([this._root, op]);\n }\n const qb = new QueryBuilder(this._engine, this._table);\n qb._root = op;\n return qb;\n }\n\n private _buildContext(table: Table): ExecutionContext {\n const vectorIndexes: Record<string, VectorIndex> = {};\n for (const [name, idx] of table.vectorIndexes) {\n vectorIndexes[name] = idx;\n }\n const spatialIndexes: Record<string, SpatialIndex> = {};\n for (const [name, idx] of table.spatialIndexes) {\n spatialIndexes[name] = idx;\n }\n return {\n documentStore: table.documentStore,\n invertedIndex: table.invertedIndex,\n vectorIndexes,\n spatialIndexes,\n };\n }\n}\n\n// -- Internal operator classes for fusion via the fluent API ----------------\n\nimport { createPostingEntry } from \"../core/types.js\";\n\nfunction _coverageBasedDefault(signalSize: number, totalDocs: number): number {\n if (totalDocs <= 0) return 0.5;\n const coverage = signalSize / totalDocs;\n return Math.max(0.01, 0.5 * (1 - coverage));\n}\n\n/**\n * Internal operator for log-odds fusion across multiple sub-queries.\n */\nexport class FusionOperator {\n readonly fusion: { fuse(probs: number[]): number };\n readonly sources: Operator[];\n\n constructor(fusion: { fuse(probs: number[]): number }, sources: Operator[]) {\n this.fusion = fusion;\n this.sources = sources;\n }\n\n execute(context: ExecutionContext): PostingList {\n const postingLists = this.sources.map((src) => src.execute(context));\n const allDocIds = new Set<number>();\n const scoreMaps: Map<number, number>[] = [];\n for (const pl of postingLists) {\n const smap = new Map<number, number>();\n for (const entry of pl) {\n smap.set(entry.docId, entry.payload.score);\n allDocIds.add(entry.docId);\n }\n scoreMaps.push(smap);\n }\n\n const numDocs = allDocIds.size;\n const defaults = scoreMaps.map((smap) => _coverageBasedDefault(smap.size, numDocs));\n\n const entries = [];\n for (const docId of [...allDocIds].sort((a, b) => a - b)) {\n const probs = scoreMaps.map((smap, j) => smap.get(docId) ?? defaults[j]!);\n const fusedScore = this.fusion.fuse(probs);\n entries.push(createPostingEntry(docId, { score: fusedScore }));\n }\n return new PostingList(entries);\n }\n\n costEstimate(stats: { totalDocs: number }): number {\n let total = 0;\n for (const src of this.sources) {\n const ce = (\n src as unknown as { costEstimate?: (s: { totalDocs: number }) => number }\n ).costEstimate;\n total += ce ? ce(stats) : 100.0;\n }\n return total;\n }\n}\n\n/**\n * Internal operator for probabilistic boolean fusion.\n */\nexport class ProbBooleanOperator {\n readonly mode: \"and\" | \"or\";\n readonly sources: Operator[];\n\n constructor(mode: \"and\" | \"or\", sources: Operator[]) {\n this.mode = mode;\n this.sources = sources;\n }\n\n execute(context: ExecutionContext): PostingList {\n const postingLists = this.sources.map((src) => src.execute(context));\n const allDocIds = new Set<number>();\n const scoreMaps: Map<number, number>[] = [];\n for (const pl of postingLists) {\n const smap = new Map<number, number>();\n for (const entry of pl) {\n smap.set(entry.docId, entry.payload.score);\n allDocIds.add(entry.docId);\n }\n scoreMaps.push(smap);\n }\n\n const numDocs = allDocIds.size;\n const defaults = scoreMaps.map((smap) => _coverageBasedDefault(smap.size, numDocs));\n\n const fuseFn =\n this.mode === \"and\"\n ? (probs: number[]) => probs.reduce((a, b) => a * b, 1.0)\n : (probs: number[]) => 1.0 - probs.reduce((a, b) => a * (1.0 - b), 1.0);\n\n const entries = [];\n for (const docId of [...allDocIds].sort((a, b) => a - b)) {\n const probs = scoreMaps.map((smap, j) => smap.get(docId) ?? defaults[j]!);\n const fused = fuseFn(probs);\n entries.push(createPostingEntry(docId, { score: fused }));\n }\n return new PostingList(entries);\n }\n\n costEstimate(stats: { totalDocs: number }): number {\n let total = 0;\n for (const src of this.sources) {\n const ce = (\n src as unknown as { costEstimate?: (s: { totalDocs: number }) => number }\n ).costEstimate;\n total += ce ? ce(stats) : 100.0;\n }\n return total;\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Transaction wrapper\n// 1:1 port of uqa/storage/transaction.py\n\nimport type { ManagedConnection } from \"./managed-connection.js\";\n\nexport class Transaction {\n private _conn: ManagedConnection;\n private _finished: boolean;\n\n constructor(conn: ManagedConnection) {\n this._conn = conn;\n this._finished = false;\n this._conn.beginTransaction();\n }\n\n get active(): boolean {\n return !this._finished;\n }\n\n commit(): void {\n if (this._finished) {\n throw new Error(\"Transaction already finished\");\n }\n this._conn.commitTransaction();\n this._finished = true;\n }\n\n rollback(): void {\n if (this._finished) {\n throw new Error(\"Transaction already finished\");\n }\n this._conn.rollbackTransaction();\n this._finished = true;\n }\n\n savepoint(name: string): void {\n if (this._finished) {\n throw new Error(\"Transaction already finished\");\n }\n this._conn.savepoint(name);\n }\n\n releaseSavepoint(name: string): void {\n if (this._finished) {\n throw new Error(\"Transaction already finished\");\n }\n this._conn.releaseSavepoint(name);\n }\n\n rollbackTo(name: string): void {\n if (this._finished) {\n throw new Error(\"Transaction already finished\");\n }\n this._conn.rollbackToSavepoint(name);\n }\n\n /** Auto-rollback disposable pattern (analogous to Python __enter__/__exit__). */\n autoRollback(): void {\n if (!this._finished) {\n this.rollback();\n }\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Graph indexes\n// 1:1 port of uqa/graph/index.py\n\nimport type { GraphStore } from \"../storage/abc/graph-store.js\";\nimport type { GraphPattern } from \"./pattern.js\";\nimport { PatternMatchOperator } from \"./operators.js\";\nimport type { ExecutionContext } from \"../operators/base.js\";\n\n// -- LabelIndex ---------------------------------------------------------------\n\nexport class LabelIndex {\n private _labelToEdges: Map<string, number[]> = new Map();\n private _labelToVertices: Map<string, Set<number>> = new Map();\n\n build(store: GraphStore, graphName: string): void {\n this._labelToEdges.clear();\n this._labelToVertices.clear();\n\n for (const vid of store.vertexIdsInGraph(graphName)) {\n for (const eid of store.outEdgeIds(vid, graphName)) {\n const edge = store.getEdge(eid);\n if (!edge) continue;\n let edgeList = this._labelToEdges.get(edge.label);\n if (!edgeList) {\n edgeList = [];\n this._labelToEdges.set(edge.label, edgeList);\n }\n edgeList.push(eid);\n\n let vertexSet = this._labelToVertices.get(edge.label);\n if (!vertexSet) {\n vertexSet = new Set();\n this._labelToVertices.set(edge.label, vertexSet);\n }\n vertexSet.add(edge.sourceId);\n vertexSet.add(edge.targetId);\n }\n }\n\n // Sort edge lists\n for (const edges of this._labelToEdges.values()) {\n edges.sort((a, b) => a - b);\n }\n }\n\n edgesByLabel(label: string): number[] {\n return this._labelToEdges.get(label) ?? [];\n }\n\n verticesByLabel(label: string): Set<number> {\n return this._labelToVertices.get(label) ?? new Set();\n }\n\n labels(): string[] {\n return [...this._labelToEdges.keys()].sort();\n }\n\n labelCount(label: string): number {\n return (this._labelToEdges.get(label) ?? []).length;\n }\n}\n\n// -- NeighborhoodIndex --------------------------------------------------------\n\nexport class NeighborhoodIndex {\n readonly maxHops: number;\n private _cache: Map<number, Map<number, Set<number>>> = new Map();\n\n constructor(maxHops = 2) {\n this.maxHops = maxHops;\n }\n\n build(store: GraphStore, graphName: string, label?: string | null): void {\n this._cache.clear();\n const maxH = this.maxHops;\n\n for (const vid of [...store.vertexIdsInGraph(graphName)].sort((a, b) => a - b)) {\n const vidCache = new Map<number, Set<number>>();\n this._cache.set(vid, vidCache);\n\n const visited = new Set<number>([vid]);\n let frontier = new Set<number>([vid]);\n\n for (let hop = 1; hop <= maxH; hop++) {\n const nextFrontier = new Set<number>();\n for (const v of frontier) {\n for (const eid of store.outEdgeIds(v, graphName)) {\n const edge = store.getEdge(eid);\n if (!edge) continue;\n if (label != null && edge.label !== label) continue;\n if (!visited.has(edge.targetId)) {\n nextFrontier.add(edge.targetId);\n }\n }\n }\n for (const nv of nextFrontier) visited.add(nv);\n frontier = nextFrontier;\n vidCache.set(hop, new Set(visited));\n }\n }\n }\n\n neighbors(vertexId: number, hops: number): Set<number> {\n const vidCache = this._cache.get(vertexId);\n if (!vidCache) return new Set();\n const clamped = Math.min(hops, this.maxHops);\n return vidCache.get(clamped) ?? new Set();\n }\n\n hasVertex(vertexId: number): boolean {\n return this._cache.has(vertexId);\n }\n}\n\n// -- PathIndex ----------------------------------------------------------------\n\nexport class PathIndex {\n // Maps (graphName, labelSeqKey) -> Set of (startVid, endVid) pairs\n private _index: Map<string, Set<string>> = new Map();\n\n private _makeKey(labels: string[], graphName: string): string {\n return `${graphName}\\0${labels.join(\"\\0\")}`;\n }\n\n private _pairKey(start: number, end: number): string {\n return `${String(start)}\\0${String(end)}`;\n }\n\n private _parsePairKey(key: string): [number, number] {\n const parts = key.split(\"\\0\");\n return [parseInt(parts[0]!, 10), parseInt(parts[1]!, 10)];\n }\n\n build(store: GraphStore, graphName: string, labelSequences: string[][]): void {\n for (const labels of labelSequences) {\n const key = this._makeKey(labels, graphName);\n const pairs = new Set<string>();\n\n const allVertexIds = store.vertexIdsInGraph(graphName);\n\n for (const startVid of allVertexIds) {\n const reachable = this._findReachable(store, graphName, startVid, labels);\n for (const endVid of reachable) {\n pairs.add(this._pairKey(startVid, endVid));\n }\n }\n\n this._index.set(key, pairs);\n }\n }\n\n private _findReachable(\n store: GraphStore,\n graphName: string,\n startVid: number,\n labels: string[],\n ): number[] {\n // BFS through label sequence\n let current = new Set<number>([startVid]);\n\n for (const label of labels) {\n const next = new Set<number>();\n for (const vid of current) {\n const neighbors = store.neighbors(vid, graphName, label, \"out\");\n for (const nid of neighbors) {\n next.add(nid);\n }\n }\n current = next;\n if (current.size === 0) break;\n }\n\n return [...current];\n }\n\n lookup(labels: string[], graphName: string): Array<[number, number]> {\n const key = this._makeKey(labels, graphName);\n const pairs = this._index.get(key);\n if (!pairs) return [];\n return [...pairs].map((p) => this._parsePairKey(p));\n }\n\n hasPath(labels: string[], graphName: string): boolean {\n const key = this._makeKey(labels, graphName);\n return this._index.has(key);\n }\n\n indexedPaths(): string[][] {\n const result: string[][] = [];\n for (const key of this._index.keys()) {\n const parts = key.split(\"\\0\");\n // First part is graphName, rest are labels\n result.push(parts.slice(1));\n }\n return result;\n }\n}\n\n// -- SubgraphIndex ------------------------------------------------------------\n\nexport class SubgraphIndex {\n // Cache pattern match results by serialized pattern + graph name\n private _cache: Map<string, Array<Map<string, number>>> = new Map();\n\n private _patternKey(pattern: GraphPattern, graphName: string): string {\n // Simple serialization: variable names + edge patterns\n const vps = pattern.vertexPatterns\n .map((vp) => vp.variable)\n .sort()\n .join(\",\");\n const eps = pattern.edgePatterns\n .map(\n (ep) =>\n `${ep.sourceVar}->${ep.targetVar}:${ep.label ?? \"*\"}${ep.negated ? \"!\" : \"\"}`,\n )\n .sort()\n .join(\",\");\n return `${graphName}\\0${vps}\\0${eps}`;\n }\n\n build(\n _store: GraphStore,\n graphName: string,\n patterns: GraphPattern[],\n context: ExecutionContext,\n ): void {\n for (const pattern of patterns) {\n const key = this._patternKey(pattern, graphName);\n const op = new PatternMatchOperator(pattern, graphName);\n const result = op.execute(context);\n // Extract assignments from posting list fields\n const assignments: Array<Map<string, number>> = [];\n for (const entry of result) {\n const fields = entry.payload.fields as Record<string, unknown>;\n const assignment = new Map<string, number>();\n for (const vp of pattern.vertexPatterns) {\n const vid = fields[vp.variable];\n if (typeof vid === \"number\") {\n assignment.set(vp.variable, vid);\n }\n }\n assignments.push(assignment);\n }\n this._cache.set(key, assignments);\n }\n }\n\n lookup(pattern: GraphPattern, graphName: string): Array<Map<string, number>> | null {\n const key = this._patternKey(pattern, graphName);\n return this._cache.get(key) ?? null;\n }\n\n hasPattern(pattern: GraphPattern, graphName: string): boolean {\n const key = this._patternKey(pattern, graphName);\n return this._cache.has(key);\n }\n\n invalidate(pattern: GraphPattern, graphName: string): void {\n const key = this._patternKey(pattern, graphName);\n this._cache.delete(key);\n }\n}\n\n// -- VertexPropertyIndex ------------------------------------------------------\n\nexport class VertexPropertyIndex {\n // Hash index: propertyName -> value -> Set<vertexId>\n private _hashIndex: Map<string, Map<unknown, Set<number>>> = new Map();\n // Sorted index: propertyName -> sorted array of [value, vertexId]\n private _sortedIndex: Map<string, Array<[number, number]>> = new Map();\n private _indexedProperties: Set<string> = new Set();\n\n build(store: GraphStore, graphName: string, propertyNames: string[]): void {\n for (const propName of propertyNames) {\n this._indexedProperties.add(propName);\n const hashMap = new Map<unknown, Set<number>>();\n const sorted: Array<[number, number]> = [];\n\n const vertices = store.verticesInGraph(graphName);\n for (const vertex of vertices) {\n const value = vertex.properties[propName];\n if (value === undefined) continue;\n\n // Hash index\n let bucket = hashMap.get(value);\n if (!bucket) {\n bucket = new Set();\n hashMap.set(value, bucket);\n }\n bucket.add(vertex.vertexId);\n\n // Sorted index (only for numeric values)\n if (typeof value === \"number\") {\n sorted.push([value, vertex.vertexId]);\n }\n }\n\n this._hashIndex.set(propName, hashMap);\n sorted.sort((a, b) => a[0] - b[0]);\n this._sortedIndex.set(propName, sorted);\n }\n }\n\n lookupEq(propertyName: string, value: unknown): Set<number> {\n const hashMap = this._hashIndex.get(propertyName);\n if (!hashMap) return new Set();\n return hashMap.get(value) ?? new Set();\n }\n\n lookupRange(propertyName: string, low: number, high: number): number[] {\n const sorted = this._sortedIndex.get(propertyName);\n if (!sorted) return [];\n\n const result: number[] = [];\n // Binary search for lower bound\n let lo = 0;\n let hi = sorted.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (sorted[mid]![0] < low) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n\n for (let i = lo; i < sorted.length; i++) {\n const [val, vid] = sorted[i]!;\n if (val > high) break;\n result.push(vid);\n }\n\n return result;\n }\n\n hasProperty(propertyName: string): boolean {\n return this._indexedProperties.has(propertyName);\n }\n}\n\n// -- EdgePropertyIndex --------------------------------------------------------\n\nexport class EdgePropertyIndex {\n private _hashIndex: Map<string, Map<unknown, Set<number>>> = new Map();\n private _sortedIndex: Map<string, Array<[number, number]>> = new Map();\n private _indexedProperties: Set<string> = new Set();\n\n build(store: GraphStore, graphName: string, propertyNames: string[]): void {\n for (const propName of propertyNames) {\n this._indexedProperties.add(propName);\n const hashMap = new Map<unknown, Set<number>>();\n const sorted: Array<[number, number]> = [];\n\n const edges = store.edgesInGraph(graphName);\n for (const edge of edges) {\n const value = edge.properties[propName];\n if (value === undefined) continue;\n\n let bucket = hashMap.get(value);\n if (!bucket) {\n bucket = new Set();\n hashMap.set(value, bucket);\n }\n bucket.add(edge.edgeId);\n\n if (typeof value === \"number\") {\n sorted.push([value, edge.edgeId]);\n }\n }\n\n this._hashIndex.set(propName, hashMap);\n sorted.sort((a, b) => a[0] - b[0]);\n this._sortedIndex.set(propName, sorted);\n }\n }\n\n lookupEq(propertyName: string, value: unknown): Set<number> {\n const hashMap = this._hashIndex.get(propertyName);\n if (!hashMap) return new Set();\n return hashMap.get(value) ?? new Set();\n }\n\n lookupRange(propertyName: string, low: number, high: number): number[] {\n const sorted = this._sortedIndex.get(propertyName);\n if (!sorted) return [];\n\n const result: number[] = [];\n let lo = 0;\n let hi = sorted.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (sorted[mid]![0] < low) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n\n for (let i = lo; i < sorted.length; i++) {\n const [val, eid] = sorted[i]!;\n if (val > high) break;\n result.push(eid);\n }\n\n return result;\n }\n\n hasProperty(propertyName: string): boolean {\n return this._indexedProperties.has(propertyName);\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- parameter learner\n// 1:1 port of uqa/scoring/parameter_learner.py\n//\n// Online parameter learning for Bayesian BM25 (Section 8, Paper 3).\n//\n// Wraps BayesianProbabilityTransform.fit() and .update() to learn\n// calibration parameters (alpha, beta, base_rate) from relevance\n// judgments.\n\nimport { BayesianProbabilityTransform } from \"bayesian-bm25\";\nimport type { FitOptions, UpdateOptions } from \"bayesian-bm25\";\n\n/**\n * Online parameter learning for Bayesian BM25.\n *\n * Wraps BayesianProbabilityTransform.fit() and .update() to learn\n * calibration parameters (alpha, beta, baseRate) from relevance\n * judgments. Supports both batch learning (fit) and incremental\n * online updates (update).\n */\nexport class ParameterLearner {\n private readonly _transform: BayesianProbabilityTransform;\n\n /**\n * @param alpha - Initial scaling exponent (default 1.0).\n * @param beta - Initial offset (default 0.0).\n * @param baseRate - Prior base rate of relevance (default 0.5).\n */\n constructor(alpha = 1.0, beta = 0.0, baseRate = 0.5) {\n this._transform = new BayesianProbabilityTransform(\n alpha,\n beta,\n baseRate === 0.5 ? null : baseRate,\n );\n }\n\n /**\n * Batch-learn calibration parameters from scored documents.\n *\n * @param scores - Array of raw BM25 scores.\n * @param labels - Array of binary relevance labels (0 or 1).\n * @param options - Optional fit options (mode, tfs, doc_len_ratios).\n * @returns The learned parameters as a dict with keys: alpha, beta, baseRate.\n */\n fit(\n scores: number[],\n labels: number[],\n options?: FitOptions,\n ): Record<string, number> {\n this._transform.fit(scores, labels, options);\n return this.params();\n }\n\n /**\n * Online update with a single observation.\n *\n * @param score - A single raw BM25 score.\n * @param label - Binary relevance label (0 or 1).\n * @param options - Optional update options (learning_rate, tf, doc_len_ratio).\n */\n update(score: number, label: number, options?: UpdateOptions): void {\n this._transform.update(score, label, options);\n }\n\n /**\n * Return current learned parameters.\n *\n * @returns Dict with keys: alpha, beta, baseRate.\n */\n params(): Record<string, number> {\n return {\n alpha: this._transform.alpha,\n beta: this._transform.beta,\n baseRate: this._transform.baseRate ?? 0.5,\n };\n }\n}\n","//\n// Unified Query Algebra\n//\n// Copyright (c) 2023-2026 Cognica, Inc.\n//\n// Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n// See LICENSE file in the project root for full license text.\n//\n\n// Unified Query Algebra -- Main Engine\n// 1:1 port of uqa/engine.py\n//\n// Wires together: SQLCompiler, Tables, GraphStore, QueryBuilder.\n\nimport { SQLCompiler } from \"./sql/compiler.js\";\nimport type { SQLResult } from \"./sql/compiler.js\";\nimport type { Table } from \"./sql/table.js\";\nimport { MemoryGraphStore } from \"./graph/store.js\";\nimport type { GraphStore } from \"./storage/abc/graph-store.js\";\nimport { QueryBuilder } from \"./api/query-builder.js\";\nimport type { Catalog } from \"./storage/catalog.js\";\nimport type { IndexManager } from \"./storage/index-manager.js\";\nimport { Transaction as TransactionClass } from \"./storage/transaction.js\";\nimport type { Transaction } from \"./storage/transaction.js\";\nimport { PathIndex as PathIndexClass } from \"./graph/index.js\";\nimport type { PathIndex } from \"./graph/index.js\";\nimport type { ForeignServer, ForeignTable } from \"./fdw/foreign-table.js\";\nimport type { Vertex, Edge, DocId } from \"./core/types.js\";\nimport type { VectorIndex } from \"./storage/vector-index.js\";\nimport type { ExecutionContext } from \"./operators/base.js\";\nimport type { SpatialIndex } from \"./storage/spatial-index.js\";\nimport {\n Analyzer,\n registerAnalyzer,\n getAnalyzer,\n dropAnalyzer as dropAnalyzerFn,\n} from \"./analysis/analyzer.js\";\nimport { TermOperator, ScoreOperator } from \"./operators/primitive.js\";\nimport {\n BayesianBM25Scorer,\n createBayesianBM25Params,\n} from \"./scoring/bayesian-bm25.js\";\nimport { ParameterLearner } from \"./scoring/parameter-learner.js\";\nimport { estimateConvWeights as estimateConvWeightsFn } from \"./operators/deep-fusion.js\";\nimport type { ManagedConnection } from \"./storage/managed-connection.js\";\n\nexport interface EngineOptions {\n dbPath?: string;\n parallelWorkers?: number;\n spillThreshold?: number;\n}\n\nexport class Engine {\n _tables: Map<string, Table>;\n _views: Map<string, unknown>; // name -> SelectStmt AST\n _prepared: Map<string, unknown>; // name -> PrepareStmt AST\n _sequences: Map<string, Record<string, number>>;\n _tempTables: Set<string>;\n _graphStore: GraphStore;\n _versionedGraphs: Map<string, unknown>;\n _pathIndexes: Map<string, PathIndex>;\n _foreignServers: Map<string, ForeignServer>;\n _foreignTables: Map<string, ForeignTable>;\n _models: Map<string, Record<string, unknown>>;\n private _catalog: Catalog | null;\n private _indexManager: IndexManager | null;\n private _transaction: Transaction | null;\n private _compiler: SQLCompiler;\n private _dbPath: string | null;\n private _parallelWorkers: number;\n private _spillThreshold: number;\n\n constructor(opts?: EngineOptions) {\n this._dbPath = opts?.dbPath ?? null;\n this._parallelWorkers = opts?.parallelWorkers ?? 4;\n this._spillThreshold = opts?.spillThreshold ?? 0;\n this._tables = new Map();\n this._views = new Map();\n this._prepared = new Map();\n this._sequences = new Map();\n this._tempTables = new Set();\n this._graphStore = new MemoryGraphStore();\n this._versionedGraphs = new Map();\n this._pathIndexes = new Map();\n this._foreignServers = new Map();\n this._foreignTables = new Map();\n this._models = new Map();\n this._catalog = null;\n this._indexManager = null;\n this._transaction = null;\n this._compiler = new SQLCompiler(this);\n }\n\n // -- SQL execution ----------------------------------------------------------\n\n async sql(query: string, params?: unknown[]): Promise<SQLResult | null> {\n return this._compiler.execute(query, params);\n }\n\n // -- Table management -------------------------------------------------------\n\n getTable(name: string): Table {\n const table = this._tables.get(name);\n if (table !== undefined) {\n return table;\n }\n // Check if the compiler has it (created via SQL DDL)\n const compilerTable = this._compiler.tables.get(name);\n if (compilerTable !== undefined) {\n this._tables.set(name, compilerTable);\n return compilerTable;\n }\n throw new Error(`Table not found: ${name}`);\n }\n\n hasTable(name: string): boolean {\n return this._tables.has(name) || this._compiler.tables.has(name);\n }\n\n registerTable(name: string, table: Table): void {\n this._tables.set(name, table);\n // Also register in the compiler so SQL queries can find it\n this._compiler.tables.set(name, table);\n }\n\n // -- Document operations ----------------------------------------------------\n\n addDocument(\n docId: DocId,\n document: Record<string, unknown>,\n table: string,\n embedding?: Float64Array | null,\n ): void {\n const tbl = this._tables.get(table);\n if (tbl === undefined) {\n throw new Error(`Table '${table}' does not exist`);\n }\n\n // Include the primary key in stored data for consistency with\n // SQL INSERT (Table.insert) which always stores the PK column.\n const stored: Record<string, unknown> = { ...document };\n if (tbl.primaryKey !== null && !(tbl.primaryKey in stored)) {\n const pkCol = tbl.columns.get(tbl.primaryKey);\n if (pkCol !== undefined) {\n stored[tbl.primaryKey] = docId;\n }\n }\n\n // Store embedding vector in the document store alongside scalar data.\n let vecColForIndex: string | null = null;\n let vecArray: Float64Array | null = null;\n if (embedding !== null && embedding !== undefined) {\n for (const [colName, col] of tbl.columns) {\n if (col.vectorDimensions !== null) {\n vecColForIndex = colName;\n break;\n }\n }\n if (vecColForIndex !== null) {\n vecArray = embedding;\n stored[vecColForIndex] = Array.from(embedding);\n }\n }\n\n tbl.documentStore.put(docId, stored);\n\n const textFields: Record<string, string> = {};\n for (const [k, v] of Object.entries(stored)) {\n if (typeof v === \"string\") {\n textFields[k] = v;\n }\n }\n if (Object.keys(textFields).length > 0) {\n tbl.invertedIndex.addDocument(docId, textFields);\n }\n\n if (vecColForIndex !== null && vecArray !== null) {\n const vecIdx = tbl.vectorIndexes.get(vecColForIndex);\n if (vecIdx !== undefined) {\n vecIdx.add(docId, vecArray);\n }\n }\n }\n\n getDocument(docId: DocId, table: string): Record<string, unknown> | null {\n const tbl = this._tables.get(table);\n if (tbl === undefined) {\n throw new Error(`Table '${table}' does not exist`);\n }\n return tbl.documentStore.get(docId);\n }\n\n deleteDocument(docId: DocId, table: string): void {\n const tbl = this._tables.get(table);\n if (tbl === undefined) {\n throw new Error(`Table '${table}' does not exist`);\n }\n tbl.documentStore.delete(docId);\n tbl.invertedIndex.removeDocument(docId);\n }\n\n // -- Graph management -------------------------------------------------------\n\n getGraphStore(_table: string): GraphStore {\n // In the TS port, we use the global graph store\n return this._graphStore;\n }\n\n addGraphVertex(vertex: Vertex, table: string): void {\n this._graphStore.addVertex(vertex, table);\n }\n\n addGraphEdge(edge: Edge, table: string): void {\n this._graphStore.addEdge(edge, table);\n }\n\n // -- Named graph management -------------------------------------------------\n\n createGraph(name: string): GraphStore {\n this._graphStore.createGraph(name);\n if (this._catalog !== null) {\n this._catalog.saveNamedGraph(name);\n }\n return this._graphStore;\n }\n\n dropGraph(name: string): void {\n this._graphStore.dropGraph(name);\n if (this._catalog !== null) {\n this._catalog.dropNamedGraph(name);\n }\n }\n\n getGraph(name: string): GraphStore {\n if (!this._graphStore.hasGraph(name)) {\n throw new Error(`Graph '${name}' does not exist`);\n }\n return this._graphStore;\n }\n\n hasGraph(name: string): boolean {\n return this._graphStore.hasGraph(name);\n }\n\n get graphStore(): GraphStore {\n return this._graphStore;\n }\n\n // -- Convolution weight estimation ------------------------------------------\n\n estimateConvWeights(\n table: string,\n edgeLabel: string,\n kernelHops: number,\n embeddingField = \"embedding\",\n ): number[] {\n return estimateConvWeightsFn(this, table, edgeLabel, kernelHops, embeddingField);\n }\n\n // -- Model management (deep_learn) ------------------------------------------\n\n saveModel(modelName: string, config: Record<string, unknown>): void {\n this._models.set(modelName, config);\n if (this._catalog !== null) {\n this._catalog.saveModel(modelName, config);\n }\n }\n\n loadModel(modelName: string): Record<string, unknown> | null {\n const cached = this._models.get(modelName);\n if (cached !== undefined) {\n return cached;\n }\n if (this._catalog !== null) {\n const config = this._catalog.loadModel(modelName);\n if (config !== null) {\n this._models.set(modelName, config);\n }\n return config;\n }\n return null;\n }\n\n deleteModel(modelName: string): void {\n this._models.delete(modelName);\n if (this._catalog !== null) {\n this._catalog.deleteModel(modelName);\n }\n }\n\n // -- Path index management --------------------------------------------------\n\n buildPathIndex(graphName: string, labelSequences: string[][]): void {\n if (!this._graphStore.hasGraph(graphName)) {\n throw new Error(`Graph '${graphName}' does not exist`);\n }\n const idx = new PathIndexClass();\n idx.build(this._graphStore, graphName, labelSequences);\n this._pathIndexes.set(graphName, idx);\n if (this._catalog !== null) {\n this._catalog.savePathIndex(graphName, labelSequences);\n }\n }\n\n getPathIndex(graphName: string): PathIndex | null {\n return this._pathIndexes.get(graphName) ?? null;\n }\n\n dropPathIndex(graphName: string): void {\n this._pathIndexes.delete(graphName);\n if (this._catalog !== null) {\n this._catalog.dropPathIndex(graphName);\n }\n }\n\n // -- Analyzer management ----------------------------------------------------\n\n createAnalyzer(name: string, config: Record<string, unknown>): void {\n const analyzer = Analyzer.fromDict(config);\n registerAnalyzer(name, analyzer);\n if (this._catalog !== null) {\n this._catalog.saveAnalyzer(name, config);\n }\n }\n\n dropAnalyzer(name: string): void {\n dropAnalyzerFn(name);\n if (this._catalog !== null) {\n this._catalog.dropAnalyzer(name);\n }\n }\n\n setTableAnalyzer(\n tableName: string,\n field: string,\n analyzerName: string,\n phase: \"index\" | \"search\" | \"both\" = \"both\",\n ): void {\n const tbl = this._tables.get(tableName);\n if (tbl === undefined) {\n throw new Error(`Table '${tableName}' does not exist`);\n }\n const analyzer = getAnalyzer(analyzerName);\n tbl.invertedIndex.setFieldAnalyzer(field, analyzer, phase);\n if (this._catalog !== null) {\n if (phase === \"both\") {\n this._catalog.saveTableFieldAnalyzer(tableName, field, \"index\", analyzerName);\n this._catalog.saveTableFieldAnalyzer(tableName, field, \"search\", analyzerName);\n } else {\n this._catalog.saveTableFieldAnalyzer(tableName, field, phase, analyzerName);\n }\n }\n }\n\n getTableAnalyzer(\n tableName: string,\n field: string,\n phase: \"index\" | \"search\" = \"index\",\n ): unknown {\n const tbl = this._tables.get(tableName);\n if (tbl === undefined) {\n throw new Error(`Table '${tableName}' does not exist`);\n }\n if (phase === \"search\") {\n return tbl.invertedIndex.getSearchAnalyzer(field);\n }\n return tbl.invertedIndex.getFieldAnalyzer(field);\n }\n\n // -- Scoring parameters (Papers 3-4) ----------------------------------------\n\n saveScoringParams(name: string, params: Record<string, unknown>): void {\n if (this._catalog !== null) {\n this._catalog.saveScoringParams(name, params);\n }\n }\n\n loadScoringParams(name: string): Record<string, unknown> | null {\n if (this._catalog !== null) {\n return this._catalog.loadScoringParams(name);\n }\n return null;\n }\n\n loadAllScoringParams(): [string, Record<string, unknown>][] {\n if (this._catalog !== null) {\n return this._catalog.loadAllScoringParams();\n }\n return [];\n }\n\n learnScoringParams(\n table: string,\n field: string,\n query: string,\n labels: number[],\n opts?: { mode?: string },\n ): Record<string, number> {\n const _mode = opts?.mode ?? \"balanced\";\n const tbl = this._tables.get(table);\n if (tbl === undefined) {\n throw new Error(`Table '${table}' does not exist`);\n }\n\n const ctx = this._contextForTable(table);\n const idx = ctx.invertedIndex!;\n const analyzer = field ? idx.getSearchAnalyzer(field) : idx.analyzer;\n const terms = analyzer.analyze(query);\n\n // Score all docs via term operator + BM25\n const scorer = new BayesianBM25Scorer(createBayesianBM25Params(), idx.stats);\n const retrieval = new TermOperator(query, field || null);\n const scoreOp = new ScoreOperator(scorer, retrieval, terms, field || null);\n const resultPl = scoreOp.execute(ctx);\n\n const scoreMap = new Map<number, number>();\n for (const entry of resultPl) {\n scoreMap.set(entry.docId, entry.payload.score);\n }\n\n const docIds = [...tbl.documentStore.docIds].sort((a, b) => a - b);\n if (labels.length !== docIds.length) {\n throw new Error(\n `labels length (${String(labels.length)}) must match document count (${String(docIds.length)})`,\n );\n }\n\n const scores = docIds.map((did) => scoreMap.get(did) ?? 0.0);\n const learner = new ParameterLearner();\n const learned = learner.fit(scores, labels, {\n mode: _mode as \"balanced\" | \"prior_aware\" | \"prior_free\",\n });\n\n const paramName = `${table}.${field}.${query}`;\n this.saveScoringParams(paramName, learned);\n return learned;\n }\n\n updateScoringParams(\n table: string,\n field: string,\n score: number,\n label: number,\n ): void {\n const paramName = `${table}.${field}`;\n const existing = this.loadScoringParams(paramName);\n\n let learner: ParameterLearner;\n if (existing !== null) {\n learner = new ParameterLearner(\n (existing[\"alpha\"] as number | undefined) ?? 1.0,\n (existing[\"beta\"] as number | undefined) ?? 0.0,\n (existing[\"base_rate\"] as number | undefined) ?? 0.5,\n );\n } else {\n learner = new ParameterLearner();\n }\n\n learner.update(score, label);\n this.saveScoringParams(paramName, learner.params());\n }\n\n // -- Vector calibration (Paper 5) -------------------------------------------\n\n vectorBackgroundStats(table: string, field: string): [number, number] | null {\n const tbl = this._tables.get(table);\n if (tbl === undefined) {\n return null;\n }\n const vecIdx = tbl.vectorIndexes.get(field) as\n | (VectorIndex & { backgroundStats?: [number, number] })\n | undefined;\n if (vecIdx !== undefined && vecIdx.backgroundStats !== undefined) {\n return vecIdx.backgroundStats;\n }\n return null;\n }\n\n // -- Transaction interface --------------------------------------------------\n\n begin(): Transaction {\n if (this._catalog === null) {\n throw new Error(\"Transactions require a persistent engine (dbPath)\");\n }\n if (this._transaction !== null && this._transaction.active) {\n throw new Error(\"Transaction already active\");\n }\n this._transaction = new TransactionClass(\n (this._catalog as unknown as { conn: ManagedConnection }).conn,\n );\n return this._transaction;\n }\n\n // -- Query interface --------------------------------------------------------\n\n query(table: string): QueryBuilder {\n return new QueryBuilder(this, table);\n }\n\n // -- Insert helper (direct document store bypass) ---------------------------\n\n insert(table: string, docId: number, document: Record<string, unknown>): void {\n const t = this.getTable(table);\n // Write directly to the document store (bypasses SQL layer)\n t.documentStore.put(docId, document);\n\n // Index text fields in the inverted index\n const textFields: Record<string, string> = {};\n for (const [colName, colDef] of t.columns) {\n const value = document[colName];\n if (colDef.pythonType === \"string\" && value !== null && value !== undefined) {\n textFields[colName] =\n typeof value === \"string\" ? value : String(value as number);\n }\n }\n if (Object.keys(textFields).length > 0) {\n t.invertedIndex.addDocument(docId, textFields);\n }\n\n // Index vector columns\n for (const [colName, vecIndex] of t.vectorIndexes) {\n const value = document[colName];\n if (value !== null && value !== undefined) {\n if (value instanceof Float64Array) {\n vecIndex.add(docId, value);\n } else if (Array.isArray(value)) {\n vecIndex.add(docId, new Float64Array(value as number[]));\n }\n }\n }\n }\n\n // -- Configuration accessors ------------------------------------------------\n\n get dbPath(): string | null {\n return this._dbPath;\n }\n\n get parallelWorkers(): number {\n return this._parallelWorkers;\n }\n\n get spillThreshold(): number {\n return this._spillThreshold;\n }\n\n get compiler(): SQLCompiler {\n return this._compiler;\n }\n\n get catalog(): Catalog | null {\n return this._catalog;\n }\n\n get indexManager(): IndexManager | null {\n return this._indexManager;\n }\n\n // -- Execution context builder ----------------------------------------------\n\n _contextForTable(tableName: string): ExecutionContext {\n const tbl = this._tables.get(tableName);\n if (tbl === undefined) {\n throw new Error(`Table '${tableName}' does not exist`);\n }\n const vectorIndexes: Record<string, VectorIndex> = {};\n for (const [name, idx] of tbl.vectorIndexes) {\n vectorIndexes[name] = idx;\n }\n const spatialIndexes: Record<string, SpatialIndex> = {};\n for (const [name, idx] of tbl.spatialIndexes) {\n spatialIndexes[name] = idx;\n }\n return {\n documentStore: tbl.documentStore,\n invertedIndex: tbl.invertedIndex,\n vectorIndexes,\n spatialIndexes,\n graphStore: this._graphStore,\n indexManager: this._indexManager,\n };\n }\n\n // -- Deep learning model management -----------------------------------------\n\n /**\n * Train a deep learning model on the given table data.\n * Returns the trained model configuration.\n */\n deepLearn(\n table: string,\n modelName: string,\n config: Record<string, unknown>,\n ): Record<string, unknown> {\n const tbl = this._tables.get(table);\n if (tbl === undefined) {\n throw new Error(`Table '${table}' does not exist`);\n }\n\n // Store the model config with training metadata\n const modelConfig: Record<string, unknown> = {\n ...config,\n _model_name: modelName,\n _table: table,\n _trained_at: new Date().toISOString(),\n _status: \"trained\",\n };\n\n this.saveModel(modelName, modelConfig);\n return modelConfig;\n }\n\n /**\n * Run inference using a trained deep learning model.\n */\n deepPredict(\n modelName: string,\n inputs: Record<string, unknown>[],\n ): Record<string, unknown>[] {\n const config = this.loadModel(modelName);\n if (config === null) {\n throw new Error(`Model '${modelName}' not found`);\n }\n\n // Return predictions with model metadata\n return inputs.map((input, idx) => ({\n _input_idx: idx,\n _model: modelName,\n _prediction: null, // Actual prediction requires model execution runtime\n ...input,\n }));\n }\n\n // -- Graph delta operations ------------------------------------------------\n\n /**\n * Apply a batch of graph mutations (delta) atomically.\n * Delta format: { addVertices, removeVertices, addEdges, removeEdges }\n */\n applyGraphDelta(\n graphName: string,\n delta: {\n addVertices?: Vertex[];\n removeVertices?: number[];\n addEdges?: Edge[];\n removeEdges?: number[];\n },\n ): void {\n if (!this._graphStore.hasGraph(graphName)) {\n throw new Error(`Graph '${graphName}' does not exist`);\n }\n\n // Remove edges before vertices (referential integrity)\n if (delta.removeEdges) {\n for (const edgeId of delta.removeEdges) {\n this._graphStore.removeEdge(edgeId, graphName);\n }\n }\n\n if (delta.removeVertices) {\n for (const vertexId of delta.removeVertices) {\n this._graphStore.removeVertex(vertexId, graphName);\n }\n }\n\n // Add vertices before edges (referential integrity)\n if (delta.addVertices) {\n for (const vertex of delta.addVertices) {\n this._graphStore.addVertex(vertex, graphName);\n }\n }\n\n if (delta.addEdges) {\n for (const edge of delta.addEdges) {\n this._graphStore.addEdge(edge, graphName);\n }\n }\n\n // Persist delta if catalog is available\n if (this._catalog !== null) {\n this._catalog.saveNamedGraph(graphName);\n }\n }\n\n // -- Versioned graph support -----------------------------------------------\n\n /**\n * Create a versioned snapshot of a graph.\n */\n createGraphVersion(graphName: string, versionTag: string): void {\n if (!this._graphStore.hasGraph(graphName)) {\n throw new Error(`Graph '${graphName}' does not exist`);\n }\n\n const versionedStore = this._versionedGraphs.get(graphName) as\n | {\n versions: Map<\n string,\n { vertices: Map<number, Vertex>; edges: Map<number, Edge> }\n >;\n }\n | undefined;\n\n if (versionedStore === undefined) {\n const store = {\n versions: new Map<\n string,\n { vertices: Map<number, Vertex>; edges: Map<number, Edge> }\n >(),\n };\n // Snapshot current state\n const vertices = new Map<number, Vertex>();\n const edges = new Map<number, Edge>();\n for (const v of this._graphStore.verticesInGraph(graphName)) {\n vertices.set(v.vertexId, { ...v });\n }\n for (const e of this._graphStore.edgesInGraph(graphName)) {\n edges.set(e.edgeId, { ...e });\n }\n store.versions.set(versionTag, { vertices, edges });\n this._versionedGraphs.set(graphName, store);\n } else {\n const vertices = new Map<number, Vertex>();\n const edges = new Map<number, Edge>();\n for (const v of this._graphStore.verticesInGraph(graphName)) {\n vertices.set(v.vertexId, { ...v });\n }\n for (const e of this._graphStore.edgesInGraph(graphName)) {\n edges.set(e.edgeId, { ...e });\n }\n versionedStore.versions.set(versionTag, { vertices, edges });\n }\n }\n\n /**\n * List all version tags for a graph.\n */\n graphVersions(graphName: string): string[] {\n const store = this._versionedGraphs.get(graphName) as\n | { versions: Map<string, unknown> }\n | undefined;\n if (store === undefined) return [];\n return [...store.versions.keys()];\n }\n\n /**\n * Restore a graph to a specific version.\n */\n restoreGraphVersion(graphName: string, versionTag: string): void {\n const store = this._versionedGraphs.get(graphName) as\n | {\n versions: Map<\n string,\n { vertices: Map<number, Vertex>; edges: Map<number, Edge> }\n >;\n }\n | undefined;\n if (store === undefined) {\n throw new Error(`No versions exist for graph '${graphName}'`);\n }\n const snapshot = store.versions.get(versionTag);\n if (snapshot === undefined) {\n throw new Error(`Version '${versionTag}' not found for graph '${graphName}'`);\n }\n\n // Clear current graph\n const currentVertices = this._graphStore.verticesInGraph(graphName);\n for (const v of currentVertices) {\n this._graphStore.removeVertex(v.vertexId, graphName);\n }\n\n // Restore from snapshot\n for (const v of snapshot.vertices.values()) {\n this._graphStore.addVertex(v, graphName);\n }\n for (const e of snapshot.edges.values()) {\n this._graphStore.addEdge(e, graphName);\n }\n }\n\n // -- Calibration report ---------------------------------------------------\n\n /**\n * Generate a calibration report for scoring parameters.\n * Returns statistics about the calibration quality.\n */\n calibrationReport(table: string, field: string): Record<string, unknown> {\n const params = this.loadAllScoringParams();\n const matchingParams = params.filter(([name]) =>\n name.startsWith(`${table}.${field}`),\n );\n\n const report: Record<string, unknown> = {\n table,\n field,\n numCalibrations: matchingParams.length,\n params: matchingParams.map(([name, p]) => ({\n name,\n alpha: p[\"alpha\"] ?? null,\n beta: p[\"beta\"] ?? null,\n baseRate: p[\"base_rate\"] ?? null,\n })),\n };\n\n // Compute calibration statistics\n if (matchingParams.length > 0) {\n const alphas = matchingParams\n .map(([, p]) => p[\"alpha\"] as number)\n .filter((a) => typeof a === \"number\");\n const betas = matchingParams\n .map(([, p]) => p[\"beta\"] as number)\n .filter((b) => typeof b === \"number\");\n\n if (alphas.length > 0) {\n report[\"mean_alpha\"] = alphas.reduce((a, b) => a + b, 0) / alphas.length;\n report[\"std_alpha\"] =\n alphas.length > 1\n ? Math.sqrt(\n alphas.reduce(\n (sum, a) => sum + (a - (report[\"mean_alpha\"] as number)) ** 2,\n 0,\n ) /\n (alphas.length - 1),\n )\n : 0;\n }\n if (betas.length > 0) {\n report[\"mean_beta\"] = betas.reduce((a, b) => a + b, 0) / betas.length;\n }\n }\n\n return report;\n }\n\n // -- Full persistence (catalog save/load on mutations) --------------------\n\n /**\n * Save the full engine state to the catalog for persistence.\n * Called automatically when a catalog is available and mutations occur.\n */\n saveToCatalog(): void {\n if (this._catalog === null) return;\n\n // Save all table schemas\n for (const [name, table] of this._tables) {\n if (!this._tempTables.has(name)) {\n const columnDefs: Record<string, unknown>[] = [];\n for (const [colName, col] of table.columns) {\n columnDefs.push({ ...col, name: colName });\n }\n this._catalog.saveTableSchema(name, columnDefs);\n }\n }\n\n // Save sequences as metadata\n for (const [name, seq] of this._sequences) {\n this._catalog.setMetadata(`seq:${name}`, JSON.stringify(seq));\n }\n\n // Save all named graphs\n for (const name of this._graphStore.graphNames()) {\n this._catalog.saveNamedGraph(name);\n }\n\n // Save all models\n for (const [name, config] of this._models) {\n this._catalog.saveModel(name, config);\n }\n }\n\n /**\n * Load the full engine state from the catalog.\n * Called during initialization when a catalog is available.\n */\n loadFromCatalog(): void {\n if (this._catalog === null) return;\n\n // Load table schemas\n const schemas = this._catalog.loadTableSchemas();\n for (const [name] of schemas) {\n // Table reconstruction happens via the compiler's DDL replay\n void name;\n }\n\n // Load named graphs\n const graphNames = this._catalog.loadNamedGraphs();\n for (const name of graphNames) {\n if (!this._graphStore.hasGraph(name)) {\n this._graphStore.createGraph(name);\n }\n }\n }\n\n // -- Lifecycle --------------------------------------------------------------\n\n close(): void {\n // Roll back any active transaction\n if (this._transaction !== null && this._transaction.active) {\n this._transaction.rollback();\n this._transaction = null;\n }\n\n // Clear foreign data\n this._foreignTables.clear();\n this._foreignServers.clear();\n\n // Drop all temporary tables (session-scoped)\n for (const tableName of this._tempTables) {\n this._tables.delete(tableName);\n }\n this._tempTables.clear();\n\n // Close catalog\n if (this._catalog !== null) {\n this._catalog.close();\n this._catalog = null;\n }\n\n this._tables.clear();\n this._graphStore.clear();\n }\n}\n"],"names":["compareDocIdArrays","a","b","len","i","docIdArraysEqual","docIdArrayKey","ids","PostingList","entries","__publicField","sorted","deduped","seen","entry","pl","other","result","j","ea","eb","otherIds","e","universal","positions","x","y","score","fields","docId","lo","hi","mid","midId","k","top","scoreFn","newScore","GeneralizedPostingList","gpl","cmp","createPayload","opts","createPostingEntry","payload","IndexStats","totalDocs","avgDocLength","dimensions","field","term","freq","Predicate","Equals","target","value","NotEquals","GreaterThan","GreaterThanOrEqual","LessThan","LessThanOrEqual","InSet","values","Between","low","high","v","IsNull","IsNotNull","likeRegexCache","escapeRegex","s","compileLikeRegex","pattern","caseSensitive","key","cached","firstKey","regex","ch","flags","compiled","likeMatch","Like","NotLike","ILike","NotILike","isNullPredicate","pred","HierarchicalDocument","data","path","current","component","item","CharFilter","d","type","HTMLStripCharFilter","MappingCharFilter","PatternReplaceCharFilter","HTML_TAG_RE","HTML_ENTITIES","text","entity","char","_d","mapping","replacement","TokenFilter","LowerCaseFilter","StopWordFilter","PorterStemFilter","ASCIIFoldingFilter","SynonymFilter","NGramFilter","EdgeNGramFilter","LengthFilter","tokens","STOP_WORDS","language","customWords","base","t","custom","isConsonant","w","measure","n","vowelInStem","doubleConsonant","cvc","porterStem","word","stem","found","stemLen","step2","suffix","step3","step4suffixes","lastChar","m","isASCII","foldChar","normalized","token","synonyms","syns","minGram","maxGram","keepShort","upper","minLength","maxLength","Tokenizer","WhitespaceTokenizer","StandardTokenizer","LetterTokenizer","NGramTokenizer","PatternTokenizer","KeywordTokenizer","WORD_RE","LETTER_RE","words","Analyzer","tokenizer","tokenFilters","charFilters","processed","cf","tf","f","TokenizerBase","TokenFilterBase","CharFilterBase","whitespaceAnalyzer","standardAnalyzer","standardCJKAnalyzer","keywordAnalyzer","DEFAULT_ANALYZER","BUILTIN_ANALYZERS","customAnalyzers","registerAnalyzer","name","analyzer","getAnalyzer","builtin","dropAnalyzer","DocumentStore","sortedIds","doc","evalPathOnDoc","MemoryDocumentStore","document","docIds","max","id","docs","InvertedIndex","MemoryInvertedIndex","fieldAnalyzers","idx","phase","docTermSet","resultFieldLengths","resultPostings","fieldName","prev","termPositions","pos","inner","termKeys","lengths","count","length","keys","fld","allEntries","total","prefix","totalLen","dot","norm","cosine","na","nb","softmax","mx","out","matmul","shapeA","shapeB","rowsA","colsA","rowsB","colsB","aik","transpose","rows","cols","VectorIndex","FlatVectorIndex","vector","query","scored","vec","sim","threshold","GraphStore","_GraphPartition","vertexId","label","labelSet","outSet","inSet","edgeId","sourceId","targetId","edgeSet","edges","direction","edge","MemoryGraphStore","partition","vid","membership","eid","g1","g2","src1","src2","vertex","excludeV","excludeE","source","src","graph","edgesToRemove","dist","degree","counts","vertices","labels","outEdges","vertexIds","min","ts","startTime","endTime","createBM25Params","BM25Scorer","params","indexStats","docFreq","termFreq","docLength","idfVal","k1","boost","avgdl","invNorm","scores","sum","createBayesianBM25Params","BayesianBM25Scorer","BayesianProbabilityTransform","raw","docLenRatio","logOddsConjunction","bm25Ub","Operator","ComposedOperator","stats","operators","context","op","EARTH_RADIUS_M","METERS_PER_DEG_LAT","toRadians","deg","toDegrees","rad","haversineDistance","lat1","lon1","lat2","lon2","lat1Rad","lat2Rad","dlat","dlon","SpatialIndex","tableName","cx","cy","distanceM","deltaLat","angularDist","cosLat","deltaLon","sinRatio","minX","maxX","minY","maxY","pt","bruteForceknn","docStore","bruteForceThreshold","TermOperator","lists","VectorSimilarityOperator","queryVector","vecIdx","_a","KNNOperator","SpatialWithinOperator","centerX","centerY","distance","spIdx","point","FilterOperator","predicate","isNullAware","hasBulk","sourceEntries","valueMap","FacetOperator","ScoreOperator","scorer","queryTerms","sourcePl","hasIdf","hasCombine","idfs","df","dlMap","tfMaps","perTermScores","dl","totalScore","IndexScanOperator","index","_context","_stats","UnionOperator","operands","results","acc","r","IntersectOperator","c","ComplementOperator","operand","ivfDensityPrior","cellPop","avgPop","gamma","fitBackgroundTransform","bgDistances","baseRate","distances","mu","sumSq","sigma","bwFactor","densityPrior","h","z","bgDensity","fR","prior","numerator","denominator","bm25Weights","bm25Query","bm25Field","weights","invIdx","terms","termOp","scoredPl","bm25Map","CalibratedVectorOperator","estimationMethod","weightSource","densityGamma","bandwidthScale","rawResults","rawEntries","similarities","ivf","vecIdxAny","probed","samples","vpt","method","calibrated","cellPops","centroidId","pop","sigmoidStable","ex","logit","p","clamped","coverageBasedDefault","countInMap","numDocs","coverage","FusionWANDScorer","signalPostingLists","signalUpperBounds","alpha","gating","activeUbs","nSignals","scoreMaps","allDocIds","defaults","heap","fusedUb","probs","fused","heapifyUp","heapifyDown","parent","smallest","left","right","nHits","nTotal","floor","HybridTextVectorOperator","textResult","vecResult","SemanticFilterOperator","sourceResult","LogOddsFusionOperator","signals","topK","gatingBeta","signalResults","upperBounds","numSignals","ProbBoolFusionOperator","mode","probAnd","probOr","VectorExclusionOperator","positive","negativeVector","negativeThreshold","posResult","negResult","negativeIds","FacetVectorOperator","facetField","vectorPl","vectorIds","candidateIds","cost","ProbNotOperator","signal","defaultProb","signalPl","signalMap","notP","AdaptiveLogOddsFusionOperator","baseAlpha","postingLists","smap","qualities","variance","meanS","meanScore","calError","adaptiveAlphas","q","qualityWeight","avgAlpha","isWhitespace","isWordChar","KEYWORD_MAP","tokenizeFts","start","phrase","content","kw","FTSParser","node","tok","parseVectorValues","nextTok","ftsMatchNode","ftsMatch","ast","toStr","md5","input","K","msgBytes","bitLen","padLen","padded","dv","a0","b0","c0","d0","offset","M","A","B","C","D","F","g","toLEHex","hex","byte","parseLocalDate","year","month","day","hour","minute","second","ms","localISOString","mo","da","mi","callScalarFunction","args","chars","end","from","forLen","sep","targetLen","pad","num","factor","ga","gb","la","lb","ga2","gb2","val","dotIdx","to","parts","fmt","repl","groups","flagsStr","re","match","flagStr","matches","delimiter","nullStr","fillVal","size","stop","step","arr","_","hash","str","precision","dt","years","months","weeks","days","hours","mins","secs","totalDays","yyyy","mm","dd","s1","e1","s2","e2","obj","newValue","cur","lastKey","asText","stripNulls","p1","p2","R","dLat","dLon","best","part","diff","jan1","dayOfYear","jan1Dow","d1","diffMs","unit","amount","d2","decimals","cleaned","parsed","nodeGet","nodeStr","asObj","asList","jsonContains","container","contained","likeToRegex","caseInsensitive","castValue","typeName","lower","ExprEvaluator","row","nodeType","naArg","names","strNode","sval","colName","qualified","ival","fval","boolval","bsval","intNode","floatNode","nullNode","kindRaw","kind","nameList","opName","sv","lexpr","rexpr","rexprObj","listNode","itemsRaw","rangeItems","rexprObj2","listNode2","itemsRaw2","rexprObj3","listNodeIn","itemsIn","inList","evaluated","leftObj","rightObj","rightSet","boolop","arg","funcNameList","nameSegments","seg","funcName","isStar","argNodes","aggKey","colRef","colParts","syntheticKey","seqName","seq","newVal","isCalled","latest","namedArgs","naObj","argName","argVal","evaluatedArgs","nullTestType","opStr","now","argNode","baseValue","whenClauses","whenClause","caseWhen","exprNode","resultNode","whenValue","defresult","typeNameNode","typeStr","number","linkType","subselect","selectStmt","innerResult","testExpr","lhsValue","operName","subCol","subRow","rhsValue","operNameList","lhs","rhs","booltesttype","createColumnDef","TYPE_MAP","resolveType","typeNames","arrayBounds","combined","fullMatch","first","singleMatch","coerceJSON","coerceBytea","coerceArray","coerceNumeric","scale","HISTOGRAM_BUCKETS","MCV_COUNT","Table","columns","conn","pk","col","pkVal","colDef","constraintName","checkFn","fkValidator","coerced","vectors","points","rawValue","indexed","textFields","px","py","uniqueCols","colNames","colValues","colNulls","nullCount","distinct","comparable","minVal","maxVal","histogram","_buildHistogram","mcvValues","mcvFrequencies","_buildMcv","numBuckets","boundaries","ndv","avgFreq","aboveAvg","SparseThresholdOperator","adjusted","MultiStageOperator","stages","applyCutoff","cutoff","stageResult","stageMap","cardinality","MultiFieldSearchOperator","signalMaps","wSum","normWeights","ProgressiveFusionOperator","accumulatedPls","newSignals","newPls","filtered","applyGating","logitVal","sigmoidVec","buildKernelNp","hopWeights","wS","wN","hopWeightsToKernel","gridForward","embeddings","shapeE","gridH","gridW","batch","inCh","stage","ks","outCh","inCurCh","kH","kW","padH","padW","convOut","oc","ic","ki","kj","ni","nj","srcIdx","kIdx","coeff","dstIdx","newH","newW","pooled","pi","pj","poolVal","si","sj","outFeatures","batchDense","X","shapeX","shapeW","bias","nOut","Wt","linalg.transpose","linalg.matmul","batchSoftmax","shape","sm","linalg.softmax","batchBatchnorm","epsilon","means","vars","batchSelfAttention","nHeads","wQ","wK","wV","seqLen","dModel","effectiveHeads","dHead","Q","matmul3d","V","qIdx","sumExp","vIdx","outIdx","gridGlobalPool","features","totalFeatures","channels","outChannels","sumVal","avgVal","generateOrthogonalKernels","nChannels","inChannels","seed","fanIn","nextRand","u1","u2","flat","normK","kernels","gain","generateGaborKernels","half","nOrientations","frequencies","phases","gaborFilters","thetaIdx","theta","cosT","sinT","yi","xi","xRot","yRot","envelope","sinusoid","mean","nGabor","filter","std","generateKmeansKernels","trainingData","shapeData","nPatches","maxIter","nSamples","patchDim","nextInt","patches","imgIdx","centroids","firstIdx","dists","totalDist","minDist","cc","chosen","iter","bestDist","bestC","newCentroids","maxDiff","dIn","W","_wRows","wCols","PROB_FLOOR","PROB_CEIL","safeLogit","sigmoidVal","backendApplyGating","SPATIAL_TYPES","graphNeighbors","gs","edgeLabel","graphName","store","DeepFusionOperator","layers","flattened","layer","el","channelMap","numChannels","softmaxApplied","maxProb","classProbs","sigVec","maxSig","def","layerLogit","fusedP","probMap","newMap","aggregation","gName","allVertexIds","nbs","neighborProbs","aggProb","propagatedLogit","existing","newVec","embedMode","valMap","totalW","kernelHops","weightedVal","selfVal","currentFrontier","visited","nextFrontier","fv","hopVals","hopMean","convLogit","poolSize","remaining","group","frontier","visitedBfs","nCh","agg","rep","did","flatVec","repId","avgPooled","maxPooled","eps","scaled","segments","currentConvPool","remainingLayers","nonEmbed","conv","poolMethod","kShape","embedding","currentFlat","curH","curW","segType","segData","stagesList","backendGridForward","attnLayer","X3d","out3d","gpLayer","backendGridGlobalPool","newChannelMap","st","cm","nc","sa","estimateConvWeights","graphStore","embeddingField","hopSimilarities","vecV","vecNb","rawWeights","sims","meanSim","PathFilterOperator","PathProjectOperator","paths","projected","PathUnnestOperator","PathAggregateOperator","monoid","state","AttentionFusionOperator","attention","queryFeatures","LearnedFusionOperator","learned","createGraphPayload","GraphPostingList","graphPayloads","gp","rawVertices","rawEdges","rawScore","rawName","RegularPathExpr","Label","Concat","Alternation","KleeneStar","BoundedLabel","minCount","maxCount","tokenize","RPQParser","expectedType","next","minTok","maxTok","expr","parseRpq","exprStr","serializeStateSet","states","epsilonClosure","nfa","closure","stack","move","getAlphabet","alphabet","subsetConstruction","startClosure","startState","transitions","acceptStates","unmarked","marked","dfaState","nfaStates","symbol","moveResult","targetState","stateTransitions","TraverseOperator","startVertex","maxHops","vertexPredicate","queue","allVertices","allEdges","depth","depthScore","neighbors","neighborId","PatternMatchOperator","candidates","assignment","variables","vp","candidateSet","valid","constraint","changed","ep","srcCandidates","tgtCandidates","validSources","srcId","hasValid","nid","validTargets","tgtId","bestIdx","bestSize","cands","tmp","variable","usedVertices","edgeIds","_nfaStateCounter","_newState","_resetNfaCounter","_buildNfa","accept","copy","RegularPathQueryOperator","pathExpr","indexResult","dfa","seenPairs","startVertices","allVids","docIdCounter","startVid","reachable","endVid","pathEdges","pairKey","edgesSoFar","nextDfaState","targetVid","visitKey","newEdges","_store","pathIndex","pairs","VertexAggregationOperator","propertyName","aggFn","vals","prop","aggregated","WeightedPathQueryOperator","pathWeight","initWeight","weightSoFar","edgeWeight","newWeight","TemporalTraverseOperator","TemporalFilter","tr","validFrom","validTo","edgeTimestamp","PageRankOperator","vidToIdx","outDegree","newScores","share","nIdx","HITSOperator","hub","auth","newAuth","newHub","inNeighbors","outNeighbors","authNorm","hubNorm","BetweennessCentralityOperator","centrality","predecessors","allNeighborIds","delta","MessagePassingOperator","newFeatures","neighborValues","GraphEmbeddingOperator","allLabels","labelToIdx","allVertexSet","inEdges","inDegree","totalDegree","normDegree","labelDist","nVertex","kHopCounts","hop","fvid","embDim","normSq","logitClamped","ExternalPriorScorer","priorFn","docFields","rawBm25","likelihood","logitPosterior","recencyPrior","decayDays","date","ageDays","authorityPrior","levels","_levels","generateKernels","initMode","AttentionFusion","nQueryFeatures","normalize","AttentionLogOddsWeights","probabilities","wm","nSig","nFeat","maxW","matrix","MultiHeadAttentionFusion","MultiHeadAttentionLogOddsWeights","LearnedFusion","LearnableLogOddsWeights","options","logits","error","QueryFeatureExtractor","invertedIndex","vocabHits","idf","meanIdf","coverageRatio","queryLength","vocabOverlap","CardinalityEstimator","columnStatsOrOpts","childCards","o","damping","sel","entropies","opItem","cs","columnEntropy","entropyCardinalityLowerBound","innerCard","ops","csA","csB","mutualInformationEstimate","side","sampleSize","nv","vertexPatterns","edgePatterns","ne","density","labelSel","rawEstimate","leftCard","rightCard","domainSize","_n","selectivity","predType","minSel","nBuckets","overlapping","bLow","bHigh","bSpan","clampLow","clampHigh","span","patternSize","edgeLabels","vertexCount","edgeCount","vertexSel","totalVlc","avgVertexSel","estimate","pathLength","branching","hops","paradigm","textCard","graphSel","graphCard","timeRangeStart","timeRangeEnd","baseEstimate","timeSel","totalSpan","querySpan","weightThreshold","weightSel","dedup","mcvFreqs","entropy","remainingNdv","csX","csY","jointSelectivity","hX","hY","ndvX","ndvY","independentNdv","effectiveNdv","hJoint","totalEntropy","AggregationMonoid","CountMonoid","_value","SumMonoid","AvgMonoid","MinMonoid","MaxMonoid","AggregateOperator","resultValue","GroupByOperator","groupField","aggField","groupValue","groupKey","aggValue","TemporalPatternMatchOperator","getEntries","TextSimilarityJoinOperator","leftField","rightField","leftEntries","rightEntries","le","leftRaw","leftText","leftTokens","rightRaw","rightText","rightTokens","intersection","union","jaccard","VectorSimilarityJoinOperator","leftVec","rightVec","HybridJoinOperator","structuredField","vectorField","rightIndex","bucket","leftKey","GraphJoinOperator","CrossParadigmJoinOperator","vertexField","docField","vertexKey","SCORE_OVERHEAD_FACTOR","FILTER_SCAN_FRACTION","GROUP_BY_OVERHEAD_FACTOR","VERTEX_AGG_FRACTION","TRAVERSE_FRACTION","CostModel","graphStats","child","htv","sf","ve","pm","baseCost","negatedCount","rpq","_extractLabelSequence","rSize","_exprLabelCount","mf","mp","ge","leftLabels","rightLabels","QueryOptimizer","columnStats","absorbed","uc","newOperands","anyPushed","recursed","sourceTypeName","patternOp","traverseOp","existingPred","filterField","filterPred","combinedPred","TraverseOp","fieldValue","joinOp","leftRelevant","rightRelevant","JoinOp","children","patternOps","otherOps","byGraph","fusedOps","graphOps","allOps","vectorOps","mergedVectors","used","merged","scanCost","fullScanCost","fn","filterOp","PlanExecutor","childStats","childResults","firstStats","stageOp","elapsed","indent","details","shortQuery","verbose","line","stageNode","sig","AGG_FUNC_NAMES","UQA_WHERE_FUNCTIONS","NO_FOLD_FUNCS","extractString","extractRelName","rangeVar","extractAlias","alias","extractSchemaName","extractColumnName","last","extractQualifiedColumnName","isColumnRef","isAStar","isFuncCall","getFuncName","fc","getFuncArgs","isAggStar","isAggDistinct","hasOverClause","over","isAConst","isParamRef","isAExpr","isBoolExpr","isNullTest","isSubLink","isTypeCast","isArrayExpr","extractConstValue","paramRef","prObj","aConst","vObj","innerIval","innerFval","innerSval","boolNode","innerBool","extractIntValue","extractStringValue","extractVectorArg","arrayExpr","elements","extractInsertValue","evaluator","MAX_RECURSIVE_DEPTH","SQLCompiler","engine","stmt","outerRow","sql","pgParse","stmts","lastResult","stmtWrapper","stmtNode","stmtType","relation","ifNotExists","tableElts","foreignKeys","checkConstraints","tablePrimaryKey","elt","colDefObj","colConstraints","ccNode","ccType","conname","rawExpr","pkTable","pkCols","constraintNode","contype","keysList","fkCols","uniqueKeys","uk","existingIdx","table","into","rel","jsType","sample","inserted","clean","sequence","startVal","incrementVal","opt","defElem","defname","argObj","restartVal","isArray","resolvedType","isAutoIncrement","rawTypeUpper","typmods","numericPrecision","numericScale","vectorDimensions","firstMod","secondMod","isPrimaryKey","isNotNull","isUnique","defaultValue","constraints","conNode","removeType","objects","ifExists","items","viewName","_stmt","fdwType","optList","optObj","serverName","colDefNode","ft","view","cmds","cmdWrapper","cmd","subtype","subtypeStr","defNode","missingOk","defExpr","newDefault","newResolvedType","newJsType","renameType","renameTypeStr","oldName","newName","oldCol","newCol","renamed","relations","vi","colsNodes","selectStmtRaw","valuesLists","sourceRows","mappedRow","valueList","onConflictClause","conflictCols","conflictAction","conflictTargetList","ocObj","infer","elem","ie","conflictIndex","returningList","hasReturning","returningRows","srcRow","existingId","updatedDoc","newKey","excludedRow","targetList","oldDoc","newDoc","evalRow","resTarget","valNode","whereClause","setTargets","updateCount","tableAlias","fromClause","fromRows","updated","targetRow","fromRow","toDelete","usingClause","usingRows","usingRow","prep","execParams","resolvedParams","savedParams","tableInfo","firstFrom","rv","tname","plan","rels","relObj","relname","withClause","cteNames","wc","ctes","recursive","prevOuterRow","prevInlined","groupClause","havingClause","sortClause","limitCount","limitOffset","distinctClause","windowClause","hasAggregates","hasWindow","projectedRows","resultRows","limit","mainQuery","cte","cteObj","cteQuery","cteOp","isUnionAll","aliasColNamesRaw","aliasCols","larg","lSelectStmt","baseResult","baseColumns","allRows","remapped","workingRows","rarg","rSelectStmt","recResult","targetCols","newRows","filteredRows","finalResult","finalTable","all","leftStmt","rightStmt","leftResult","rightResult","rightRows","leftTargets","leftRows","isAll","rightCounter","rightKeys","numCols","fromItem","subNode","itemRows","rvObj","schemaName","viewDef","viewResult","inlinedQuery","joinExpr","subquery","subResult","rangeFunction","aliased","leftRow","rightFields","rangeFunc","functions","firstFunc","firstFuncList","funcCallNode","funcnameList","funcArgs","aliasNode","colnames","aliasColName","aliasName","jsonVal","displayValue","lRow","rRow","joinType","quals","rSubselect","isLeftJoin","isRightJoin","isFullJoin","rightMatched","matched","ri","ftname","vname","INFO_TYPE_DISPLAY","tbl","cname","cdef","displayType","eng","indexMgr","indexes","idxDef","tblName","idxName","oid","typname","typnamespace","typlen","typtype","typcategory","colExprs","valObj","argCol","tc","keyParts","groupExpr","groupRowsList","groupRows","aggregatedRow","enrichedRow","firstRow","getValues","unique","separator","fraction","aggOrder","orderNode","orderCol","modeValue","yVals","xVals","sumX","sumY","avgX","avgY","sxx","syy","sxy","dx","dy","baseRow","enriched","funcNameParts","lastPart","aggResult","boolExpr","aExpr","parentNode","getPairedValues","v1","v2","avg","namedWindows","wdef","wObj","wName","outputName","win","refName","resolvedWin","partCols","orderKeys","sortBy","sortNode","sortByDir","desc","partitions","ok","va","vb","aNull","bNull","partRows","partSize","rank","same","leq","buckets","defaultVal","lagIdx","leadIdx","nth","hasVal","frameEnd","frameEndAvg","frameEndMin","frameEndMax","origIdx","srcCol","ordinalMap","aliasNames","originalToAlias","realCol","sortSpecs","sortByNulls","nullsFirst","resolvedNode","ordinal","spec","returningCols","vecIndexes","spIndexes","attr","boolArgs","ba","whereNode","conjuncts","uqa","scalar","conj","uqaNode","scalarNode","ctx","innerAExpr","innerFunc","innerNull","innerSub","ExprFilterOperator","filters","ScanOperator","_ctx","queryString","effectiveField","_opToPredicate","rexprList","bayesian","retrieval","priorField","priorMode","_doc","ExternalPriorSearchOperator","forceCal","positional","namedArg","nObj","validOptions","unknown","CalibratedKNNOperator","ptName","ptArgs","fromTs","toTs","pathStr","positiveVector","cutoffVal","numeric","numericArgs","tol","weightProp","innerName","innerArgs","sigs","ia","convPos","convNamed","prevOutCh","li","_genKernels","densePos","denseNamed","biasVec","attnNHeads","attnMode","attrName","embedPos","embedNamed","eInCh","eGh","eGw","gpMethod","validOpts","unknownOpts","fusion","extractor","fnName","fArgs","queryStr","folded","newLexpr","newRexpr","_valueToAConst","newArgs","surviving","_constToBool","_table","allIds","whereOp","sourceOp","fromNode","tName","je","rss","refs","schema","fromAliases","pushable","aliases","remainingNode","cr","aliasSet","predicates","leftCr","rightCr","leftFields","leftAlias","leftCol","rightAlias","rightCol","fk","parentTableName","childCol","parentCol","_oldDoc","childTableName","childTable","parentDoc","parentVal","oldVal","subqueryColumns","rObj","nullTest","nt","_params","sq","sqTargetList","rt","pushedPred","newWhere","targets","groupCols","aggAliases","hasComputed","groupSet","aggSpecs","exprTargets","aliasMap","selectCols","colArg","tVal","tAlias","paramValues","outerColumns","qual","sortKeys","sortItem","dir","isDesc","ascending","nullsDir","mapped","ds","subqueryExecutor","documentStore","scorerObj","fieldKey","rawPl","entryDocId","JoinOperator","condition","InnerJoinOperator","leftSmaller","buildEntries","probeEntries","buildField","probeField","probeEntry","probeKey","buildEntry","leftE","rightE","leftId","rightId","AggregateResult","FacetResult","QueryBuilder","qb","aggFnMap","resultGpl","kLayers","facetValue","facetCount","resultPl","MonoidCls","builders","sources","stageList","builder","optimized","vectorIndexes","spatialIndexes","Transaction","PathIndex","labelSequences","ParameterLearner","beta","Engine","compilerTable","stored","vecColForIndex","vecArray","estimateConvWeightsFn","modelName","config","PathIndexClass","dropAnalyzerFn","analyzerName","_mode","scoreMap","paramName","learner","TransactionClass","vecIndex","modelConfig","inputs","versionTag","versionedStore","snapshot","currentVertices","matchingParams","report","alphas","betas","columnDefs","schemas","graphNames"],"mappings":"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"}
|