Zongzi.Timeline.Query (zongzi v0.3.0)

Copy Markdown

纯读操作且无副作用的 Timeline 的查询原语。

下游模块(如 Strategy 和 Windowing)使用这些原语来判定锚存活、选宿主、切窗口。

不变量

格子状态 tombstonesseq_map 两个 O(1) 查找判定。

写操作保证:

  • insert 同时写 nodes 链表和 seq_map
  • gc 同时从 nodes 、 seq_map 和 tombstones 移除

因此不存在「链表里有但 tombstones 和 seq_map 都没有」的状态。

Summary

Types

格子状态。

Functions

是否为可承载锚点的活格子,仅在 :active 下返回真。

链表上两点格距(含墓碑格)。任一方不在链表中返回 error。

焦点邻域。count 是每侧收集的格子数(不是格距半径)。

有向扫描,返回候选 SeqID 列表(近→远)。

获取给定 SeqID 的格子状态。

Types

cell_status()

@type cell_status() :: Zongzi.Timeline.Neighborhood.status() | :missing

格子状态。

  • :active — 非墓碑且 seq_map 有条目
  • :merge_tombstone — 墓碑且 seq_map 仍有(merge 保留映射)
  • :delete_tombstone — 墓碑且 seq_map 已无
  • :missing — 两表均无(已 gc 或从未插入)

Functions

active?(timeline, seq_id)

是否为可承载锚点的活格子,仅在 :active 下返回真。

hops(timeline, a, b)

@spec hops(Zongzi.Timeline.t(), Zongzi.Timeline.SeqID.t(), Zongzi.Timeline.SeqID.t()) ::
  {:ok, non_neg_integer()} | {:error, :not_found}

链表上两点格距(含墓碑格)。任一方不在链表中返回 error。

neighborhood(timeline, seq_id, opts \\ [])

焦点邻域。count 是每侧收集的格子数(不是格距半径)。

选项

  • :count - 查找的数目,默认为 1
  • :active_only - 仅包括活跃的 SeqID ,默认为 false

scan(timeline, seq_id, direction, opts \\ [])

@spec scan(Zongzi.Timeline.t(), Zongzi.Timeline.SeqID.t(), :prev | :next, keyword()) ::
  [
    Zongzi.Timeline.SeqID.t()
  ]

有向扫描,返回候选 SeqID 列表(近→远)。

Options

  • :active_only — 跳过墓碑(默认 true
  • :include_self — 默认 false
  • :limit — 最多返回几个候选;nil 不限制
  • :max_hops — 最多跨几格(含墓碑格)

status(timeline, seq_id)

获取给定 SeqID 的格子状态。