{"version":3,"file":"solr.cjs","names":["#opts","#base","#core","#post","#get","#dims","#escape","#parseMeta","#project"],"sources":["../../../src/batteries/vector/solr/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/solr\n *\n * Apache Solr adapter (dense vector / kNN query parser, Solr 9+). A logical collection maps to a\n * Solr core; the adapter ensures a `DenseVectorField` (`vec`) plus `document`/`metadata` string\n * fields exist in the core schema, then uses the `{!knn f=vec topK=N}[...]` parser for search.\n * Score is Solr's cosine similarity ([0,1]). Metadata is a JSON string field filtered with the\n * neutral filter tree's JS reference evaluator for cross-adapter parity.\n *\n * No typed driver — Solr is plain HTTP/JSON, so this uses `fetch` (zero extra dependency). The\n * target core must already exist (e.g. `solr-precreate <core>` / the Core Admin API); the adapter\n * does not create cores at runtime, only their schema fields. `collection` is the core name.\n */\n\nimport { evaluateFilter } from '../filters'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\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 SolrVectorStoreOptions extends BaseVectorStoreOptions {\n  /** Connection and authentication parameters for the backend. */\n  connection: { url: string }\n}\n\nconst simFn = (metric: DistanceMetric): string =>\n  metric === 'euclidean' ? 'euclidean' : metric === 'dot' ? 'dot_product' : 'cosine'\n\nexport class SolrVectorStore extends BaseVectorStore {\n  readonly capabilities: VectorStoreCapabilities = {\n    transactions: false,\n    namedVectors: false,\n    rename: false,\n    rawSql: false,\n    builtInEncoding: false,\n    // Writes are committed (commit=true) before resolving, so they're visible to the next query.\n    consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n  }\n\n  #base: string | null = null\n  #dims: Map<string, number> = new Map()\n\n  get #opts(): SolrVectorStoreOptions {\n    return this.options as SolrVectorStoreOptions\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' && typeof fetch === 'function'\n  }\n  isAvailable(): boolean {\n    return typeof process !== 'undefined' && typeof fetch === 'function'\n  }\n\n  async connect(): Promise<void> {\n    if (this.#base) return\n    const url = this.#opts.connection?.url\n    if (!url) throw new E_VECTOR_STORE_CONNECTION_FAILED(['Solr requires connection.url'])\n    this.#base = url.replace(/\\/$/, '')\n  }\n\n  async close(): Promise<void> {\n    this.#base = null\n  }\n\n  async #core(collection: string): Promise<string> {\n    if (!this.#base) await this.connect()\n    return `${this.#base}/solr/${encodeURIComponent(collection)}`\n  }\n\n  async #post(coreUrl: string, path: string, body: unknown): Promise<any> {\n    const res = await fetch(coreUrl + path, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(body),\n    })\n    const json = await res.json().catch(() => ({}))\n    if (!res.ok || json.error) {\n      throw new Error(json.error?.msg ?? `HTTP ${res.status}`)\n    }\n    return json\n  }\n\n  async #get(coreUrl: string, path: string): Promise<any> {\n    const res = await fetch(coreUrl + path)\n    const json = await res.json().catch(() => ({}))\n    if (!res.ok || json.error) {\n      throw new Error(json.error?.msg ?? `HTTP ${res.status}`)\n    }\n    return json\n  }\n\n  async createCollection(spec: CollectionSpec, _ifNotExists: boolean): Promise<void> {\n    const core = await this.#core(spec.collection)\n    this.#dims.set(spec.collection, spec.vector.dimensions)\n    const ftName = `knn_${spec.vector.dimensions}_${simFn(spec.vector.metric)}`\n    try {\n      // Ensure the dense-vector field type (idempotent: ignore \"already exists\").\n      await this.#post(core, '/schema', {\n        'add-field-type': {\n          name: ftName,\n          class: 'solr.DenseVectorField',\n          vectorDimension: spec.vector.dimensions,\n          similarityFunction: simFn(spec.vector.metric),\n        },\n      }).catch((e: unknown) => {\n        if (!String(e).includes('already')) throw e\n      })\n      // Ensure the fields (idempotent per field).\n      for (const f of [\n        { name: 'vec', type: ftName, indexed: true, stored: true },\n        { name: 'document', type: 'string', stored: true },\n        { name: 'metadata', type: 'string', stored: true },\n      ]) {\n        await this.#post(core, '/schema', { 'add-field': f }).catch((e: unknown) => {\n          if (!String(e).includes('already')) throw e\n        })\n      }\n      // Start from an empty core for this logical collection.\n      await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\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    // Cores aren't created/destroyed at runtime here; \"drop\" clears the core's documents.\n    try {\n      const core = await this.#core(collection)\n      await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\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    try {\n      const core = await this.#core(collection)\n      await this.#get(core, '/admin/ping')\n      return true\n    } catch {\n      return false\n    }\n  }\n\n  async renameCollection(_from: string, _to: string): Promise<void> {\n    throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'solr'])\n  }\n\n  async executeUpsert(plan: UpsertPlan): Promise<void> {\n    if (plan.records.length === 0) return\n    validateRecords(plan.records)\n    const core = await this.#core(plan.collection)\n    const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n    try {\n      const docs: any[] = []\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        docs.push({\n          id: r.id,\n          vec: vector,\n          document: r.document ?? '',\n          metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n        })\n      }\n      // Solr upserts by id; commit so the write is visible to the next query.\n      await this.#post(core, '/update?commit=true', docs)\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 core = await this.#core(plan.collection)\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 r = await this.#get(\n          core,\n          `/select?q=${encodeURIComponent('id:' + this.#escape(plan.near.id))}&fl=vec&rows=1`\n        )\n        const doc = r.response?.docs?.[0]\n        if (!doc) {\n          throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n        }\n        queryVector = doc.vec as number[]\n      }\n    }\n\n    const offset = plan.offset ?? 0\n    const fl = 'id,vec,document,metadata,score'\n    try {\n      let docs: any[]\n      if (queryVector) {\n        const k = (plan.filter ? 1000 : plan.topK + offset) || 10\n        const q = `{!knn f=vec topK=${k}}[${queryVector.join(',')}]`\n        const r = await this.#get(core, `/select?q=${encodeURIComponent(q)}&fl=${fl}&rows=${k}`)\n        docs = r.response?.docs ?? []\n      } else {\n        const r = await this.#get(core, `/select?q=*:*&fl=${fl}&rows=100000`)\n        docs = r.response?.docs ?? []\n      }\n      const filtered = plan.filter\n        ? docs.filter((d) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n        : docs\n      return filtered\n        .slice(offset, offset + plan.topK)\n        .map((d) => this.#project(d, plan, !!queryVector))\n    } catch (err) {\n      throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n    }\n  }\n\n  #escape(value: string): string {\n    // Escape Solr query special chars for an id: term match.\n    return value.replace(/([+\\-!(){}[\\]^\"~*?:\\\\/ ])/g, '\\\\$1')\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(doc: any, plan: SearchPlan, isKnn: boolean): VectorMatch {\n    const proj = plan.projection\n    const out: VectorMatch = {}\n    if (proj.id) out.id = doc.id as string\n    if (proj.vector && Array.isArray(doc.vec)) out.vector = (doc.vec as number[]).map(Number)\n    if (proj.document) out.document = (doc.document ?? undefined) as string | undefined\n    if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata)\n    if (isKnn && typeof doc.score === 'number') {\n      // Solr's DenseVectorField cosine score is already in [0,1], higher = closer.\n      out.score = doc.score\n    }\n    return out\n  }\n\n  async executeDelete(plan: DeletePlan): Promise<void> {\n    const core = await this.#core(plan.collection)\n    try {\n      if (plan.ids && plan.ids.length > 0) {\n        await this.#post(core, '/update?commit=true', { delete: plan.ids })\n      } else if (plan.filter) {\n        const r = await this.#get(core, `/select?q=*:*&fl=id,metadata&rows=100000`)\n        const docs = r.response?.docs ?? []\n        const targets = docs\n          .filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n          .map((d: any) => d.id as string)\n        if (targets.length > 0) {\n          await this.#post(core, '/update?commit=true', { delete: targets })\n        }\n      } else {\n        await this.#post(core, '/update?commit=true', { delete: { query: '*:*' } })\n      }\n    } catch (err) {\n      throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n    }\n  }\n}\n"],"mappings":"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"}