{"version":3,"file":"clickhouse.cjs","names":["#opts","#client","#ensure","#json","#dims","#parseMeta","#project"],"sources":["../../../src/batteries/vector/clickhouse/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/clickhouse\n *\n * ClickHouse adapter. Vectors live in an `Array(Float32)` column; KNN uses ClickHouse's\n * `cosineDistance` / `L2Distance` / negative-inner-product expressions ordered ascending.\n * Metadata is a JSON `String` column, filtered with the neutral filter tree's JS reference\n * evaluator for exact cross-adapter parity. Each collection is a MergeTree table.\n *\n * MergeTree allows duplicate keys, so upsert is delete-then-insert; writes are made\n * read-after-write consistent with `mutations_sync = 2` on deletes.\n *\n * Driver: `@clickhouse/client` (HTTP).\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n  E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n  E_VECTOR_STORE_CONNECTION_FAILED,\n  E_VECTOR_STORE_COLLECTION_FAILED,\n  E_VECTOR_STORE_UPSERT_FAILED,\n  E_VECTOR_STORE_SEARCH_FAILED,\n  E_VECTOR_STORE_DELETE_FAILED,\n  E_VECTOR_STORE_DIMENSION_MISMATCH,\n  E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n  VectorMatch,\n  VectorStoreCapabilities,\n  BaseVectorStoreOptions,\n  VectorMetadata,\n  DistanceMetric,\n} from '../types'\n\nexport interface ClickHouseVectorStoreOptions extends BaseVectorStoreOptions {\n  /** Connection and authentication parameters for the backend. */\n  connection?: { url?: string; username?: string; password?: string; database?: string }\n}\n\nconst getClickHouseClient = async () => {\n  try {\n    const mod = await import('@clickhouse/client')\n    return mod.createClient\n  } catch {\n    throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@clickhouse/client'])\n  }\n}\n\n// ClickHouse distance expression per metric (all \"lower is closer\" once negated for dot).\nconst distanceExpr = (metric: DistanceMetric, vecLit: string): string =>\n  metric === 'euclidean'\n    ? `L2Distance(vec, ${vecLit})`\n    : metric === 'dot'\n      ? `-arraySum(arrayMap((a, b) -> a * b, vec, ${vecLit}))`\n      : `cosineDistance(vec, ${vecLit})`\n\n// Backtick-quote an identifier, escaping embedded backticks.\nconst ident = (name: string): string => '`' + name.replace(/`/g, '``') + '`'\n\n// Single-quoted ClickHouse string literal.\nconst lit = (value: string): string => `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n\n// number[] → ClickHouse array literal [1, 2, 3].\nconst vectorLiteral = (vector: number[]): string =>\n  `[${vector.map((n) => (Number.isFinite(n) ? String(n) : '0')).join(', ')}]`\n\nexport class ClickHouseVectorStore extends BaseVectorStore {\n  readonly capabilities: VectorStoreCapabilities = {\n    transactions: false,\n    namedVectors: false,\n    rename: true,\n    rawSql: true,\n    builtInEncoding: false,\n    // Made strongly consistent via mutations_sync=2 on deletes; writes visible on resolve.\n    consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n  }\n\n  #client: any | null = null\n  #dims: Map<string, number> = new Map()\n\n  get #opts(): ClickHouseVectorStoreOptions {\n    return this.options as ClickHouseVectorStoreOptions\n  }\n\n  /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\n  static isAvailable(): boolean {\n    return typeof process !== 'undefined'\n  }\n  isAvailable(): boolean {\n    return typeof process !== 'undefined'\n  }\n\n  async connect(): Promise<void> {\n    if (this.#client) return\n    const createClient = await getClickHouseClient()\n    const c = this.#opts.connection || {}\n    try {\n      this.#client = createClient({\n        url: c.url ?? 'http://localhost:8123',\n        username: c.username ?? 'default',\n        password: c.password ?? '',\n        database: c.database ?? 'default',\n      })\n    } catch (err) {\n      throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n    }\n  }\n\n  async close(): Promise<void> {\n    if (this.#client) {\n      await this.#client.close()\n      this.#client = null\n    }\n  }\n\n  async #ensure(): Promise<any> {\n    if (!this.#client) await this.connect()\n    return this.#client!\n  }\n\n  async #json(sql: string): Promise<any[]> {\n    const client = await this.#ensure()\n    const rs = await client.query({ query: sql, format: 'JSONEachRow' })\n    return (await rs.json()) as any[]\n  }\n\n  async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n    const client = await this.#ensure()\n    this.#dims.set(spec.collection, spec.vector.dimensions)\n    const ine = ifNotExists ? 'IF NOT EXISTS ' : ''\n    try {\n      await client.command({\n        query:\n          `CREATE TABLE ${ine}${ident(spec.collection)} (` +\n          `id String, vec Array(Float32), document String, metadata String` +\n          `) ENGINE = MergeTree() ORDER BY id`,\n      })\n    } catch (err) {\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n    }\n  }\n\n  async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n    const client = await this.#ensure()\n    const ie = ifExists ? 'IF EXISTS ' : ''\n    try {\n      await client.command({ query: `DROP TABLE ${ie}${ident(collection)}` })\n      this.#dims.delete(collection)\n    } catch (err) {\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n    }\n  }\n\n  async hasCollection(collection: string): Promise<boolean> {\n    const rows = await this.#json(`EXISTS TABLE ${ident(collection)}`)\n    return rows.length > 0 && (rows[0].result === 1 || rows[0].result === '1')\n  }\n\n  async renameCollection(from: string, to: string): Promise<void> {\n    const client = await this.#ensure()\n    try {\n      await client.command({ query: `RENAME TABLE ${ident(from)} TO ${ident(to)}` })\n      const d = this.#dims.get(from)\n      if (d !== undefined) {\n        this.#dims.set(to, d)\n        this.#dims.delete(from)\n      }\n    } catch (err) {\n      throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', String(err)])\n    }\n  }\n\n  async executeUpsert(plan: UpsertPlan): Promise<void> {\n    if (plan.records.length === 0) return\n    validateRecords(plan.records)\n    const client = await this.#ensure()\n    const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n    const values: any[] = []\n    const ids: string[] = []\n    try {\n      for (const r of plan.records) {\n        let vector = r.vector\n        if (!vector && r.document) {\n          const [v] = await this.encode([r.document], 'document')\n          vector = v\n        }\n        if (!vector) {\n          throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n        }\n        if (expected !== undefined && vector.length !== expected) {\n          throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n        }\n        ids.push(r.id)\n        values.push({\n          id: r.id,\n          vec: vector,\n          document: r.document ?? '',\n          metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n        })\n      }\n      // MergeTree allows dupes — delete the ids first (synchronously) so upsert replaces.\n      const idList = ids.map((id) => lit(id)).join(', ')\n      await client.command({\n        query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${idList})`,\n        clickhouse_settings: { mutations_sync: '2' },\n      })\n      await client.insert({\n        table: plan.collection,\n        values,\n        format: 'JSONEachRow',\n      })\n    } catch (err) {\n      if (\n        isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n        isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n      ) {\n        throw err\n      }\n      throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n    }\n  }\n\n  async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n    const metric = this.#opts.metric ?? 'cosine'\n    let queryVector: number[] | undefined\n    if (plan.near) {\n      if ('vector' in plan.near) {\n        queryVector = plan.near.vector\n      } else if ('serverText' in plan.near) {\n        const [v] = await this.encode([plan.near.serverText], 'query')\n        queryVector = v\n      } else if ('id' in plan.near) {\n        const rows = await this.#json(\n          `SELECT vec FROM ${ident(plan.collection)} WHERE id = ${lit(plan.near.id)} LIMIT 1`\n        )\n        if (rows.length === 0) {\n          throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n        }\n        queryVector = rows[0].vec as number[]\n      }\n    }\n\n    const offset = plan.offset ?? 0\n    try {\n      if (queryVector) {\n        const distExpr = distanceExpr(metric, vectorLiteral(queryVector))\n        const rows = await this.#json(\n          `SELECT id, vec, document, metadata, ${distExpr} AS __dist FROM ${ident(plan.collection)}`\n        )\n        const filtered = plan.filter\n          ? rows.filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n          : rows\n        filtered.sort((a, b) => Number(a.__dist) - Number(b.__dist))\n        return filtered\n          .slice(offset, offset + plan.topK)\n          .map((row) => this.#project(row, plan, metric, true))\n      } else {\n        const rows = await this.#json(\n          `SELECT id, vec, document, metadata FROM ${ident(plan.collection)}`\n        )\n        const filtered = plan.filter\n          ? rows.filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n          : rows\n        return filtered\n          .slice(offset, offset + plan.topK)\n          .map((row) => this.#project(row, plan, metric, false))\n      }\n    } catch (err) {\n      throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n    }\n  }\n\n  #parseMeta(val: unknown): VectorMetadata {\n    if (typeof val === 'string') {\n      try {\n        return JSON.parse(val) as VectorMetadata\n      } catch {\n        return {}\n      }\n    }\n    if (val && typeof val === 'object') return val as VectorMetadata\n    return {}\n  }\n\n  #project(row: any, plan: SearchPlan, metric: string, isKnn: boolean): VectorMatch {\n    const proj = plan.projection\n    const out: VectorMatch = {}\n    if (proj.id) out.id = row.id as string\n    if (proj.vector) out.vector = (row.vec as number[]).map((n) => Number(n))\n    if (proj.document) out.document = (row.document ?? undefined) as string | undefined\n    if (proj.metadata) out.metadata = this.#parseMeta(row.metadata)\n    if (isKnn && row.__dist !== undefined && row.__dist !== null) {\n      out.score = normalizeScore(Number(row.__dist), metric as DistanceMetric, 'distance')\n    }\n    return out\n  }\n\n  async executeDelete(plan: DeletePlan): Promise<void> {\n    const client = await this.#ensure()\n    const sync = { mutations_sync: '2' as const }\n    try {\n      if (plan.ids && plan.ids.length > 0) {\n        const list = plan.ids.map((id) => lit(id)).join(', ')\n        await client.command({\n          query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`,\n          clickhouse_settings: sync,\n        })\n      } else if (plan.filter) {\n        const rows = await this.#json(`SELECT id, metadata FROM ${ident(plan.collection)}`)\n        const targets = rows\n          .filter((row) => evaluateFilter(plan.filter!, this.#parseMeta(row.metadata)))\n          .map((row) => row.id as string)\n        if (targets.length > 0) {\n          const list = targets.map((id) => lit(id)).join(', ')\n          await client.command({\n            query: `DELETE FROM ${ident(plan.collection)} WHERE id IN (${list})`,\n            clickhouse_settings: sync,\n          })\n        }\n      } else {\n        await client.command({\n          query: `DELETE FROM ${ident(plan.collection)} WHERE 1 = 1`,\n          clickhouse_settings: sync,\n        })\n      }\n    } catch (err) {\n      throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n    }\n  }\n}\n"],"mappings":"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"}