Expand description
计算列引擎(对应 JS src/computes.js)
与 JS 版的差异(fnRef 回调桥):
fn/asyncFn是宿主语言原生闭包,无法跨 FFI 传递。schema 里以"fn": true/"asyncFn": true声明(fnRef指定回调标识,缺省为 key 名), 执行体由 Host 实现FnRegistry后传入;core 保留声明信息与执行时机。- 模块级
_defaultsCache改为每次调用现算(无跨请求共享状态)。
子模块划分:
- [
registry]:fn / asyncFn 回调桥 - [
cache]:schema 维度缓存(默认值 / 计算列声明) - [
defaults]:字段默认值填充 + 同步计算列 - [
inject]:asyncFn depends 注入 / 剔除 - [
run]:processNode 主流程与 asyncFn 批量执行
Structs§
- Cache
- Compute
Entry - fn / asyncFn 计算列的声明信息(fn_ref 绑定 Host 实现)
- Inject
Info - RelDep
- 单个关系的依赖字段需求(保序)
Enums§
- Injected
- 注入信息:新增关系 →
All(整条返回且需整体剔除);已有关系补齐字段 →Fields
Traits§
- FnRegistry
- fn / asyncFn 执行体注册表(Host 侧实现;napi/PyO3 绑定桥接到原生闭包)
Functions§
- apply_
defaults_ and_ computes - 对单条记录应用字段默认值 + 同步 fn 计算列(对应 JS
applyDefaultsAndComputes,仅根文档,不递归) - collect_
field_ deps - R7:收集 asyncFn 计算列的普通字段依赖(非关系子字段、非关系名、非
_id), 并入根 AST 字段(供投影取数与process_node裁剪保留),返回被注入的字段列表。 - collect_
rel_ deps - 收集所有 asyncFn 计算列 depends 中的关系字段需求(对应 JS
_collectRelDeps) - ensure_
cache - 构建 schema 维度的默认值 / 计算列缓存(对应 JS
_ensureCache) - field_
default - 取规范化字段定义的默认值(无则 None),语义对齐 Python:null 视为未配置
- fill_
nested_ defaults - 递归填充嵌套 object 子字段默认值(对应 JS
_fillNestedDefaults) - inject_
into_ ast - 把关系字段需求合并注入到 AST(对应 JS
_injectIntoAst) - merge_
depends_ into_ ast - 收集 asyncFn depends 的 GQL 片段并合并注入到查询 AST(对应 JS
_mergeDependsIntoAst) - process_
node - 递归处理单条文档:补默认值 → 跑 fn 计算列 → 补计算列默认值 → 递归下钻 → 裁剪 → 权限裁剪
- run_
async_ fns - 执行 asyncFn 计算列(批量,带权限裁剪),对应 JS
_runAsyncFns - run_
computes - 跑 fn 计算列,再补计算列默认值(对应 JS
_runComputes) - select_
async_ fns - 计算需执行的 asyncFn 计算列(带权限裁剪),但不执行——供 Host 异步桥接自行调用
- strip_
dep_ injected - 从结果中裁剪依赖注入的字段(对应 JS
_stripDepInjected)