Skip to main content

rust_store_core/dialect/
translate.rs

1//! 翻译入口:Mongo 命令 → 各后端 SqlStmt 列表
2
3use serde_json::{json, Value};
4
5use crate::schema::Registry;
6
7use super::select::translate_select;
8use super::write::translate_write;
9use super::Backend;
10
11/// 翻译入口:把一条 Mongo 命令 JSON 译为指定后端的 SQL 语句序列。
12///
13/// 返回:
14/// ```json
15/// {
16///   "backend": "...",
17///   "stmts": [ SqlStmt.to_value() ],
18///   "warnings": [ ... ],
19///   "unsupported": [ { "code": "childLimit", "as": "...", "reason": "..." } ]
20/// }
21/// ```
22/// `unsupported` 非空表示存在无法安全下推的组合(如 `$lookup` 子 `$limit` 每父 top-N);
23/// 此时 `stmts` 不含该段,Host 必须兜底(拒绝或降级重查),**绝不返回错误结果**。
24pub fn translate(backend: Backend, cmd: &Value, registry: &Registry) -> Result<Value, String> {
25    let mut warnings: Vec<String> = Vec::new();
26    let mut unsupported: Vec<Value> = Vec::new();
27    let kind = cmd.get("kind").and_then(|v| v.as_str()).unwrap_or("");
28
29    let stmts = match kind {
30        "find" | "findOne" | "countDocuments" | "aggregate" => {
31            translate_select(backend, cmd, registry, &mut warnings, &mut unsupported)?
32        }
33        "insertOne" | "insertMany" | "deleteMany" | "updateMany" | "findOneAndUpdate"
34        | "claim" | "compareAndSet" => translate_write(backend, cmd, registry)?,
35        _ => return Err(format!("translate: 未支持的命令 kind = {}", kind)),
36    };
37
38    Ok(json!({
39        "backend": backend.as_str(),
40        "stmts": stmts.iter().map(|s| s.to_value()).collect::<Vec<_>>(),
41        "warnings": warnings,
42        "unsupported": unsupported,
43    }))
44}