Explorar el Código

fix: view blocks not deleted

Tienson Qin hace 4 días
padre
commit
63fb758e37

+ 3 - 2
deps/db-sync/src/logseq/db_sync/compare.cljs

@@ -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)

+ 1 - 1
deps/db-sync/src/logseq/db_sync/storage.cljs

@@ -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)))
 

+ 1 - 2
deps/db-sync/src/logseq/db_sync/worker.cljs

@@ -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)]

+ 29 - 11
deps/db/src/logseq/db/common/normalize.cljs

@@ -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))

+ 5 - 4
src/main/frontend/worker/db_sync.cljs

@@ -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

+ 10 - 3
src/main/frontend/worker/pipeline.cljs

@@ -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*)