Skip to content

Commit 3bc6530

Browse files
committed
enhance: don't reset :block/refs when editing a block
Instead, compute the diff between the old and new refs, transacting the deltas.
1 parent fec4f51 commit 3bc6530

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

deps/outliner/src/logseq/outliner/pipeline.cljs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
(not (:logseq.property/created-from-property block))))
9393

9494
(defn db-rebuild-block-refs
95-
"Rebuild block refs for DB graphs"
95+
"Rebuild block refs for DB graphs, should returns ids"
9696
[db block & {:keys [page-or-object?-memoized]}]
9797
(let [block-db-id (:db/id block)
9898
;; explicit lookup in order to be nbb compatible
@@ -103,7 +103,9 @@
103103
(dissoc :block/parent :block/page :logseq.property/created-by-ref
104104
:logseq.property.history/block :logseq.property.history/property :logseq.property.history/ref-value))
105105
property-key-refs (->> (keys properties)
106-
(remove private-built-in-props))
106+
(remove private-built-in-props)
107+
(keep (fn [ident]
108+
(:db/id (d/entity db ident)))))
107109
page-or-object? (or page-or-object?-memoized page-or-object?-helper)
108110
property-value-refs (->> properties
109111
(mapcat (fn [[property v]]

src/main/frontend/worker/pipeline.cljs

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
(ns frontend.worker.pipeline
22
"Pipeline work after transaction"
3-
(:require [clojure.string :as string]
3+
(:require [clojure.set :as set]
4+
[clojure.string :as string]
45
[datascript.core :as d]
56
[frontend.worker-common.util :as worker-util]
67
[frontend.worker.commands :as commands]
@@ -35,19 +36,35 @@
3536
(:undo? tx-meta) (:redo? tx-meta)))))
3637

3738
(defn- rebuild-block-refs
38-
[repo {:keys [tx-meta db-after]} blocks]
39+
[repo {:keys [tx-meta db-after db-before]} blocks]
3940
(when (or (and (:outliner-op tx-meta) (refs-need-recalculated? tx-meta))
4041
(:rtc-tx? tx-meta))
41-
(mapcat (fn [block]
42-
(when (d/entity db-after (:db/id block))
43-
(let [date-formatter (worker-state/get-date-formatter repo)
44-
refs (outliner-core/rebuild-block-refs repo db-after date-formatter block)]
45-
;; Always retract because if refs is empty then a delete action has occurred
46-
(cond-> [[:db/retract (:db/id block) :block/refs]]
47-
(seq refs)
48-
(conj {:db/id (:db/id block)
49-
:block/refs refs})))))
50-
blocks)))
42+
(let [db-based? (entity-plus/db-based-graph? db-after)]
43+
(mapcat (fn [block]
44+
(when (d/entity db-after (:db/id block))
45+
(let [date-formatter (worker-state/get-date-formatter repo)
46+
refs (->> (outliner-core/rebuild-block-refs repo db-after date-formatter block) set)]
47+
(if db-based?
48+
(let [old-refs (->> (:block/refs (d/entity db-before (:db/id block)))
49+
(map :db/id)
50+
set)
51+
added-refs (when (and (seq refs) (not= refs old-refs))
52+
(set/difference refs old-refs))
53+
retracted-refs (when (and (seq old-refs) (not= refs old-refs))
54+
(set/difference old-refs refs))]
55+
(concat
56+
(map (fn [id]
57+
[:db/retract (:db/id block) :block/refs id])
58+
retracted-refs)
59+
(map (fn [id]
60+
[:db/add (:db/id block) :block/refs id])
61+
added-refs)))
62+
;; retract all refs for file graphs because we can't ensure `refs` are all db ids
63+
(cond-> [[:db/retract (:db/id block) :block/refs]]
64+
(seq refs)
65+
(conj {:db/id (:db/id block)
66+
:block/refs refs}))))))
67+
blocks))))
5168

5269
(defn- insert-tag-templates
5370
[repo tx-report]

0 commit comments

Comments
 (0)