Explorar o código

refactor: remove block/path-refs (#12081)

1. refactor: use :block/refs and has-ref rule instead of path-refs
2. remove block/path-refs
3. removes :block-parent rule since there's already :parent
4. enhance: skip pipeline calculation for rtc initial download tx
5. refactor(rtc): remove memoize

---------

Co-authored-by: rcmerci <[email protected]>
Tienson Qin hai 3 meses
pai
achega
248d8c33f2
Modificáronse 33 ficheiros con 221 adicións e 398 borrados
  1. 1 2
      deps/db/src/logseq/db/common/delete_blocks.cljs
  2. 1 1
      deps/db/src/logseq/db/common/entity_plus.cljc
  3. 1 2
      deps/db/src/logseq/db/common/initial_data.cljs
  4. 24 11
      deps/db/src/logseq/db/common/reference.cljs
  5. 3 9
      deps/db/src/logseq/db/file_based/rules.cljc
  6. 0 4
      deps/db/src/logseq/db/file_based/schema.cljs
  7. 2 5
      deps/db/src/logseq/db/frontend/malli_schema.cljs
  8. 1 7
      deps/db/src/logseq/db/frontend/property.cljs
  9. 11 2
      deps/db/src/logseq/db/frontend/rules.cljc
  10. 1 1
      deps/db/src/logseq/db/frontend/schema.cljs
  11. 3 6
      deps/graph-parser/src/logseq/graph_parser/whiteboard.cljs
  12. 4 15
      deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs
  13. 2 2
      deps/outliner/src/logseq/outliner/core.cljs
  14. 4 109
      deps/outliner/src/logseq/outliner/pipeline.cljs
  15. 1 57
      deps/outliner/test/logseq/outliner/pipeline_test.cljs
  16. 1 7
      docs/dev-practices.md
  17. 3 4
      src/main/frontend/db/debug.cljs
  18. 0 1
      src/main/frontend/db/file_based/model.cljs
  19. 3 2
      src/main/frontend/db/model.cljs
  20. 8 3
      src/main/frontend/db/query_dsl.cljs
  21. 1 2
      src/main/frontend/undo_redo.cljs
  22. 11 3
      src/main/frontend/worker/db/migrate.cljs
  23. 20 19
      src/main/frontend/worker/db_listener.cljs
  24. 1 1
      src/main/frontend/worker/handler/page/file_based/rename.cljs
  25. 6 32
      src/main/frontend/worker/pipeline.cljs
  26. 8 8
      src/main/frontend/worker/react.cljs
  27. 65 47
      src/main/frontend/worker/rtc/client.cljs
  28. 1 1
      src/main/frontend/worker/rtc/core.cljs
  29. 0 0
      src/rtc_e2e_test/example.cljs
  30. 7 5
      src/test/frontend/db/query_dsl_test.cljs
  31. 11 8
      src/test/frontend/db/reference_test.cljs
  32. 13 19
      src/test/frontend/handler/editor_test.cljs
  33. 3 3
      src/test/frontend/handler/repo_test.cljs

+ 1 - 2
deps/db/src/logseq/db/common/delete_blocks.cljs

@@ -39,8 +39,7 @@
              tx (cond->
              tx (cond->
                  (mapcat
                  (mapcat
                   (fn [block]
                   (fn [block]
-                    [[:db/retract (:db/id ref) :block/refs (:db/id block)]
-                     [:db/retract (:db/id ref) :block/path-refs (:db/id block)]]) retracted-blocks)
+                    [[:db/retract (:db/id ref) :block/refs (:db/id block)]]) retracted-blocks)
                   replaced-title
                   replaced-title
                   (conj [:db/add id :block/title replaced-title]))]
                   (conj [:db/add id :block/title replaced-title]))]
          tx))
          tx))

+ 1 - 1
deps/db/src/logseq/db/common/entity_plus.cljc

@@ -33,7 +33,7 @@
   it means `(db/entity :block/title)` always return same result"
   it means `(db/entity :block/title)` always return same result"
   #{:block/link :block/updated-at :block/refs :block/closed-value-property
   #{:block/link :block/updated-at :block/refs :block/closed-value-property
     :block/created-at :block/collapsed? :block/tags :block/title
     :block/created-at :block/collapsed? :block/tags :block/title
-    :block/path-refs :block/parent :block/order :block/page
+    :block/parent :block/order :block/page
 
 
     :logseq.property/created-from-property
     :logseq.property/created-from-property
     :logseq.property/icon
     :logseq.property/icon

+ 1 - 2
deps/db/src/logseq/db/common/initial_data.cljs

