Skip to main content

Module computes

Module computes 

Source
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
ComputeEntry
fn / asyncFn 计算列的声明信息(fn_ref 绑定 Host 实现)
InjectInfo
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)