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