@@ -141,8 +141,7 @@
             identity
             identity
             (fn [e]
             (fn [e]
               (keep (fn [[k v]]
               (keep (fn [[k v]]
-                      (when (and (not (contains? #{:block/path-refs} k))
-                                 (or (empty? properties) (properties k)))
+                      (when (or (empty? properties) (properties k))
                         (let [v' (cond
                         (let [v' (cond
                                    (= k :block/parent)
                                    (= k :block/parent)
                                    (:db/id v)
                                    (:db/id v)

+ 24 - 11
deps/db/src/logseq/db/common/reference.cljs

@@ -8,7 +8,8 @@
             [logseq.db :as ldb]
             [logseq.db :as ldb]
             [logseq.db.common.entity-plus :as entity-plus]
             [logseq.db.common.entity-plus :as entity-plus]
             [logseq.db.common.initial-data :as common-initial-data]
             [logseq.db.common.initial-data :as common-initial-data]
-            [logseq.db.frontend.class :as db-class]))
+            [logseq.db.frontend.class :as db-class]
+            [logseq.db.frontend.rules :as rules]))
 
 
 (defn get-filters
 (defn get-filters
   [db page]
   [db page]
@@ -36,32 +37,39 @@
                (log/error :syntax/filters e)))))))
                (log/error :syntax/filters e)))))))
 
 
 (defn- build-include-exclude-query
 (defn- build-include-exclude-query
-  [variable includes excludes]
+  [includes excludes]
   (concat
   (concat
    (for [include includes]
    (for [include includes]
-     [variable :block/path-refs include])
+     (list 'has-ref '?b include))
    (for [exclude excludes]
    (for [exclude excludes]
-     (list 'not [variable :block/path-refs exclude]))))
+     (list 'not (list 'has-ref '?b exclude)))))
 
 
 (defn- filter-refs-query
 (defn- filter-refs-query
-  [attribute includes excludes class-ids]
+  [includes excludes class-ids]
   (let [clauses (concat
   (let [clauses (concat
-                 (build-include-exclude-query '?b includes excludes)
+                 (build-include-exclude-query includes excludes)
                  (for [class-id class-ids]
                  (for [class-id class-ids]
                    (list 'not ['?b :block/tags class-id])))]
                    (list 'not ['?b :block/tags class-id])))]
     (into [:find '[?b ...]
     (into [:find '[?b ...]
-           :in '$ '[?id ...]
+           :in '$ '% '[?id ...]
            :where
            :where
-           ['?b attribute '?id]]
+           (list 'has-ref '?b '?id)]
           clauses)))
           clauses)))
 
 
+(defn- get-path-refs
+  [db entity]
+  (let [refs (mapcat :block/refs (ldb/get-block-parents db (:block/uuid entity)))
+        block-page (:block/page entity)]
+    (->> (cond->> refs (some? block-page) (cons block-page))
+         distinct)))
+
 (defn- get-ref-pages-count
 (defn- get-ref-pages-count
   [db id ref-blocks children-ids]
   [db id ref-blocks children-ids]
   (when (seq ref-blocks)
   (when (seq ref-blocks)
     (let [children (->> children-ids
     (let [children (->> children-ids
                         (map (fn [id] (d/entity db id))))]
                         (map (fn [id] (d/entity db id))))]
-      (->> (concat (mapcat :block/path-refs ref-blocks)
-                   (mapcat :block/refs children))
+      (->> (concat (mapcat #(get-path-refs db %) ref-blocks)
+                   (mapcat :block/refs (concat ref-blocks children)))
            frequencies
            frequencies
            (keep (fn [[ref size]]
            (keep (fn [[ref size]]
                    (when (and (ldb/page? ref)
                    (when (and (ldb/page? ref)
@@ -99,7 +107,12 @@
                       (set (conj class-children id))))
                       (set (conj class-children id))))
         full-ref-block-ids (->> (mapcat (fn [id] (map :db/id (:block/_refs (d/entity db id)))) ids)
         full-ref-block-ids (->> (mapcat (fn [id] (map :db/id (:block/_refs (d/entity db id)))) ids)
                                 set)
                                 set)
-        matched-ref-block-ids (set (d/q (filter-refs-query :block/path-refs includes excludes class-ids) db ids))
+        matched-ref-block-ids (set (d/q (filter-refs-query includes excludes class-ids)
+                                        db
+                                        (rules/extract-rules rules/db-query-dsl-rules
+                                                             [:has-ref]
+                                                             {:deps rules/rules-dependencies})
+                                        ids))
         matched-refs-with-children-ids (let [*result (atom #{})]
         matched-refs-with-children-ids (let [*result (atom #{})]
                                          (doseq [ref-id matched-ref-block-ids]
                                          (doseq [ref-id matched-ref-block-ids]
                                            (get-block-parents-until-top-ref db id ref-id full-ref-block-ids *result))
                                            (get-block-parents-until-top-ref db id ref-id full-ref-block-ids *result))

+ 3 - 9
deps/db/src/logseq/db/file_based/rules.cljc

@@ -14,13 +14,7 @@
   "Rules used by frontend.db.query-dsl for file graphs. The symbols ?b and ?p
   "Rules used by frontend.db.query-dsl for file graphs. The symbols ?b and ?p
   respectively refer to block and page. Do not alter them as they are
   respectively refer to block and page. Do not alter them as they are
   programmatically built by the query-dsl ns"
   programmatically built by the query-dsl ns"
-  {:block-parent
-   '[[(block-parent ?p ?c)
-      [?c :block/parent ?p]]
-     [(block-parent ?p ?c)
-      [?t :block/parent ?p]
-      (block-parent ?t ?c)]]
-   :page-property
+  {:page-property
    '[(page-property ?p ?key ?val)
    '[(page-property ?p ?key ?val)
      [?p :block/name]
      [?p :block/name]
      [?p :block/properties ?prop]
      [?p :block/properties ?prop]
@@ -95,5 +89,5 @@
 
 
    :page-ref
    :page-ref
    '[(page-ref ?b ?page-name)
    '[(page-ref ?b ?page-name)
-     [?b :block/path-refs ?br]
-     [?br :block/name ?page-name]]})
+     [?br :block/name ?page-name]
+     (has-ref ?b ?br)]})

+ 0 - 4
deps/db/src/logseq/db/file_based/schema.cljs

@@ -28,10 +28,6 @@
    ;; reference blocks
    ;; reference blocks
    :block/refs {:db/valueType :db.type/ref
    :block/refs {:db/valueType :db.type/ref
                 :db/cardinality :db.cardinality/many}
                 :db/cardinality :db.cardinality/many}
-   ;; referenced pages inherited from the parents
-   :block/path-refs {:db/valueType   :db.type/ref
-                     :db/cardinality :db.cardinality/many}
-
    :block/tags {:db/valueType :db.type/ref
    :block/tags {:db/valueType :db.type/ref
                 :db/cardinality :db.cardinality/many}
                 :db/cardinality :db.cardinality/many}
 
 

+ 2 - 5
deps/db/src/logseq/db/frontend/malli_schema.cljs

@@ -273,8 +273,7 @@
 (def page-attrs
 (def page-attrs
   "Common attributes for pages"
   "Common attributes for pages"
   [[:block/name :string]
   [[:block/name :string]
-   [:block/title :string]
-   [:block/path-refs {:optional true} [:set :int]]])
+   [:block/title :string]])
 
 
 (def property-attrs
 (def property-attrs
   "Common attributes for properties"
   "Common attributes for properties"
@@ -387,7 +386,6 @@
    [:block/order block-order]
    [:block/order block-order]
    ;; refs
    ;; refs
    [:block/page :int]
    [:block/page :int]
-   [:block/path-refs {:optional true} [:set :int]]
    [:block/link {:optional true} :int]
    [:block/link {:optional true} :int]
    [:logseq.property/created-from-property {:optional true} :int]])
    [:logseq.property/created-from-property {:optional true} :int]])
 
 
@@ -399,8 +397,7 @@
     [[:block/title :string]
     [[:block/title :string]
      [:block/parent :int]
      [:block/parent :int]
      ;; These blocks only associate with pages of type "whiteboard"
      ;; These blocks only associate with pages of type "whiteboard"
-     [:block/page :int]
-     [:block/path-refs {:optional true} [:set :int]]]
+     [:block/page :int]]
     page-or-block-attrs)))
     page-or-block-attrs)))
 
 
 (def property-value-block
 (def property-value-block

+ 1 - 7
deps/db/src/logseq/db/frontend/property.cljs

@@ -106,12 +106,6 @@
                                      :cardinality :many
                                      :cardinality :many
                                      :public? false
                                      :public? false
                                      :hide? true}}
                                      :hide? true}}
-     :block/path-refs      {:title "Node path references"
-                            :attribute :block/path-refs
-                            :schema {:type :entity
-                                     :cardinality :many
-                                     :public? false
-                                     :hide? true}}
      :block/link           {:title "Node links to"
      :block/link           {:title "Node links to"
                             :attribute :block/link
                             :attribute :block/link
                             :schema {:type :entity
                             :schema {:type :entity
@@ -584,7 +578,7 @@
   "Internal properties that are also db schema attributes"
   "Internal properties that are also db schema attributes"
   #{:block/alias :block/tags :block/parent
   #{:block/alias :block/tags :block/parent
     :block/order :block/collapsed? :block/page
     :block/order :block/collapsed? :block/page
-    :block/refs :block/path-refs :block/link
+    :block/refs :block/link
     :block/title :block/closed-value-property :block/journal-day
     :block/title :block/closed-value-property :block/journal-day
     :block/created-at :block/updated-at})
     :block/created-at :block/updated-at})
 
 

+ 11 - 2
deps/db/src/logseq/db/frontend/rules.cljc

@@ -30,7 +30,14 @@
       [?e2 :block/alias ?e3]]
       [?e2 :block/alias ?e3]]
      [(alias ?e3 ?e1)
      [(alias ?e3 ?e1)
       [?e1 :block/alias ?e2]
       [?e1 :block/alias ?e2]
-      [?e2 :block/alias ?e3]]]})
+      [?e2 :block/alias ?e3]]]
+
+   :has-ref
+   '[[(has-ref ?b ?r)
+      [?b :block/refs ?r]]
+     [(has-ref ?b ?r)
+      (parent ?p ?b)
+      [?p :block/refs ?r]]]})
 
 
 ;; Rules writing advice
 ;; Rules writing advice
 ;; ====================
 ;; ====================
@@ -239,7 +246,9 @@
   "For db graphs, a map of rule names and the rules they depend on. If this map
   "For db graphs, a map of rule names and the rules they depend on. If this map
   becomes long or brittle, we could do scan rules for their deps with something
   becomes long or brittle, we could do scan rules for their deps with something
   like find-rules-in-where"
   like find-rules-in-where"
-  {:task #{:simple-query-property}
+  {:has-ref #{:parent}
+   :page-ref #{:has-ref}
+   :task #{:simple-query-property}
    :priority #{:simple-query-property}
    :priority #{:simple-query-property}
    :property-missing-value #{:object-has-class-property}
    :property-missing-value #{:object-has-class-property}
    :has-property-or-object-property #{:object-has-class-property}
    :has-property-or-object-property #{:object-has-class-property}

+ 1 - 1
deps/db/src/logseq/db/frontend/schema.cljs

@@ -37,7 +37,7 @@
          (map (juxt :major :minor)
          (map (juxt :major :minor)
               [(parse-schema-version x) (parse-schema-version y)])))
               [(parse-schema-version x) (parse-schema-version y)])))
 
 
