Skip to main content

rust_store_core/
capability.rs

1//! 向量能力矩阵(纯函数,零 IO):宿主探测环境后喂入,判定唯一在本模块。
2
3pub const VECTOR_METRICS: [&str; 3] = ["cosine", "l2", "ip"];
4
5/// 应用层(JSON/TEXT 存储 + 精确打分)的统一维度上限。
6/// 数值源唯一:引用 01 在 `schema::definition` 定义的 `MAX_VECTOR_DIM`(16000,与 pgvector `vector` 类型上限同值)。
7/// 禁止在 core 内出现第二个 16000 字面量。
8pub const APPLICATION_MAX_DIM: u32 = crate::schema::MAX_VECTOR_DIM;
9/// pgvector 近似索引(HNSW / IVFFlat)的维度上限。
10/// 与 02 宿主侧 `ddl.js` / `ddl.py` 的 `PGVECTOR_INDEX_MAX_DIM` 同值(parity 断言两端相等)。
11/// 本文件只把它用作 `capabilities().vector.maxDim` 的输出值;DDL 期拦截由 02 的 `vectorIndexStmt` 负责。
12pub const PGVECTOR_INDEX_MAX_DIM: u32 = 2000;
13/// MongoDB Atlas `vectorSearch` 索引的维度上限(V-09 待外部环境复核)。
14pub const ATLAS_INDEX_MAX_DIM: u32 = 4096;
15
16/// 环境探测结果(宿主填写;core 不探测)
17pub struct VectorEnv<'a> {
18    pub backend: &'a str,
19    /// postgres: `pgvector` 扩展已安装;sqlite: `vec0` 已装载(本轮恒 false)
20    pub native_ready: bool,
21    /// mongodb: 该 source 下至少一个 schema 的索引项声明了 `options.indexName`
22    pub atlas_index: bool,
23}
24
25/// 返回 `{ supported, native, backend, metrics, maxDim }`(字段名固定,宿主原样透出)
26pub fn vector_capability(env: VectorEnv<'_>) -> serde_json::Value {
27    let (supported, native, backend, metrics, max_dim) = match env.backend {
28        "postgres" => {
29            if env.native_ready {
30                (true, true, "pgvector", &VECTOR_METRICS[..], PGVECTOR_INDEX_MAX_DIM)
31            } else {
32                (false, false, "pgvector", &[][..], 0)
33            }
34        }
35        "mongodb" => {
36            if env.atlas_index {
37                (true, true, "atlas", &VECTOR_METRICS[..], ATLAS_INDEX_MAX_DIM)
38            } else {
39                (true, false, "mongo", &VECTOR_METRICS[..], APPLICATION_MAX_DIM)
40            }
41        }
42        "mysql" => (true, false, "mysql", &VECTOR_METRICS[..], APPLICATION_MAX_DIM),
43        "sqlite" => (true, false, "sqlite", &VECTOR_METRICS[..], APPLICATION_MAX_DIM),
44        "local" => (true, false, "local", &VECTOR_METRICS[..], APPLICATION_MAX_DIM),
45        "memory" => (true, false, "memory", &VECTOR_METRICS[..], APPLICATION_MAX_DIM),
46        _ => (false, false, "unknown", &[][..], 0),
47    };
48    serde_json::json!({
49        "supported": supported,
50        "native": native,
51        "backend": backend,
52        "metrics": metrics,
53        "maxDim": max_dim,
54    })
55}