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                (
31                    true,
32                    true,
33                    "pgvector",
34                    &VECTOR_METRICS[..],
35                    PGVECTOR_INDEX_MAX_DIM,
36                )
37            } else {
38                (false, false, "pgvector", &[][..], 0)
39            }
40        }
41        "mongodb" => {
42            if env.atlas_index {
43                (
44                    true,
45                    true,
46                    "atlas",
47                    &VECTOR_METRICS[..],
48                    ATLAS_INDEX_MAX_DIM,
49                )
50            } else {
51                (
52                    true,
53                    false,
54                    "mongo",
55                    &VECTOR_METRICS[..],
56                    APPLICATION_MAX_DIM,
57                )
58            }
59        }
60        "mysql" => (
61            true,
62            false,
63            "mysql",
64            &VECTOR_METRICS[..],
65            APPLICATION_MAX_DIM,
66        ),
67        "sqlite" => (
68            true,
69            false,
70            "sqlite",
71            &VECTOR_METRICS[..],
72            APPLICATION_MAX_DIM,
73        ),
74        "local" => (
75            true,
76            false,
77            "local",
78            &VECTOR_METRICS[..],
79            APPLICATION_MAX_DIM,
80        ),
81        "memory" => (
82            true,
83            false,
84            "memory",
85            &VECTOR_METRICS[..],
86            APPLICATION_MAX_DIM,
87        ),
88        _ => (false, false, "unknown", &[][..], 0),
89    };
90    serde_json::json!({
91        "supported": supported,
92        "native": native,
93        "backend": backend,
94        "metrics": metrics,
95        "maxDim": max_dim,
96    })
97}