跳到主要内容

foldWorkingTreeEntry()

function foldWorkingTreeEntry(existing, write): FoldOutcome;

Defined in: packages/rxdb-plugin-working-tree/src/working-tree/write-entry.ts:236

把一次捕获折进已有的工作树单元

Parameters​

ParameterTypeDescription
existing| WorkingTreeEntryRow | undefined该实体已有的未提交单元;没有则传 undefined
writeCapturedWrite这一次被捕获的写

Returns​

FoldOutcome

建行 / 改行 / 删行,以及 entryCount 该怎么动

Remarks​

纯函数:不改 existing、不改 write,同样输入折两次结果相同。调用方拿到 entry 直接落盘, 拿到 entryCountDelta 累加进 rxdb_working_tree_state.entryCount——必须在同一事务内, 否则崩溃后冗余列与行数就此分家。

四条规则:

  1. patch 取最新合成值,inversePatch 保持首次捕获值。
  2. INSERT 之后 DELETE(该行在 HEAD 不存在)→ 净无变化,删条目并递减计数,不留 delete 单元。 留下的话,commit 会带着一条「删除一个 HEAD 里根本不存在的行」的记录,重放时要么报错要么无声跳过。
  3. origin 取最新一次写入的来源;remote_sync 不被折叠豁免,照样建单元、照样计数。
  4. 不做值级归零:把 UPDATE 改回 HEAD 原值不会消解成无单元,patch 与 inversePatch 完全相等 时也不消解。删不删要由 HEAD 说了算,而这两份 patch 只是本地记录。这是已知取舍(见 fileoverview), 不是遗漏。

Example​

const outcome = foldWorkingTreeEntry(existingRow, capturedWrite);
if (outcome.kind === 'remove') await entries.delete(key);
else await entries.put(key, outcome.entry);
state.entryCount += outcome.entryCountDelta;