{"version":3,"file":"oracle23ai.cjs","names":["#opts","#conn","#oracledb","#dims","#metrics","#table","#parseMeta","#project"],"sources":["../../../src/batteries/vector/oracle23ai/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/oracle23ai\n *\n * Oracle 23ai AI Vector Search adapter. Vectors live in a `VECTOR(dims, FLOAT32)` column\n * written with `DB_TYPE_VECTOR` (oracledb thin mode, default) and read back as Float32Array.\n * KNN search uses `VECTOR_DISTANCE(vec, :q, COSINE|EUCLIDEAN|DOT)` ordered ascending. Metadata\n * is a CLOB containing a JSON string, filtered with the neutral evaluator for exact cross-adapter\n * parity. Each collection maps to a table named `<tablePrefix><collection>` with double-quoted\n * identifiers for safety.\n *\n * The connecting user must default to a non-SYSTEM tablespace (e.g. USERS) and have CREATE TABLE.\n * Oracle 23ai provides strong consistency: commits are synchronous, so there is no settle-poll.\n *\n * Score contract: do NOT trust the raw VECTOR_DISTANCE as a [0,1] score. Instead, use SQL only to\n * order candidates, then recompute the [0,1] similarity locally using the stored `vec` and the\n * computeScore helper, ensuring the [0,1] contract regardless of metric semantics.\n *\n * Driver: `oracledb` (pure-JS thin mode, no Instant Client required).\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\nconst getOracle = async (): Promise<any> => {\n  try {\n    // oracledb ships no type declarations; import the specifier dynamically as untyped.\n    const mod = await import(/* @vite-ignore */ 'oracledb' as string)\n    return mod.default ?? mod\n  } catch {\n    throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['oracledb'])\n  }\n}\n\n// Build a double-quoted Oracle identifier, safely escaping embedded double quotes.\nconst ident = (name: string): string => '\"' + name.replace(/\"/g, '\"\"') + '\"'\n\nexport interface Oracle23aiVectorStoreOptions extends BaseVectorStoreOptions {\n  /** Connection and authentication parameters for the backend. */\n  connection: {\n    connectString: string // 'host:1521/FREEPDB1'\n    user: string\n    password: string\n    tablePrefix?: string // logical collection → `${tablePrefix}${collection}` table\n  }\n}\n\nexport class Oracle23aiVectorStore extends BaseVectorStore {\n  readonly capabilities: VectorStoreCapabilities = {\n    transactions: false,\n    namedVectors: false,\n    rename: false,\n    rawSql: false,\n    builtInEncoding: false,\n    consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n  }\n\n  #oracledb: any | null = null\n  #conn: any | null = null\n  #dims: Map<string, number> = new Map()\n  #metrics: Map<string, DistanceMetric> = new Map()\n\n  get #opts(): Oracle23aiVectorStoreOptions {\n    return this.options as Oracle23aiVectorStoreOptions\n  }\n\n  // Map a logical collection name to its physical table (with optional prefix).\n  #table(collection: string): string {\n    const prefix = this.#opts.connection.tablePrefix ?? ''\n    return prefix + collection\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\n  isAvailable(): boolean {\n    return typeof process !== 'undefined'\n  }\n\n  async connect(): Promise<void> {\n    if (this.#conn) return\n    this.#oracledb = await getOracle()\n    const c = this.#opts.connection\n    try {\n      this.#conn = await this.#oracledb.getConnection({\n        user: c.user,\n        password: c.password,\n        connectString: c.connectString,\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.#conn) {\n      await this.#conn.close()\n      this.#conn = null\n      this.#oracledb = null\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  async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n    const coll = spec.collection\n    const dims = spec.vector.dimensions\n    const metric = spec.vector.metric\n    this.#dims.set(coll, dims)\n    this.#metrics.set(coll, metric)\n\n    const T = ident(this.#table(coll))\n    const tableName = this.#table(coll)\n\n    try {\n      // Check if table exists\n      const checkRows = await this.#conn!.execute(\n        `SELECT 1 FROM user_tables WHERE table_name = :n`,\n        [tableName],\n        { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n      )\n      const exists = checkRows.rows.length > 0\n\n      if (exists) {\n        if (ifNotExists) {\n          // Clear existing table\n          await this.#conn!.execute(`DELETE FROM ${T}`)\n          await this.#conn!.commit()\n          return\n        }\n        // Drop and recreate\n        await this.#conn!.execute(`DROP TABLE ${T}`)\n      }\n\n      // Create table\n      const sql = `CREATE TABLE ${T} (\n        id VARCHAR2(512) PRIMARY KEY,\n        vec VECTOR(${dims}, FLOAT32),\n        document CLOB,\n        metadata CLOB\n      )`\n      await this.#conn!.execute(sql)\n      await this.#conn!.commit()\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 T = ident(this.#table(collection))\n    try {\n      await this.#conn!.execute(`DROP TABLE ${T}`)\n      this.#dims.delete(collection)\n      this.#metrics.delete(collection)\n    } catch (err: any) {\n      if (err?.message && err.message.includes('ORA-00942')) {\n        if (ifExists) return\n        throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', 'table does not exist'])\n      }\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n    }\n  }\n\n  async hasCollection(collection: string): Promise<boolean> {\n    const tableName = this.#table(collection)\n    const rows = await this.#conn!.execute(\n      `SELECT 1 FROM user_tables WHERE table_name = :n`,\n      [tableName],\n      { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n    )\n    return rows.rows.length > 0\n  }\n\n  async renameCollection(_from: string, _to: string): Promise<void> {\n    throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'oracle23ai'])\n  }\n\n  async executeUpsert(plan: UpsertPlan): Promise<void> {\n    if (plan.records.length === 0) return\n    validateRecords(plan.records)\n    const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n\n    const T = ident(this.#table(plan.collection))\n\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\n        const vecBind = {\n          type: this.#oracledb!.DB_TYPE_VECTOR,\n          val: Float32Array.from(vector),\n        }\n\n        const doc = r.document ?? ''\n        const meta = r.metadata ? JSON.stringify(r.metadata) : '{}'\n\n        // MERGE upsert\n        await this.#conn!.execute(\n          `MERGE INTO ${T} d\n           USING (SELECT :id AS id FROM dual) s\n           ON (d.id = s.id)\n           WHEN MATCHED THEN UPDATE SET vec = :vec, document = :doc, metadata = :meta\n           WHEN NOT MATCHED THEN INSERT (id, vec, document, metadata)\n             VALUES (:id, :vec, :doc, :meta)`,\n          {\n            id: r.id,\n            vec: vecBind,\n            doc,\n            meta,\n          },\n          { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n        )\n      }\n      await this.#conn!.commit()\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 coll = plan.collection\n    const metric: DistanceMetric = this.#metrics.get(coll) ?? this.#opts.metric ?? 'cosine'\n    const T = ident(this.#table(coll))\n\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.#conn!.execute(\n          `SELECT vec FROM ${T} WHERE id = :id`,\n          [plan.near.id],\n          {\n            outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n            fetchInfo: { VEC: { type: this.#oracledb!.DB_TYPE_VECTOR } },\n          }\n        )\n        if (rows.rows.length === 0) {\n          throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n        }\n        const arr = rows.rows[0].VEC as Float32Array\n        queryVector = Array.from(arr)\n      }\n    }\n\n    const offset = plan.offset ?? 0\n\n    try {\n      if (queryVector) {\n        const k = plan.filter ? 1000 : plan.topK + offset\n        const metricSql =\n          metric === 'cosine'\n            ? 'COSINE'\n            : metric === 'euclidean'\n              ? 'EUCLIDEAN'\n              : metric === 'dot'\n                ? 'DOT'\n                : 'COSINE'\n\n        const qBind = {\n          type: this.#oracledb!.DB_TYPE_VECTOR,\n          val: Float32Array.from(queryVector),\n        }\n\n        const rows = await this.#conn!.execute(\n          `SELECT id, vec, document, metadata, VECTOR_DISTANCE(vec, :q, ${metricSql}) AS dist\n           FROM ${T}\n           ORDER BY dist\n           FETCH APPROX FIRST :k ROWS ONLY`,\n          { q: qBind, k },\n          {\n            outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n            fetchInfo: {\n              DOCUMENT: { type: this.#oracledb!.STRING },\n              METADATA: { type: this.#oracledb!.STRING },\n            },\n          }\n        )\n\n        const result: VectorMatch[] = []\n        for (const row of rows.rows) {\n          const meta = this.#parseMeta(row.METADATA)\n          if (plan.filter && !evaluateFilter(plan.filter, meta)) {\n            continue\n          }\n          const storedVec = Array.from(row.VEC as Float32Array)\n          const score = computeScore(storedVec, queryVector!, metric)\n          result.push(this.#project(row, plan, score))\n        }\n\n        // Apply offset/slice after filtering\n        return result.slice(offset, offset + plan.topK)\n      } else {\n        // Filter-scan: no KNN, read all rows\n        const cap = 1000\n        const rows = await this.#conn!.execute(\n          `SELECT id, vec, document, metadata FROM ${T} FETCH FIRST :cap ROWS ONLY`,\n          [cap],\n          {\n            outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n            fetchInfo: {\n              DOCUMENT: { type: this.#oracledb!.STRING },\n              METADATA: { type: this.#oracledb!.STRING },\n            },\n          }\n        )\n\n        const result: VectorMatch[] = []\n        for (const row of rows.rows) {\n          const meta = this.#parseMeta(row.METADATA)\n          if (plan.filter && !evaluateFilter(plan.filter, meta)) {\n            continue\n          }\n          result.push(this.#project(row, plan, undefined))\n        }\n        return result.slice(offset, offset + plan.topK)\n      }\n    } catch (err: any) {\n      if (err?.message && err.message.includes('Referenced id not found')) {\n        throw err\n      }\n      throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n    }\n  }\n\n  #project(row: any, plan: SearchPlan, score?: number): 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 = (Array.from(row.VEC as Float32Array) as number[]).map(Number)\n    if (proj.document) out.document = (row.DOCUMENT ?? undefined) as string | undefined\n    if (proj.metadata) out.metadata = this.#parseMeta(row.METADATA)\n    if (score !== undefined) out.score = score\n    return out\n  }\n\n  async executeDelete(plan: DeletePlan): Promise<void> {\n    const T = ident(this.#table(plan.collection))\n    try {\n      if (plan.ids && plan.ids.length > 0) {\n        const ids = plan.ids\n        const bindObj: any = {}\n        ids.forEach((id, i) => {\n          bindObj['id' + i] = id\n        })\n        const sql = `DELETE FROM ${T} WHERE id IN (${ids.map((_id, i) => ':id' + i).join(', ')})`\n        await this.#conn!.execute(sql, bindObj)\n        await this.#conn!.commit()\n      } else if (plan.filter) {\n        const rows = await this.#conn!.execute(\n          `SELECT id, metadata FROM ${T}`,\n          {},\n          {\n            outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n            fetchInfo: {\n              METADATA: { type: this.#oracledb!.STRING },\n            },\n          }\n        )\n        const targets = rows.rows\n          .filter((r: any) => evaluateFilter(plan.filter!, this.#parseMeta(r.METADATA)))\n          .map((r: any) => r.ID as string)\n        if (targets.length > 0) {\n          const bindObj: any = {}\n          targets.forEach((id: string, i: number) => {\n            bindObj['id' + i] = id\n          })\n          const sql = `DELETE FROM ${T} WHERE id IN (${targets.map((_id: string, i: number) => ':id' + i).join(', ')})`\n          await this.#conn!.execute(sql, bindObj)\n          await this.#conn!.commit()\n        }\n      } else {\n        await this.#conn!.execute(`DELETE FROM ${T}`)\n        await this.#conn!.commit()\n      }\n    } catch (err) {\n      throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n    }\n  }\n}\n\n// Score recomputation helpers (copied from couchbase/index.ts verbatim)\n\nconst cosineSim = (a: number[], b: number[]): number => {\n  let dot = 0\n  let normA = 0\n  let normB = 0\n  for (const [i, av] of a.entries()) {\n    const bv = b[i]\n    dot += av * bv\n    normA += av * av\n    normB += bv * bv\n  }\n  const denom = Math.sqrt(normA) * Math.sqrt(normB)\n  return denom === 0 ? 0 : dot / denom\n}\n\nconst dotProd = (a: number[], b: number[]): number => {\n  let s = 0\n  for (const [i, element] of a.entries()) {\n    s += element * b[i]\n  }\n  return s\n}\n\nconst euclideanDist = (a: number[], b: number[]): number => {\n  let s = 0\n  for (const [i, element] of a.entries()) {\n    const d = element - b[i]\n    s += d * d\n  }\n  return Math.sqrt(s)\n}\n\nconst computeScore = (vec: number[], query: number[], metric: DistanceMetric): number => {\n  if (metric === 'cosine') {\n    const raw = cosineSim(vec, query)\n    return normalizeScore(raw, 'cosine', 'similarity')\n  } else if (metric === 'dot') {\n    const raw = dotProd(vec, query)\n    return normalizeScore(raw, 'dot', 'similarity')\n  } else if (metric === 'euclidean') {\n    const raw = euclideanDist(vec, query)\n    return normalizeScore(raw, 'euclidean', 'distance')\n  } else {\n    // Fallback\n    const raw = cosineSim(vec, query)\n    return normalizeScore(raw, 'cosine', 'similarity')\n  }\n}\n"],"mappings":"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"}