在某个修订之后是否可能发生变化

maybe_changed_after 操作用来计算某个查询的值在给定修订之后是否可能发生过变化。 换句话说,如果查询 Q 的值可能在 (R+1)..R_now 这些修订之间发生了变化, 那么 Q.maybe_change_since(R) 就会返回 true, 其中 R_now 是当前修订。 注意,对 maybe_changed_after(R_now) 提问本身是没有意义的。

输入查询

输入查询由用户显式设置, 因此 maybe_changed_after 只需要检查该值上一次被设置的时间并进行比较即可。

Interned 查询

派生查询

派生查询上的逻辑要复杂得多。 这里只总结高层思路; 如果你想继续深挖,流程图会很有帮助。 术语一节也可能派上用场; 在某些场合,我们会在某个术语第一次出现时直接链接过去。

  • 如果找到了现有的 memo, 那么先检查它是否已经在当前 revision 中被 verified。 如果是,就可以比较它的 changed at 修订,并据此返回 truefalse
  • 否则,我们就必须检查 dependencies 是否发生过变化:
    • R 为这个 memo 上一次被验证的修订; 我们想知道自修订 R 以来,它的依赖里是否有任何一个发生了变化。
    • 首先检查 durability。 对每个 memo,我们都会记录其依赖中的最小 durability。 如果某个 memo 的 durability 是 D, 并且自上次验证以来,没有任何 durability 为 D 的输入发生变化, 那么就无需再做额外工作,也可以把这个 memo 视为已验证。
    • 如果 durability 检查还不够, 那就必须逐个检查依赖。 做法是遍历每个依赖 D, 并调用 maybe changed after 来检查 D 自修订 R 之后是否发生了变化。
    • 如果没有任何依赖发生变化:
      • 那么我们就可以把 memo 标记为已验证, 并使用它的 changed at 修订来返回 truefalse
  • 如果依赖确实发生了变化:
    • 那么我们就执行用户的查询函数(与 fetch 操作中的逻辑相同), 这个过程可能会对最终结果进行 backdate
    • 然后比较新结果 memo 的 changed at 修订, 并据此返回 truefalse