fix: view blocks not deleted

This commit is contained in:
Tienson Qin
2026-01-16 11:46:52 +08:00
parent d409805e26
commit 63fb758e37
6 changed files with 49 additions and 23 deletions

View File

@@ -36,11 +36,12 @@
(fn [[op e a v]]
(if (= op :db.fn/retractEntity)
(let [entity (d/entity db-before e)]
(map
(keep
(fn [a]
(let [v (get entity a)
v' (if (de/entity? v) [:block/uuid (:block/uuid v)] v)]
[:db/retract [:block/uuid (:block/uuid entity)] a v']))
(when v'
[:db/retract [:block/uuid (:block/uuid entity)] a v'])))
compare-attrs))
(when (contains? compare-attrs a)
(let [e' (if (neg-int? e)

View File

@@ -118,8 +118,8 @@
(let [new-t (next-t! sql)
created-at (common/now-ms)
normalized-data (->> tx-data
db-normalize/replace-attr-retract-with-retract-entity
(db-normalize/normalize-tx-data db-after db-before))
_ (prn :debug :normalized-data normalized-data)
tx-str (common/write-transit normalized-data)]
(append-tx! sql new-t tx-str created-at)))

View File

@@ -331,8 +331,7 @@
conn (.-conn self)]
(when-not conn
(fail-fast :db-sync/missing-db {:op :apply-tx}))
(let [tx-data (->> (protocol/transit->tx txs)
db-normalize/replace-attr-retract-with-retract-entity-v2)]
(let [tx-data (protocol/transit->tx txs)]
(ldb/transact! conn tx-data {:op :apply-client-tx})
(prn :debug :finished-db-transact)
(let [new-t (storage/get-t sql)]

View File

@@ -2,19 +2,34 @@
"Normalize && denormalize eid for sync"
(:require [datascript.core :as d]))
(defn- remove-retract-entity-ref
[tx-data]
(let [retracted (-> (keep (fn [[op value]]
(when (= op :db.fn/retractEntity)
value)) tx-data)
set)]
(if (seq retracted)
(remove (fn [item]
(and (= :db/retract (first item))
(= 4 (count item))
(contains? retracted (last item)))) tx-data)
tx-data)))
(defn replace-attr-retract-with-retract-entity-v2
[normalized-tx-data]
(map (fn [[op eid a v]]
(cond
(and (= op :db/retract) (= a :block/uuid))
[:db.fn/retractEntity eid]
(and a (some? v))
[op eid a v]
:else
[op eid]))
normalized-tx-data))
(->
(map (fn [[op eid a v]]
(cond
(and (= op :db/retract) (= a :block/uuid))
[:db.fn/retractEntity eid]
(and a (some? v))
[op eid a v]
:else
[op eid]))
normalized-tx-data)
remove-retract-entity-ref))
(defn replace-attr-retract-with-retract-entity
(defn- replace-attr-retract-with-retract-entity
[tx-data]
(let [e-datoms (->> (group-by first tx-data)
(sort-by first))]
@@ -52,6 +67,7 @@
(defn normalize-tx-data
[db-after db-before tx-data]
(->> tx-data
replace-attr-retract-with-retract-entity
sort-datoms
(keep
(fn [d]
@@ -75,4 +91,6 @@
(if added
[:db/add e' a v']
[:db/retract e' a v'])))
d)))))
d)))
remove-retract-entity-ref
distinct))

View File

@@ -190,7 +190,6 @@
[db-after db-before tx-data]
(->> tx-data
remove-ignored-attrs
db-normalize/replace-attr-retract-with-retract-entity
(db-normalize/normalize-tx-data db-after db-before)))
(defn- reverse-tx-data
@@ -340,7 +339,7 @@
[db deleted-ids tx-data]
(let [tx-data (vec tx-data)
sanitized-tx-data (->> tx-data
db-normalize/replace-attr-retract-with-retract-entity-v2
;; db-normalize/replace-attr-retract-with-retract-entity-v2
(keep-last-update db)
(drop-invalid-refs deleted-ids))]
(when (not= tx-data sanitized-tx-data)
@@ -605,8 +604,7 @@
local-txs (pending-txs repo)
reversed-tx-data (->> local-txs
(mapcat :reversed-tx)
reverse
db-normalize/replace-attr-retract-with-retract-entity-v2)
reverse)
has-local-changes? (seq reversed-tx-data)
*rebased-tx-data (atom [])
*remote-tx-report (atom nil)
@@ -620,12 +618,15 @@
;; 1. reverse local pending txs
reversed-tx-report (when has-local-changes?
(ldb/transact! temp-conn reversed-tx-data tx-meta))
_ (prn :debug :tx-data (distinct tx-data))
;; 2. transact remote tx-data
remote-tx-report (ldb/transact! temp-conn tx-data tx-meta)
_ (reset! *remote-tx-report remote-tx-report)
remote-received-tx-data (sync-compare/filter-received-tx-data remote-tx-report tx-data)
remote-applied-tx-data (sync-compare/filter-applied-tx-data remote-tx-report)]
(when (not= remote-received-tx-data remote-applied-tx-data)
(prn :diff-tx-data-mismatch
(data/diff remote-received-tx-data remote-applied-tx-data))
(fail-fast :db-sync/compare-tx-data-mismatch
{:repo repo
:tx-data tx-data

View File

@@ -464,7 +464,8 @@
(defn transact-pipeline
"Compute extra tx-data and block/refs, should ensure it's a pure function and
doesn't call `d/transact!` or `ldb/transact!`."
[repo {:keys [db-after tx-meta] :as tx-report}]
[repo {:keys [db-before db-after tx-meta] :as tx-report}]
(prn :debug :pipeline)
(let [extra-tx-data (compute-extra-tx-data tx-report)
tx-report* (if (seq extra-tx-data)
(let [result (d/with db-after extra-tx-data)]
@@ -474,7 +475,12 @@
tx-report)
{:keys [pages blocks]} (ds-report/get-blocks-and-pages tx-report*)
deleted-blocks (outliner-pipeline/filter-deleted-blocks (:tx-data tx-report*))
deleted-block-ids (set (map :db/id deleted-blocks))
delete-views (mapcat
(fn [item]
(let [block (d/entity db-before (:db/id item))]
(:logseq.property/_view-for block)))
deleted-blocks)
deleted-block-ids (set (map :db/id (concat deleted-blocks delete-views)))
blocks' (remove (fn [b] (deleted-block-ids (:db/id b))) blocks)
block-refs (when (seq blocks')
(rebuild-block-refs repo tx-report* blocks'))
@@ -487,7 +493,8 @@
(when (:block/uuid (d/entity db-after db-id))
{:db/id db-id
:block/tx-id tx-id}))) updated-blocks))
block-refs-tx-id-data (concat block-refs tx-id-data)
delete-views-tx-data (map (fn [b] [:db/retractEntity (:db/id b)]) delete-views)
block-refs-tx-id-data (concat delete-views-tx-data block-refs tx-id-data)
replace-tx-report (when (seq block-refs-tx-id-data)
(d/with (:db-after tx-report*) block-refs-tx-id-data))
tx-report' (or replace-tx-report tx-report*)