diff options
| author | tv <tv@krebsco.de> | 2026-11-02 11:13:24 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-11-02 11:13:24 +0100 |
| commit | d5e9416ff9ec06e22aba4f69b1a29c5a7b729a2c (patch) | |
| tree | 9b0607f8e6d3bc559a40b0c231732e3152130e50 /src/api | |
| parent | 8033c4dd17a637c21e1dd0c536edc04190851a21 (diff) | |
api: /admin/changes read ops, not diffs
The new store::changed_by reads each change's own operations instead of
diffing the document before and after it. Each object's path is found
once per change, as it was right after that change. So the cost now
grows with the size of the change, not the size of the map it touched.
- It names paths the same way the diff did: a map entry by its key, and
list and text edits by the list or text.
- It relies on import_obj, which Automerge marks as hidden from its
docs, to turn an operation's object ID back into an object.
Diffstat (limited to 'src/api')
| -rw-r--r-- | src/api/changes.rs | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/src/api/changes.rs b/src/api/changes.rs index 1dd1f91..ee6a74a 100644 --- a/src/api/changes.rs +++ b/src/api/changes.rs @@ -17,8 +17,8 @@ use crate::state::AppState; /// Changes listed at most. const MAX_LIMIT: usize = 1000; -/// Changes looked at at most, newest first, for those touching `path`: each costs a -/// diff, under the document's read lock. +/// Changes looked at at most, newest first, for those touching `path`: each costs +/// decoding it, under the document's read lock (`store::changed_by`). const MAX_SCANNED: usize = 10_000; #[derive(Debug, Deserialize)] @@ -107,14 +107,8 @@ fn changes( break; } scanned += 1; - // What this change did: its history without it, to its history with it. - let mut paths: Vec<Vec<String>> = - store::changed(doc, &meta.deps, &[meta.hash], InLists::Index) - .into_iter() - .map(|changed| changed.path) - .collect(); - paths.sort(); - paths.dedup(); + // What this change did, from its operations. + let paths = store::changed_by(doc, &meta.hash, InLists::Index).unwrap_or_default(); if let Some(path) = path && !paths .iter() |
