foldWorkingTreeEntry()
function foldWorkingTreeEntry(existing, write): FoldOutcome;
Defined in: packages/rxdb-plugin-working-tree/src/working-tree/write-entry.ts:236
把一次捕获折进已有的工作树单元
Parameters
| Parameter | Type | Description |
|---|---|---|
existing | | WorkingTreeEntryRow | undefined | 该实体已有的未提交单元;没有则传 undefined |
write | CapturedWrite | 这一次被捕获的写 |
Returns
建行 / 改行 / 删行,以及 entryCount 该怎么动
Remarks
纯函数:不改 existing、不改 write,同样输入折两次结果相同。调用方拿到 entry 直接落盘,
拿到 entryCountDelta 累加进 rxdb_working_tree_state.entryCount——必须在同一事务内,
否则崩溃后冗余列与行数就此分家。
四条规则:
patch取最新合成值,inversePatch保持首次捕获值。INSERT之后DELETE(该行在 HEAD 不存在)→ 净无变化,删条目并递减计数,不留delete单元。 留下的话,commit 会带着一条「删除一个 HEAD 里根本不存在的行」的记录,重放时要么报错要么无声跳过。origin取最新一次写入的来源;remote_sync不被折叠豁免,照样建单元、照样计数。- 不做值级归零:把 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;