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}