-(def version (parse-schema-version "65.10"))
+(def version (parse-schema-version "65.11"))
 
 
 (defn major-version
 (defn major-version
   "Return a number.
   "Return a number.

+ 3 - 6
deps/graph-parser/src/logseq/graph_parser/whiteboard.cljs

@@ -47,12 +47,9 @@
     (concat portal-refs shape-link-refs)))
     (concat portal-refs shape-link-refs)))
 
 
 (defn- with-whiteboard-block-refs
 (defn- with-whiteboard-block-refs
-  [shape page-id]
+  [shape]
   (let [refs (or (get-shape-refs shape) [])]
   (let [refs (or (get-shape-refs shape) [])]
-    (merge {:block/refs (if (seq refs) refs [])
-            :block/path-refs (if (seq refs)
-                               (conj refs page-id)
-                               [])})))
+    {:block/refs (if (seq refs) refs [])}))
 
 
 (defn- with-whiteboard-content
 (defn- with-whiteboard-content
   "Main purpose of this function is to populate contents when shapes are used as references in outliner."
   "Main purpose of this function is to populate contents when shapes are used as references in outliner."
@@ -72,7 +69,7 @@
     (merge (when shape?
     (merge (when shape?
              (merge
              (merge
               {:block/uuid (uuid (:id shape))}
               {:block/uuid (uuid (:id shape))}
-              (with-whiteboard-block-refs shape page-id)
+              (with-whiteboard-block-refs shape)
               (with-whiteboard-content shape)))
               (with-whiteboard-content shape)))
            (when (nil? (:block/parent block)) {:block/parent page-id})
            (when (nil? (:block/parent block)) {:block/parent page-id})
            (when (nil? (:block/format block)) {:block/format :markdown}) ;; TODO: read from config
            (when (nil? (:block/format block)) {:block/format :markdown}) ;; TODO: read from config

+ 4 - 15
deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs

@@ -196,7 +196,7 @@
   ;; This graph will contain basic examples of different features to import
   ;; This graph will contain basic examples of different features to import
   (p/let [file-graph-dir "test/resources/exporter-test-graph"
   (p/let [file-graph-dir "test/resources/exporter-test-graph"
           conn (db-test/create-conn)
           conn (db-test/create-conn)
-          ;; Calculate refs and path-refs like frontend
+          ;; Calculate refs like frontend
           _ (db-pipeline/add-listener conn)
           _ (db-pipeline/add-listener conn)
           assets (atom [])
           assets (atom [])
           {:keys [import-state]} (import-file-graph-to-db file-graph-dir conn {:assets assets :convert-all-tags? true})]
           {:keys [import-state]} (import-file-graph-to-db file-graph-dir conn {:assets assets :convert-all-tags? true})]
@@ -587,16 +587,12 @@
       (is (= "multiline block\na 2nd\nand a 3rd" (:block/title (db-test/find-block-by-content @conn #"multiline block"))))
       (is (= "multiline block\na 2nd\nand a 3rd" (:block/title (db-test/find-block-by-content @conn #"multiline block"))))
       (is (= "logbook block" (:block/title (db-test/find-block-by-content @conn #"logbook block")))))
       (is (= "logbook block" (:block/title (db-test/find-block-by-content @conn #"logbook block")))))
 
 
-    (testing ":block/refs and :block/path-refs"
+    (testing ":block/refs"
       (let [page (db-test/find-page-by-title @conn "chat-gpt")]
       (let [page (db-test/find-page-by-title @conn "chat-gpt")]
         (is (set/subset?
         (is (set/subset?
              #{"type" "LargeLanguageModel"}
              #{"type" "LargeLanguageModel"}
              (->> page :block/refs (map #(:block/title (d/entity @conn (:db/id %)))) set))
              (->> page :block/refs (map #(:block/title (d/entity @conn (:db/id %)))) set))
-            "Page has correct property and property value :block/refs")
-        (is (set/subset?
-             #{"type" "LargeLanguageModel"}
-             (->> page :block/path-refs (map #(:block/title (d/entity @conn (:db/id %)))) set))
-            "Page has correct property and property value :block/path-refs"))
+            "Page has correct property and property value :block/refs"))
 
 
       (let [block (db-test/find-block-by-content @conn "old todo block")]
       (let [block (db-test/find-block-by-content @conn "old todo block")]
         (is (set/subset?
         (is (set/subset?
@@ -605,14 +601,7 @@
                   :block/refs
                   :block/refs
                   (map #(:db/ident (d/entity @conn (:db/id %))))
                   (map #(:db/ident (d/entity @conn (:db/id %))))
                   set))
                   set))
-            "Block has correct task tag and property :block/refs")
-        (is (set/subset?
-             #{:logseq.property/status :logseq.class/Task}
-             (->> block
-                  :block/path-refs
-                  (map #(:db/ident (d/entity @conn (:db/id %))))
-                  set))
-            "Block has correct task tag and property :block/path-refs")))
+            "Block has correct task tag and property :block/refs")))
 
 
     (testing "whiteboards"
     (testing "whiteboards"
       (let [block-with-props (db-test/find-block-by-content @conn #"block with props")]
       (let [block-with-props (db-test/find-block-by-content @conn #"block with props")]

+ 2 - 2
deps/outliner/src/logseq/outliner/core.cljs

@@ -285,7 +285,7 @@
           collapse-or-expand? (= outliner-op :collapse-expand-blocks)
           collapse-or-expand? (= outliner-op :collapse-expand-blocks)
           m* (cond->
           m* (cond->
               (-> data'
               (-> data'
-                  (dissoc :block/children :block/meta :block/unordered :block/path-refs
+                  (dissoc :block/children :block/meta :block/unordered
                           :block.temp/ast-title :block.temp/ast-body :block/level :block.temp/load-status
                           :block.temp/ast-title :block.temp/ast-body :block/level :block.temp/load-status
                           :block.temp/has-children?)
                           :block.temp/has-children?)
                   common-util/remove-nils
                   common-util/remove-nils
@@ -761,7 +761,7 @@
                                      :block/title (or (:block/raw-title e) (:block/title e))}
                                      :block/title (or (:block/raw-title e) (:block/title e))}
                                     b)
                                     b)
                                    b)
                                    b)
-                               dissoc-keys (concat [:block/tx-id :block/path-refs]
+                               dissoc-keys (concat [:block/tx-id]
                                                    (when (contains? #{:insert-template-blocks :paste} outliner-op)
                                                    (when (contains? #{:insert-template-blocks :paste} outliner-op)
                                                      [:block/refs]))]
                                                      [:block/refs]))]
                            (apply dissoc b dissoc-keys))
                            (apply dissoc b dissoc-keys))

+ 4 - 109
deps/outliner/src/logseq/outliner/pipeline.cljs

@@ -1,7 +1,6 @@
 (ns logseq.outliner.pipeline
 (ns logseq.outliner.pipeline
   "Core fns for use with frontend worker and node"
   "Core fns for use with frontend worker and node"
-  (:require [clojure.set :as set]
-            [datascript.core :as d]
+  (:require [datascript.core :as d]
             [datascript.impl.entity :as de]
             [datascript.impl.entity :as de]
             [logseq.common.util.date-time :as date-time-util]
             [logseq.common.util.date-time :as date-time-util]
             [logseq.db :as ldb]
             [logseq.db :as ldb]
@@ -19,103 +18,6 @@
         :block/uuid (:v d)}))
         :block/uuid (:v d)}))
    datoms))
    datoms))
 
 
-(defn- calculate-children-refs
-  [db-after children new-refs]
-  (let [;; Builds map of children ids to their parent id and :block/refs ids
-        children-maps (into {}
-                            (keep (fn [id]
-                                    (when-let [entity (d/entity db-after [:block/uuid id])]
-                                      (let [from-property (:logseq.property/created-from-property entity)
-                                            default? (= :default (:logseq.property/type from-property))
-                                            page? (ldb/page? entity)]
-                                        (when-not (or page? (and from-property (not default?)))
-                                          [(:db/id entity)
-                                           {:parent-id (get-in entity [:block/parent :db/id])
-                                            :block-ref-ids (map :db/id (:block/refs entity))}]))))
-                                  children))
-        children-refs (map (fn [[id {:keys [block-ref-ids] :as child-map}]]
-                             {:db/id id
-                              ;; Recalculate :block/path-refs as db contains stale data for this attribute
-                              :block/path-refs
-                              (set/union
-                               ;; Refs from top-level parent
-                               new-refs
-                               ;; Refs from current block
-                               block-ref-ids
-                               ;; Refs from parents in between top-level
-                               ;; parent and current block
-                               (loop [parent-refs #{}
-                                      parent-id (:parent-id child-map)]
-                                 (if-let [parent (children-maps parent-id)]
-                                   (recur (into parent-refs (:block-ref-ids parent))
-                                          (:parent-id parent))
-                                   ;; exits when top-level parent is reached
-                                   (remove nil? parent-refs))))})
-                           children-maps)]
-    children-refs))
-
-;; TODO: it'll be great if we can calculate the :block/path-refs before any
-;; outliner transaction, this way we can group together the real outliner tx
-;; and the new path-refs changes, which makes both undo/redo and
-;; react-query/refresh! easier.
-
-;; TODO: also need to consider whiteboard transactions
-
-;; Steps:
-;; 1. For each changed block, new-refs = its page + :block/refs + parents :block/refs
-;; 2. Its children' block/path-refs might need to be updated too.
-(defn- compute-block-path-refs
-  [{:keys [db-before db-after]} blocks*]
-  (let [*computed-ids (atom #{})
-        blocks (remove (fn [block]
-                         (let [from-property (:logseq.property/created-from-property block)
-                               default? (= :default (:logseq.property/type from-property))]
-                           (and from-property (not default?))))
-                       blocks*)]
-    (->>
-     (mapcat (fn [block]
-               (when-not (@*computed-ids (:block/uuid block))
-                 (let [page? (ldb/page? block)
-                       from-property (:logseq.property/created-from-property block)
-                       parents' (when-not page?
-                                  (ldb/get-block-parents db-after (:block/uuid block) {}))
-                       parents-refs (->> (cond->>
-                                          (mapcat :block/path-refs parents')
-                                           from-property
-                                           (remove (fn [parent] (and (ldb/property? parent) (not= (:db/id parent) (:db/id from-property))))))
-                                         (map :db/id))
-                       old-refs (if db-before
-                                  (set (map :db/id (:block/path-refs (d/entity db-before (:db/id block)))))
-                                  #{})
-                       new-refs (->>
-                                 (concat
-                                  (some-> (:db/id (:block/page block)) vector)
-                                  (map :db/id (:block/refs block))
-                                  parents-refs)
-                                 (remove nil?)
-                                 set)
-                       refs-changed? (not= old-refs new-refs)
-                       children (when refs-changed?
-                                  (when-not page?
-                                    (ldb/get-block-children-ids db-after (:block/uuid block))))
-                       children-refs (when children
-                                       (calculate-children-refs db-after children new-refs))]
-                   (swap! *computed-ids set/union (set (cons (:block/uuid block) children)))
-                   (concat
-                    (when (and (seq new-refs) refs-changed? (d/entity db-after (:db/id block)))
-                      [{:db/id (:db/id block)
-                        :block/path-refs new-refs}])
-                    children-refs))))
-             blocks)
-     distinct)))
-
-(defn ^:api compute-block-path-refs-tx
-  "Main fn for computing path-refs"
-  [tx-report blocks]
-  (let [refs-tx (compute-block-path-refs tx-report blocks)
-        truncate-refs-tx (map (fn [m] [:db/retract (:db/id m) :block/path-refs]) refs-tx)]
-    (concat truncate-refs-tx refs-tx)))
-
 (defn- ref->eid
 (defn- ref->eid
   "ref: entity, map, int, eid"
   "ref: entity, map, int, eid"
   [ref]
   [ref]
@@ -234,17 +136,10 @@
           blocks))
           blocks))
 
 
 (defn transact-new-db-graph-refs
 (defn transact-new-db-graph-refs
-  "Transacts :block/refs and :block/path-refs for a new or imported DB graph"
+  "Transacts :block/refs for a new or imported DB graph"
   [conn tx-report]
   [conn tx-report]
   (let [{:keys [blocks]} (ds-report/get-blocks-and-pages tx-report)
   (let [{:keys [blocks]} (ds-report/get-blocks-and-pages tx-report)
         refs-tx-report (when-let [refs-tx (and (seq blocks) (rebuild-block-refs-tx tx-report blocks))]
         refs-tx-report (when-let [refs-tx (and (seq blocks) (rebuild-block-refs-tx tx-report blocks))]
                          (ldb/transact! conn refs-tx {:pipeline-replace? true
                          (ldb/transact! conn refs-tx {:pipeline-replace? true
-                                                      ::original-tx-meta (:tx-meta tx-report)}))
-        blocks' (if refs-tx-report
-                  (keep (fn [b] (d/entity (:db-after refs-tx-report) (:db/id b))) blocks)
-                  blocks)
-        block-path-refs-tx (distinct (compute-block-path-refs-tx tx-report blocks'))
-        path-refs-tx-report (when (seq block-path-refs-tx)
-                              (ldb/transact! conn block-path-refs-tx {:pipeline-replace? true}))]
-    {:refs-tx-report refs-tx-report
-     :path-refs-tx-export path-refs-tx-report}))
+                                                      ::original-tx-meta (:tx-meta tx-report)}))]
+    refs-tx-report))

+ 1 - 57
deps/outliner/test/logseq/outliner/pipeline_test.cljs

@@ -1,65 +1,9 @@
 (ns logseq.outliner.pipeline-test
 (ns logseq.outliner.pipeline-test
-  (:require [cljs.test :refer [deftest is testing]]
-            [clojure.set :as set]
-            [clojure.string :as string]
-            [datascript.core :as d]
+  (:require [cljs.test :refer [deftest is]]
             [logseq.common.util.page-ref :as page-ref]
             [logseq.common.util.page-ref :as page-ref]
-            [logseq.db.frontend.schema :as db-schema]
-            [logseq.db.sqlite.build :as sqlite-build]
-            [logseq.db.sqlite.create-graph :as sqlite-create-graph]
             [logseq.db.test.helper :as db-test]
             [logseq.db.test.helper :as db-test]
-            [logseq.outliner.db-pipeline :as db-pipeline]
             [logseq.outliner.pipeline :as outliner-pipeline]))
             [logseq.outliner.pipeline :as outliner-pipeline]))
 
 
-(defn- get-blocks [db]
-  (->> (d/q '[:find (pull ?b [* {:block/path-refs [:block/name :db/id]}])
-              :in $
-              :where
-              [?b :block/page]
-              [?b :block/title]
-              [(missing? $ ?b :logseq.property/built-in?)]]
-            db)
-       (map first)))
-
-(deftest compute-block-path-refs-tx
-  (testing "when a block's :refs change, descendants of block have correct :block/path-refs"
-    (let [conn (d/create-conn db-schema/schema)
-          ;; needed in order for path-refs to be setup correctly with init data
-          _ (db-pipeline/add-listener conn)
-          _ (d/transact! conn (sqlite-create-graph/build-db-initial-data "{}"))
-          _ (sqlite-build/create-blocks
-             conn
-             [{:page {:block/title "bar"}}
-              {:page {:block/title "page1"}
-               :blocks [{:block/title "parent [[foo]]"
-                         :build/children
-                         [{:block/title "child [[baz]]"
-                           :build/children
-                           [{:block/title "grandchild [[bing]]"}]}]}]}])
-          blocks (get-blocks @conn)
-          ;; Update parent block to replace 'foo' with 'bar' ref
-          new-tag-id (ffirst (d/q '[:find ?b :where [?b :block/title "bar"]] @conn))
-          modified-blocks (map #(if (string/starts-with? (:block/title %) "parent")
-                                  (assoc %
-                                         :block/refs [{:db/id new-tag-id}]
-                                         :block/path-refs [{:db/id new-tag-id}])
-                                  %)
-                               blocks)
-          refs-tx (outliner-pipeline/compute-block-path-refs-tx {:db-after @conn} modified-blocks)
-          _ (d/transact! conn refs-tx {:pipeline-replace? true})
-          updated-blocks (->> (get-blocks @conn)
-                              ;; Only keep enough of content to uniquely identify block
-                              (map #(hash-map :block/title (re-find #"\w+" (:block/title %))
-                                              :path-ref-names (set (map :block/name (:block/path-refs %))))))
-          page-tag-refs #{"page" "tags"}]
-      (is (= [{:block/title "parent"
-               :path-ref-names (set/union page-tag-refs #{"page1" "bar"})}
-              {:block/title "child"
-               :path-ref-names (set/union page-tag-refs #{"page1" "bar" "baz"})}
-              {:block/title "grandchild"
-               :path-ref-names (set/union page-tag-refs #{"page1" "bar" "baz" "bing"})}]
-             updated-blocks)))))
-
 (deftest block-content-refs
 (deftest block-content-refs
   (let [conn (db-test/create-conn-with-blocks
   (let [conn (db-test/create-conn-with-blocks
               [{:page {:block/title "page1"} :blocks [{:block/title "b1"}]}])
               [{:page {:block/title "page1"} :blocks [{:block/title "b1"}]}])

+ 1 - 7
docs/dev-practices.md

@@ -353,7 +353,7 @@ These tasks are specific to database graphs. For these tasks there is a one time
   ```sh
   ```sh
   $ bb dev:db-query woot '[:find (pull ?b [*]) :where (block-content ?b "Dogma")]'
   $ bb dev:db-query woot '[:find (pull ?b [*]) :where (block-content ?b "Dogma")]'
   DB contains 833 datoms
   DB contains 833 datoms
-  [{:block/tx-id 536870923, :block/link #:db{:id 100065}, :block/uuid #uuid "65565c26-f972-4400-bce4-a15df488784d", :block/updated-at 1700158508564, :block/order "a0", :block/refs [#:db{:id 100064}], :block/created-at 1700158502056, :block/format :markdown, :block/tags [#:db{:id 100064}], :block/title "Dogma #[[65565c2a-b1c5-4dc8-a0f0-81b786bc5c6d]]", :db/id 100090, :block/path-refs [#:db{:id 100051} #:db{:id 100064}], :block/parent #:db{:id 100051}, :block/page #:db{:id 100051}}]
+  [{:block/tx-id 536870923, :block/link #:db{:id 100065}, :block/uuid #uuid "65565c26-f972-4400-bce4-a15df488784d", :block/updated-at 1700158508564, :block/order "a0", :block/refs [#:db{:id 100064}], :block/created-at 1700158502056, :block/format :markdown, :block/tags [#:db{:id 100064}], :block/title "Dogma #[[65565c2a-b1c5-4dc8-a0f0-81b786bc5c6d]]", :db/id 100090, :block/parent #:db{:id 100051}, :block/page #:db{:id 100051}}]
   ```
   ```
 
 
 * `dev:db-transact` - Run a `d/transact!` against the queried results of a DB graph
 * `dev:db-transact` - Run a `d/transact!` against the queried results of a DB graph
@@ -424,9 +424,6 @@ These tasks are specific to database graphs. For these tasks there is a one time
     [162 :block/format :markdown 536871037 true]
     [162 :block/format :markdown 536871037 true]
     [162 :block/page 149 536871037 true]
     [162 :block/page 149 536871037 true]
     [162 :block/parent 149 536871037 true]
     [162 :block/parent 149 536871037 true]
-    [162 :block/path-refs 108 536871044 true]
-    [162 :block/path-refs 149 536871044 true]
-    [162 :block/path-refs 160 536871044 true]
     [162
     [162
     :block/properties
     :block/properties
     {#uuid "21be4275-bba9-48b8-9351-c9ca27883159"
     {#uuid "21be4275-bba9-48b8-9351-c9ca27883159"
@@ -462,9 +459,6 @@ These tasks are specific to database graphs. For these tasks there is a one time
     [162 :block/order "a0" 536871037 true]
     [162 :block/order "a0" 536871037 true]
     [162 :block/page 149 536871037 true]
     [162 :block/page 149 536871037 true]
     [162 :block/parent 149 536871037 true]
     [162 :block/parent 149 536871037 true]
-    [162 :block/path-refs 108 536871044 true]
-    [162 :block/path-refs 149 536871044 true]
-    [162 :block/path-refs 160 536871044 true]
     [162
     [162
     :block/properties
     :block/properties
     {#uuid "21be4275-bba9-48b8-9351-c9ca27883159"
     {#uuid "21be4275-bba9-48b8-9351-c9ca27883159"

+ 3 - 4
src/main/frontend/db/debug.cljs

@@ -1,7 +1,7 @@
 (ns ^:no-doc frontend.db.debug
 (ns ^:no-doc frontend.db.debug
-  (:require [frontend.db.utils :as db-utils]
+  (:require [datascript.core :as d]
             [frontend.db :as db]
             [frontend.db :as db]
-            [datascript.core :as d]))
+            [frontend.db.utils :as db-utils]))
 
 
 ;; shortcut for query a block with string ref
 ;; shortcut for query a block with string ref
 (defn qb
 (defn qb
@@ -16,8 +16,7 @@
      (:block/page block)]
      (:block/page block)]
     (:block/tags block)
     (:block/tags block)
     (:block/alias block)
     (:block/alias block)
-    (:block/refs block)
-    (:block/path-refs block))
+    (:block/refs block))
    (remove nil?)
    (remove nil?)
    (some (fn [x]
    (some (fn [x]
            (and
            (and

+ 0 - 1
src/main/frontend/db/file_based/model.cljs

@@ -20,7 +20,6 @@
     :block/format
     :block/format
     :block/refs
     :block/refs
     :block/_refs
     :block/_refs
-    :block/path-refs
     :block/tags
     :block/tags
     :block/link
     :block/link
     :block/title
     :block/title

+ 3 - 2
src/main/frontend/db/model.cljs

@@ -381,10 +381,11 @@ independent of format as format specific heading characters are stripped"
          (->>
          (->>
           (d/q
           (d/q
            '[:find [(pull ?block ?block-attrs) ...]
            '[:find [(pull ?block ?block-attrs) ...]
-             :in $ [?ref-page ...] ?block-attrs
+             :in $ % [?ref-page ...] ?block-attrs
              :where
              :where
-             [?block :block/path-refs ?ref-page]]
+             (has-ref ?block ?ref-page)]
            db
            db
+           (rules/extract-rules rules/db-query-dsl-rules [:parent :has-ref])
            pages
            pages
            (butlast file-model/file-graph-block-attrs))
            (butlast file-model/file-graph-block-attrs))
           (remove (fn [block] (= page-id (:db/id (:block/page block)))))
           (remove (fn [block] (= page-id (:db/id (:block/page block)))))

+ 8 - 3
src/main/frontend/db/query_dsl.cljs

@@ -699,11 +699,16 @@ Some bindings in this fn:
                                 ;; [(not (page-ref ?b "page 2"))]
                                 ;; [(not (page-ref ?b "page 2"))]
                                 (keyword (ffirst result))
                                 (keyword (ffirst result))
                                 (keyword (first result)))]
                                 (keyword (first result)))]
-                      (add-bindings! (if (= key :and) (rest result) result) opts)))]
+                      (add-bindings! (if (= key :and) (rest result) result) opts)))
+          extract-rules (fn [rules]
+                          (rules/extract-rules rules/db-query-dsl-rules rules {:deps rules/rules-dependencies}))]
       {:query result'
       {:query result'
        :rules (if db-graph?
        :rules (if db-graph?
-                (rules/extract-rules rules/db-query-dsl-rules rules {:deps rules/rules-dependencies})
-                (mapv file-rules/query-dsl-rules rules))
+                (extract-rules rules)
+                (->> (concat (map file-rules/query-dsl-rules (remove #{:page-ref} rules))
+                             (when (some #{:page-ref} rules)
+                               (extract-rules [:page-ref])))
+                     vec))
        :sort-by @sort-by
        :sort-by @sort-by
        :blocks? (boolean @blocks?)
        :blocks? (boolean @blocks?)
        :sample sample})))
        :sample sample})))

+ 1 - 2
src/main/frontend/undo_redo.cljs

@@ -340,8 +340,7 @@
                        (filter
                        (filter
                         (fn [id] (and (nil? (d/entity db-before id)) (d/entity db-after id)))
                         (fn [id] (and (nil? (d/entity db-before id)) (d/entity db-after id)))
                         all-ids))
                         all-ids))
-            tx-data' (->> (remove (fn [d] (contains? #{:block/path-refs} (:a d))) tx-data)
-                          vec)
+            tx-data' (vec tx-data)
             editor-info @state/*editor-info
             editor-info @state/*editor-info
             _ (reset! state/*editor-info nil)
             _ (reset! state/*editor-info nil)
             op (->> [(when editor-info [::record-editor-info editor-info])
             op (->> [(when editor-info [::record-editor-info editor-info])

+ 11 - 3
src/main/frontend/worker/db/migrate.cljs

@@ -293,8 +293,7 @@
          [[:db/add id :db/ident (db-class/create-user-class-ident-from-name db title)]
          [[:db/add id :db/ident (db-class/create-user-class-ident-from-name db title)]
           [:db/add id :logseq.property.class/extends :logseq.class/Root]
           [:db/add id :logseq.property.class/extends :logseq.class/Root]
           [:db/retract id :block/tags :logseq.class/Page]
           [:db/retract id :block/tags :logseq.class/Page]
-          [:db/retract id :block/refs :logseq.class/Page]
-          [:db/retract id :block/path-refs :logseq.class/Page]]))
+          [:db/retract id :block/refs :logseq.class/Page]]))
      class-ids)))
      class-ids)))
 
 
 (defn fix-using-properties-as-tags
 (defn fix-using-properties-as-tags
@@ -354,6 +353,14 @@
             :block/name (common-util/page-name-sanity-lc (:block/title page))})))
             :block/name (common-util/page-name-sanity-lc (:block/title page))})))
      pages)))
      pages)))
 
 
+(defn- remove-block-path-refs-datoms
+  [db]
+  (->> (d/datoms db :avet :block/path-refs)
+       (map :e)
+       (distinct)
+       (map (fn [id]
+              [:db/retract id :block/path-refs]))))
+
 (def schema-version->updates
 (def schema-version->updates
   "A vec of tuples defining datascript migrations. Each tuple consists of the
   "A vec of tuples defining datascript migrations. Each tuple consists of the
    schema version integer and a migration map. A migration map can have keys of :properties, :classes
    schema version integer and a migration map. A migration map can have keys of :properties, :classes
@@ -368,7 +375,8 @@
    ["65.7" {:fix add-quick-add-page}]
    ["65.7" {:fix add-quick-add-page}]
    ["65.8" {:fix add-missing-page-name}]
    ["65.8" {:fix add-missing-page-name}]
    ["65.9" {:properties [:logseq.property.embedding/hnsw-label-updated-at]}]
    ["65.9" {:properties [:logseq.property.embedding/hnsw-label-updated-at]}]
-   ["65.10" {:properties [:block/journal-day :logseq.property.view/sort-groups-by-property :logseq.property.view/sort-groups-desc?]}]])
+   ["65.10" {:properties [:block/journal-day :logseq.property.view/sort-groups-by-property :logseq.property.view/sort-groups-desc?]}]
+   ["65.11" {:fix remove-block-path-refs-datoms}]])
 
 
 (let [[major minor] (last (sort (map (comp (juxt :major :minor) db-schema/parse-schema-version first)
 (let [[major minor] (last (sort (map (comp (juxt :major :minor) db-schema/parse-schema-version first)
                                      schema-version->updates)))]
                                      schema-version->updates)))]

+ 20 - 19
src/main/frontend/worker/db_listener.cljs

@@ -19,27 +19,28 @@
   "Return tx-report"
   "Return tx-report"
   [repo conn {:keys [tx-meta] :as tx-report}]
   [repo conn {:keys [tx-meta] :as tx-report}]
   (when repo (worker-state/set-db-latest-tx-time! repo))
   (when repo (worker-state/set-db-latest-tx-time! repo))
-  (let [{:keys [from-disk?]} tx-meta
-        result (worker-pipeline/invoke-hooks repo conn tx-report (worker-state/get-context))
-        tx-report' (:tx-report result)]
-    (when (and result (not (:rtc-download-graph? tx-meta)))
-      (let [data (merge
-                  {:request-id (:request-id tx-meta)
-                   :repo repo
-                   :tx-data (:tx-data tx-report')
-                   :tx-meta tx-meta}
-                  (dissoc result :tx-report))]
-        (shared-service/broadcast-to-clients! :sync-db-changes data))
+  (when-not (:rtc-download-graph? tx-meta)
+    (let [{:keys [from-disk?]} tx-meta
+          result (worker-pipeline/invoke-hooks repo conn tx-report (worker-state/get-context))
+          tx-report' (:tx-report result)]
+      (when result
+        (let [data (merge
+                    {:request-id (:request-id tx-meta)
+                     :repo repo
+                     :tx-data (:tx-data tx-report')
+                     :tx-meta tx-meta}
+                    (dissoc result :tx-report))]
+          (shared-service/broadcast-to-clients! :sync-db-changes data))
 
 
-      (when-not from-disk?
-        (p/do!
+        (when-not from-disk?
+          (p/do!
          ;; Sync SQLite search
          ;; Sync SQLite search
-         (let [{:keys [blocks-to-remove-set blocks-to-add]} (search/sync-search-indice repo tx-report')]
-           (when (seq blocks-to-remove-set)
-             ((@thread-api/*thread-apis :thread-api/search-delete-blocks) repo blocks-to-remove-set))
-           (when (seq blocks-to-add)
-             ((@thread-api/*thread-apis :thread-api/search-upsert-blocks) repo blocks-to-add))))))
-    tx-report'))
+           (let [{:keys [blocks-to-remove-set blocks-to-add]} (search/sync-search-indice repo tx-report')]
+             (when (seq blocks-to-remove-set)
+               ((@thread-api/*thread-apis :thread-api/search-delete-blocks) repo blocks-to-remove-set))
+             (when (seq blocks-to-add)
+               ((@thread-api/*thread-apis :thread-api/search-upsert-blocks) repo blocks-to-add))))))
+      tx-report')))
 
 
 (comment
 (comment
   (defmethod listen-db-changes :debug-listen-db-changes
   (defmethod listen-db-changes :debug-listen-db-changes

+ 1 - 1
src/main/frontend/worker/handler/page/file_based/rename.cljs

@@ -172,7 +172,7 @@
     (when (and from-page to-page (not= from-page-name to-page-name))
     (when (and from-page to-page (not= from-page-name to-page-name))
       (let [datoms (d/datoms @conn :avet :block/page from-id)
       (let [datoms (d/datoms @conn :avet :block/page from-id)
             block-eids (mapv :e datoms)
             block-eids (mapv :e datoms)
-            blocks (d/pull-many db '[:db/id :block/page :block/refs :block/path-refs :block/order :block/parent] block-eids)
+            blocks (d/pull-many db '[:db/id :block/page :block/refs :block/order :block/parent] block-eids)
             blocks-tx-data (map (fn [block]
             blocks-tx-data (map (fn [block]
                                   (let [id (:db/id block)]
                                   (let [id (:db/id block)]
                                     (cond->
                                     (cond->

+ 6 - 32
src/main/frontend/worker/pipeline.cljs

@@ -36,14 +36,6 @@
           (contains? #{:collapse-expand-blocks :delete-blocks} outliner-op)
           (contains? #{:collapse-expand-blocks :delete-blocks} outliner-op)
           (:undo? tx-meta) (:redo? tx-meta)))))
           (:undo? tx-meta) (:redo? tx-meta)))))
 
 
-(defn- compute-block-path-refs-tx
-  [{:keys [tx-meta] :as tx-report} blocks]
-  (when (or (:rtc-tx? tx-meta)
-            (and (:outliner-op tx-meta) (refs-need-recalculated? tx-meta))
-            (:from-disk? tx-meta)
-            (:new-graph? tx-meta))
-    (outliner-pipeline/compute-block-path-refs-tx tx-report blocks)))
-
 (defn- rebuild-block-refs
 (defn- rebuild-block-refs
   [repo {:keys [tx-meta db-after]} blocks]
   [repo {:keys [tx-meta db-after]} blocks]
   (when (or (and (:outliner-op tx-meta) (refs-need-recalculated? tx-meta))
   (when (or (and (:outliner-op tx-meta) (refs-need-recalculated? tx-meta))
@@ -302,19 +294,16 @@
               (:added d))
               (:added d))
          (when-let [display-type (ldb/get-display-type-by-class-ident (:db/ident (d/entity db (:v d))))]
          (when-let [display-type (ldb/get-display-type-by-class-ident (:db/ident (d/entity db (:v d))))]
            [(cond->
            [(cond->
-                {:db/id (:e d)
-                 :logseq.property.node/display-type display-type}
+             {:db/id (:e d)
+              :logseq.property.node/display-type display-type}
               (and (= display-type :code) (d/entity db :logseq.kv/latest-code-lang))
               (and (= display-type :code) (d/entity db :logseq.kv/latest-code-lang))
               (assoc :logseq.property.code/lang (:kv/value (d/entity db :logseq.kv/latest-code-lang))))])))
               (assoc :logseq.property.code/lang (:kv/value (d/entity db :logseq.kv/latest-code-lang))))])))
      datoms)))
      datoms)))
 
 
 (defn- invoke-hooks-for-imported-graph [conn {:keys [tx-meta] :as tx-report}]
 (defn- invoke-hooks-for-imported-graph [conn {:keys [tx-meta] :as tx-report}]
-  (let [{:keys [refs-tx-report path-refs-tx-report]}
-        (outliner-pipeline/transact-new-db-graph-refs conn tx-report)
-        full-tx-data (concat (:tx-data tx-report)
-                             (:tx-data refs-tx-report)
-                             (:tx-data path-refs-tx-report))
-        final-tx-report (-> (or path-refs-tx-report refs-tx-report tx-report)
+  (let [refs-tx-report (outliner-pipeline/transact-new-db-graph-refs conn tx-report)
+        full-tx-data (concat (:tx-data tx-report) (:tx-data refs-tx-report))
+        final-tx-report (-> (or refs-tx-report tx-report)
                             (assoc :tx-data full-tx-data
                             (assoc :tx-data full-tx-data
                                    :tx-meta tx-meta
                                    :tx-meta tx-meta
                                    :db-before (:db-before tx-report)))]
                                    :db-before (:db-before tx-report)))]
@@ -447,11 +436,6 @@
                                                            :skip-store? true}))
                                                            :skip-store? true}))
           replace-tx (let [db-after (or (:db-after refs-tx-report) (:db-after tx-report*))]
           replace-tx (let [db-after (or (:db-after refs-tx-report) (:db-after tx-report*))]
                        (concat
                        (concat
-                        ;; block path refs
-                        (when (seq blocks')
-                          (let [blocks' (keep (fn [b] (d/entity db-after (:db/id b))) blocks')]
-                            (compute-block-path-refs-tx tx-report* blocks')))
-
                         ;; update block/tx-id
                         ;; update block/tx-id
                         (let [updated-blocks (remove (fn [b] (contains? deleted-block-ids (:db/id b)))
                         (let [updated-blocks (remove (fn [b] (contains? deleted-block-ids (:db/id b)))
                                                      (concat pages blocks))
                                                      (concat pages blocks))
@@ -492,17 +476,7 @@
     (let [{:keys [from-disk? new-graph?]} tx-meta]
     (let [{:keys [from-disk? new-graph?]} tx-meta]
       (cond
       (cond
         (or from-disk? new-graph?)
         (or from-disk? new-graph?)
-        (let [{:keys [blocks]} (ds-report/get-blocks-and-pages tx-report)
-              path-refs (distinct (compute-block-path-refs-tx tx-report blocks))
-              tx-report' (if (seq path-refs)
-                           (ldb/transact! conn path-refs {:pipeline-replace? true})
-                           tx-report)
-              full-tx-data (concat (:tx-data tx-report) (:tx-data tx-report'))
-              final-tx-report (assoc tx-report'
-                                     :tx-meta (:tx-meta tx-report)
-                                     :tx-data full-tx-data
-                                     :db-before (:db-before tx-report))]
-          {:tx-report final-tx-report})
+        {:tx-report tx-report}
 
 
         (or (::gp-exporter/new-graph? tx-meta) (::sqlite-export/imported-data? tx-meta))
         (or (::gp-exporter/new-graph? tx-meta) (::sqlite-export/imported-data? tx-meta))
         (invoke-hooks-for-imported-graph conn tx-report)
         (invoke-hooks-for-imported-graph conn tx-report)

+ 8 - 8
src/main/frontend/worker/react.cljs

@@ -36,7 +36,7 @@
                     (map :v)
                     (map :v)
                     (distinct))
                     (distinct))
         refs (->> (filter (fn [datom]
         refs (->> (filter (fn [datom]
-                            (when (contains? #{:block/refs :block/path-refs} (:a datom))
+                            (when (contains? #{:block/refs} (:a datom))
                               (not= (:v datom)
                               (not= (:v datom)
                                     (:db/id (:block/page (d/entity db-after (:e datom))))))) tx-data)
                                     (:db/id (:block/page (d/entity db-after (:e datom))))))) tx-data)
                   (map :v)
                   (map :v)
@@ -67,13 +67,13 @@
                                 blocks [(when-let [parent-id (:db/id (:block/parent block))]
                                 blocks [(when-let [parent-id (:db/id (:block/parent block))]
                                           [::block parent-id])
                                           [::block parent-id])
                                         [::block (:db/id block)]]
                                         [::block (:db/id block)]]
-                                path-refs (:block/path-refs block)
-                                path-refs' (->> (keep (fn [ref]
-                                                        (when-not (= (:db/id ref) page-id)
-                                                          [[::refs (:db/id ref)]
-                                                           [::block (:db/id ref)]])) path-refs)
-                                                (apply concat))]
-                            (concat blocks path-refs')))
+                                block-refs (:block/refs block)
+                                refs (->> (keep (fn [ref]
+                                                  (when-not (= (:db/id ref) page-id)
+                                                    [[::refs (:db/id ref)]
+                                                     [::block (:db/id ref)]])) block-refs)
+                                          (apply concat))]
+                            (concat blocks refs)))
                         block-entities)
                         block-entities)
 
 
                        (mapcat
                        (mapcat

+ 65 - 47
src/main/frontend/worker/rtc/client.cljs

@@ -15,7 +15,8 @@
             [frontend.worker.rtc.ws-util :as ws-util]
             [frontend.worker.rtc.ws-util :as ws-util]
             [logseq.db :as ldb]
             [logseq.db :as ldb]
             [logseq.db.frontend.schema :as db-schema]
             [logseq.db.frontend.schema :as db-schema]
-            [missionary.core :as m]))
+            [missionary.core :as m]
+            [tick.core :as tick]))
 
 
 (defn- new-task--register-graph-updates
 (defn- new-task--register-graph-updates
   [get-ws-create-task graph-uuid major-schema-version repo]
   [get-ws-create-task graph-uuid major-schema-version repo]
@@ -34,61 +35,78 @@
           (throw (ex-info "remote graph is still creating" {:missionary/retry true} e))
           (throw (ex-info "remote graph is still creating" {:missionary/retry true} e))
           (throw e))))))
           (throw e))))))
 
 
-(defn- ensure-register-graph-updates*
+(def ^:private *register-graph-updates-sent
+  "ws -> [bool, added-inst, [graph-uuid,major-schema-version,repo]]"
+  (atom {}))
+
+(defn- clean-old-keys-in-sent!
+  []
+  (let [hours-ago (tick/<< (tick/instant) (tick/new-duration 3 :hours))
+        old-ks
+        (keep (fn [[k [_ added-inst]]]
+                (when (tick/< added-inst hours-ago)
+                  k))
+              @*register-graph-updates-sent)]
+    (doseq [k old-ks]
+      (swap! *register-graph-updates-sent dissoc k))))
+
+(defn ensure-register-graph-updates--memoized
   "Return a task: get or create a mws(missionary wrapped websocket).
   "Return a task: get or create a mws(missionary wrapped websocket).
   see also `ws/get-mws-create`.
   see also `ws/get-mws-create`.
   But ensure `register-graph-updates` and `calibrate-graph-skeleton` has been sent"
   But ensure `register-graph-updates` and `calibrate-graph-skeleton` has been sent"
   [get-ws-create-task graph-uuid major-schema-version repo conn
   [get-ws-create-task graph-uuid major-schema-version repo conn
    *last-calibrate-t *online-users *server-schema-version add-log-fn]
    *last-calibrate-t *online-users *server-schema-version add-log-fn]
-  (assert (some? graph-uuid))
-  (let [*sent (atom {}) ;; ws->bool
-        ]
-    (m/sp
-      (let [ws (m/? get-ws-create-task)]
-        (when-not (contains? @*sent ws)
-          (swap! *sent assoc ws false))
-        (when (not (@*sent ws))
-          (let [recv-flow (ws/recv-flow (m/? get-ws-create-task))]
-            (c.m/run-task :update-online-user-when-register-graph-updates
-              (m/sp
-                (when-let [online-users (:online-users
-                                         (m/?
-                                          (m/timeout
-                                           (m/reduce
-                                            (fn [_ v]
-                                              (when (= "online-users-updated" (:req-id v))
-                                                (reduced v)))
-                                            recv-flow)
-                                           10000)))]
-                  (reset! *online-users online-users)))
-              :succ (constantly nil)))
-          (let [{:keys [max-remote-schema-version]}
+  (m/sp
+    (let [ws (m/? get-ws-create-task)
+          sent-3rd-value [graph-uuid major-schema-version repo]
+          origin-v (@*register-graph-updates-sent ws)]
+      (when (or (nil? origin-v)
+                (not= (last origin-v) sent-3rd-value))
+        (swap! *register-graph-updates-sent assoc ws [false (tick/instant) sent-3rd-value])
+        (clean-old-keys-in-sent!))
+      (when (not (first (@*register-graph-updates-sent ws)))
+        (swap! *register-graph-updates-sent assoc-in [ws 0] true)
+        (let [recv-flow (ws/recv-flow (m/? get-ws-create-task))]
+          (c.m/run-task :update-online-user-when-register-graph-updates
+            (m/sp
+              (when-let [online-users (:online-users
+                                       (m/?
+                                        (m/timeout
+                                         (m/reduce
+                                          (fn [_ v]
+                                            (when (= "online-users-updated" (:req-id v))
+                                              (reduced v)))
+                                          recv-flow)
+                                         10000)))]
+                (reset! *online-users online-users)))
+            :succ (constantly nil)))
+        (let [{:keys [max-remote-schema-version]}
+              (try
                 (m/?
                 (m/?
                  (c.m/backoff
                  (c.m/backoff
-                  {:delay-seq
-                   ;retry 5 times if remote-graph is creating (4000 8000 16000 32000 64000)
+                  {:delay-seq ;retry 5 times if remote-graph is creating (4000 8000 16000 32000 64000)
                    (take 5 (drop 2 c.m/delays))
                    (take 5 (drop 2 c.m/delays))
                    :reset-flow worker-flows/online-event-flow}
                    :reset-flow worker-flows/online-event-flow}
-                  (new-task--register-graph-updates get-ws-create-task graph-uuid major-schema-version repo)))]
-            (when max-remote-schema-version
-              (add-log-fn :rtc.log/higher-remote-schema-version-exists
-                          {:sub-type (r.branch-graph/compare-schemas
-                                      max-remote-schema-version db-schema/version major-schema-version)
-                           :repo repo
-                           :graph-uuid graph-uuid
-                           :remote-schema-version max-remote-schema-version})))
-          (let [t (client-op/get-local-tx repo)]
-            (when (or (nil? @*last-calibrate-t)
-                      (< 500 (- t @*last-calibrate-t)))
-              (let [{:keys [server-schema-version _server-builtin-db-idents]}
-                    (m/? (r.skeleton/new-task--calibrate-graph-skeleton
-                          get-ws-create-task graph-uuid major-schema-version @conn))]
-                (reset! *server-schema-version server-schema-version))
-              (reset! *last-calibrate-t t)))
-          (swap! *sent assoc ws true))
-        ws))))
-
-(def ensure-register-graph-updates (memoize ensure-register-graph-updates*))
+                  (new-task--register-graph-updates get-ws-create-task graph-uuid major-schema-version repo)))
+                (catch :default e
+                  (swap! *register-graph-updates-sent assoc-in [ws 0] false)
+                  (throw e)))]
+          (when max-remote-schema-version
+            (add-log-fn :rtc.log/higher-remote-schema-version-exists
+                        {:sub-type (r.branch-graph/compare-schemas
+                                    max-remote-schema-version db-schema/version major-schema-version)
+                         :repo repo
+                         :graph-uuid graph-uuid
+                         :remote-schema-version max-remote-schema-version})))
+        (let [t (client-op/get-local-tx repo)]
+          (when (or (nil? @*last-calibrate-t)
+                    (< 500 (- t @*last-calibrate-t)))
+            (let [{:keys [server-schema-version _server-builtin-db-idents]}
+                  (m/? (r.skeleton/new-task--calibrate-graph-skeleton
+                        get-ws-create-task graph-uuid major-schema-version @conn))]
+              (reset! *server-schema-version server-schema-version))
+            (reset! *last-calibrate-t t))))
+      ws)))
 
 
 (defn- ->pos
 (defn- ->pos
   [parent-uuid order]
   [parent-uuid order]

+ 1 - 1
src/main/frontend/worker/rtc/core.cljs

@@ -230,7 +230,7 @@
                                      (rtc-log-and-state/rtc-log type (assoc message :graph-uuid graph-uuid)))
                                      (rtc-log-and-state/rtc-log type (assoc message :graph-uuid graph-uuid)))
         {:keys [*current-ws get-ws-create-task]}
         {:keys [*current-ws get-ws-create-task]}
         (gen-get-ws-create-map--memoized ws-url)
         (gen-get-ws-create-map--memoized ws-url)
-        get-ws-create-task (r.client/ensure-register-graph-updates
+        get-ws-create-task (r.client/ensure-register-graph-updates--memoized
                             get-ws-create-task graph-uuid major-schema-version
                             get-ws-create-task graph-uuid major-schema-version
                             repo conn *last-calibrate-t *online-users *server-schema-version add-log-fn)
                             repo conn *last-calibrate-t *online-users *server-schema-version add-log-fn)
         {:keys [assets-sync-loop-task]}
         {:keys [assets-sync-loop-task]}

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
src/rtc_e2e_test/example.cljs


+ 7 - 5
src/test/frontend/db/query_dsl_test.cljs

@@ -651,11 +651,13 @@ prop-d:: [[nada]]"}])
   - [[Child page]]
   - [[Child page]]
 - p2 [[Parent page]]
 - p2 [[Parent page]]
   - Non linked content"}]))
   - Non linked content"}]))
-  (is (= ["Non linked content"
-          "p2"
-          "p1"]
-         (map testable-content
-              (dsl-query "(and [[Parent page]] (not [[Child page]]))")))))
+  (is (= (set
+          ["Non linked content"
+           "p2"
+           "p1"])
+         (set
+          (map testable-content
+               (dsl-query "(and [[Parent page]] (not [[Child page]]))"))))))
 
 
 (deftest between-queries
 (deftest between-queries
   (load-test-files [{:file/path "journals/2020_12_26.md"
   (load-test-files [{:file/path "journals/2020_12_26.md"

+ 11 - 8
src/test/frontend/db/reference_test.cljs

@@ -76,7 +76,8 @@
 
 
     (testing "Linked references without filters"
     (testing "Linked references without filters"
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references db (:db/id foo))]
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references db (:db/id foo))]
-        (is (= [["baz" 4] ["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 2]] (vec ref-pages-count))
+        (is (= (set [["baz" 4] ["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 2]])
+               (set ref-pages-count))
             "ref-pages-count check failed")
             "ref-pages-count check failed")
         (is (empty? ref-matched-children-ids)
         (is (empty? ref-matched-children-ids)
             "ref-matched-children-ids check failed")
             "ref-matched-children-ids check failed")
@@ -88,7 +89,8 @@
                    [{:db/id (:db/id foo)
                    [{:db/id (:db/id foo)
                      :logseq.property.linked-references/includes (:db/id bar)}])
                      :logseq.property.linked-references/includes (:db/id bar)}])
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
-        (is (= [["baz" 3] ["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 2]] (vec ref-pages-count))
+        (is (= (set [["baz" 3] ["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 2]])
+               (set ref-pages-count))
             "ref-pages-count check failed")
             "ref-pages-count check failed")
         (is (= 7 (count ref-matched-children-ids))
         (is (= 7 (count ref-matched-children-ids))
             "ref-matched-children-ids check failed")
             "ref-matched-children-ids check failed")
@@ -100,7 +102,8 @@
                    [{:db/id (:db/id foo)
                    [{:db/id (:db/id foo)
                      :logseq.property.linked-references/includes (:db/id baz)}])
                      :logseq.property.linked-references/includes (:db/id baz)}])
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
-        (is (= [["baz" 3] ["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 2]] (vec ref-pages-count))
+        (is (= (set [["baz" 3] ["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 2]])
+               (set ref-pages-count))
             "ref-pages-count check failed")
             "ref-pages-count check failed")
         (is (= 7 (count ref-matched-children-ids))
         (is (= 7 (count ref-matched-children-ids))
             "ref-matched-children-ids check failed")
             "ref-matched-children-ids check failed")
@@ -113,7 +116,7 @@
                    [{:db/id (:db/id foo)
                    [{:db/id (:db/id foo)
                      :logseq.property.linked-references/excludes (:db/id bar)}])
                      :logseq.property.linked-references/excludes (:db/id bar)}])
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
-        (is (= [["Journal" 2] ["Jun 11th, 2025" 2] ["baz" 2]] (vec ref-pages-count))
+        (is (= (set [["Journal" 2] ["Jun 11th, 2025" 2] ["baz" 2]]) (set ref-pages-count))
             "ref-pages-count check failed")
             "ref-pages-count check failed")
         (is (= 2 (count ref-matched-children-ids))
         (is (= 2 (count ref-matched-children-ids))
             "ref-matched-children-ids check failed")
             "ref-matched-children-ids check failed")
@@ -126,7 +129,7 @@
                    [{:db/id (:db/id foo)
                    [{:db/id (:db/id foo)
                      :logseq.property.linked-references/excludes (:db/id baz)}])
                      :logseq.property.linked-references/excludes (:db/id baz)}])
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
-        (is (= [["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 1]] (vec ref-pages-count))
+        (is (= (set [["Journal" 2] ["Jun 11th, 2025" 2] ["bar" 1]]) (set ref-pages-count))
             "ref-pages-count check failed")
             "ref-pages-count check failed")
         (is (= 3 (count ref-matched-children-ids))
         (is (= 3 (count ref-matched-children-ids))
             "ref-matched-children-ids check failed")
             "ref-matched-children-ids check failed")
@@ -139,7 +142,7 @@
                    [{:db/id (:db/id foo)
                    [{:db/id (:db/id foo)
                      :logseq.property.linked-references/excludes #{(:db/id baz) (:db/id bar)}}])
                      :logseq.property.linked-references/excludes #{(:db/id baz) (:db/id bar)}}])
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
-        (is (= [["Journal" 2] ["Jun 11th, 2025" 2]] (vec ref-pages-count))
+        (is (= (set [["Journal" 2] ["Jun 11th, 2025" 2]]) (set ref-pages-count))
             "ref-pages-count check failed")
             "ref-pages-count check failed")
         (is (zero? (count ref-matched-children-ids))
         (is (zero? (count ref-matched-children-ids))
             "ref-matched-children-ids check failed")
             "ref-matched-children-ids check failed")
@@ -153,7 +156,7 @@
                      :logseq.property.linked-references/includes (:db/id bar)
                      :logseq.property.linked-references/includes (:db/id bar)
                      :logseq.property.linked-references/excludes (:db/id baz)}])
                      :logseq.property.linked-references/excludes (:db/id baz)}])
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
-        (is (= [["Journal" 1] ["Jun 11th, 2025" 1] ["bar" 1]] (vec ref-pages-count))
+        (is (= (set [["Journal" 1] ["Jun 11th, 2025" 1] ["bar" 1]]) (set ref-pages-count))
             "ref-pages-count check failed")
             "ref-pages-count check failed")
         (is (= 3 (count ref-matched-children-ids))
         (is (= 3 (count ref-matched-children-ids))
             "ref-matched-children-ids check failed")
             "ref-matched-children-ids check failed")
@@ -167,7 +170,7 @@
                      :logseq.property.linked-references/includes (:db/id baz)
                      :logseq.property.linked-references/includes (:db/id baz)
                      :logseq.property.linked-references/excludes (:db/id bar)}])
                      :logseq.property.linked-references/excludes (:db/id bar)}])
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
       (let [{:keys [ref-pages-count ref-blocks ref-matched-children-ids]} (db-reference/get-linked-references @conn (:db/id foo))]
-        (is (= [["Journal" 2] ["Jun 11th, 2025" 2] ["baz" 2]] (vec ref-pages-count))
+        (is (= (set [["Journal" 2] ["Jun 11th, 2025" 2] ["baz" 2]]) (set ref-pages-count))
             "ref-pages-count check failed")
             "ref-pages-count check failed")
         (is (= 2 (count ref-matched-children-ids))
         (is (= 2 (count ref-matched-children-ids))
             "ref-matched-children-ids check failed")
             "ref-matched-children-ids check failed")

+ 13 - 19
src/test/frontend/handler/editor_test.cljs

@@ -1,11 +1,11 @@
 (ns frontend.handler.editor-test
 (ns frontend.handler.editor-test
-  (:require [frontend.handler.editor :as editor]
-            [frontend.db :as db]
-            [clojure.test :refer [deftest is testing are use-fixtures]]
+  (:require [clojure.test :refer [deftest is testing are use-fixtures]]
             [datascript.core :as d]
             [datascript.core :as d]
-            [frontend.test.helper :as test-helper :refer [load-test-files]]
+            [frontend.db :as db]
             [frontend.db.model :as model]
             [frontend.db.model :as model]
+            [frontend.handler.editor :as editor]
             [frontend.state :as state]
             [frontend.state :as state]
+            [frontend.test.helper :as test-helper :refer [load-test-files]]
             [frontend.util.cursor :as cursor]))
             [frontend.util.cursor :as cursor]))
 
 
 (use-fixtures :each test-helper/start-and-destroy-db)
 (use-fixtures :each test-helper/start-and-destroy-db)
@@ -239,22 +239,16 @@
   (load-test-files [{:file/path "pages/page1.md"
   (load-test-files [{:file/path "pages/page1.md"
                      :file/content "\n
                      :file/content "\n
 - b1 #foo"}])
 - b1 #foo"}])
-  (testing "updating block's content changes content and preserves path-refs"
-   (let [conn (db/get-db test-helper/test-db false)
-         block (->> (d/q '[:find (pull ?b [* {:block/path-refs [:block/name]}])
-                           :where [?b :block/title "b1 #foo"]]
-                         @conn)
-                    ffirst)
-         prev-path-refs (set (map :block/name (:block/path-refs block)))
-         _ (assert (= #{"page1" "foo"} prev-path-refs)
-                   "block has expected :block/path-refs")
+  (testing "updating block's content changes content"
+    (let [conn (db/get-db test-helper/test-db false)
+          block (->> (d/q '[:find (pull ?b [*])
+                            :where [?b :block/title "b1 #foo"]]
+                          @conn)
+                     ffirst)
          ;; Use same options as edit-box-on-change!
          ;; Use same options as edit-box-on-change!
-         _ (editor/save-block-aux! block "b12 #foo" {:skip-properties? true})
-         updated-block (d/pull @conn '[* {:block/path-refs [:block/name]}] [:block/uuid (:block/uuid block)])]
-     (is (= "b12 #foo" (:block/title updated-block)) "Content updated correctly")
-     (is (= prev-path-refs
-            (set (map :block/name (:block/path-refs updated-block))))
-         "Path-refs remain the same"))))
+          _ (editor/save-block-aux! block "b12 #foo" {:skip-properties? true})
+          updated-block (d/pull @conn '[*] [:block/uuid (:block/uuid block)])]
+      (is (= "b12 #foo" (:block/title updated-block)) "Content updated correctly"))))
 
 
 (deftest save-block!
 (deftest save-block!
   (testing "Saving blocks with and without properties"
   (testing "Saving blocks with and without properties"

+ 3 - 3
src/test/frontend/handler/repo_test.cljs

@@ -26,12 +26,12 @@
 
 
     (docs-graph-helper/docs-graph-assertions db graph-dir (map :file/path files))
     (docs-graph-helper/docs-graph-assertions db graph-dir (map :file/path files))
     (testing "Additional Counts"
     (testing "Additional Counts"
-      (is (= 77370 (count (d/datoms db :eavt))) "Correct datoms count")
+      (is (= 58149 (count (d/datoms db :eavt))) "Correct datoms count")
 
 
-      (is (= 7095
+      (is (= 2065
              (ffirst
              (ffirst
               (d/q '[:find (count ?b)
               (d/q '[:find (count ?b)
-                     :where [?b :block/path-refs ?bp] [?bp :block/name]] db)))
+                     :where [?b :block/refs ?bp] [?bp :block/name]] db)))
           "Correct referenced blocks count"))))
           "Correct referenced blocks count"))))
 
 
 (deftest parse-files-and-load-to-db-with-block-refs-on-reload
 (deftest parse-files-and-load-to-db-with-block-refs-on-reload

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio