Преглед изворни кода

enhance(perf): reduce get-block calls when children have been loaded

Tienson Qin пре 7 месеци
родитељ
комит
119485fafb

+ 6 - 3
deps/db/src/logseq/db.cljs

@@ -72,9 +72,12 @@
      (assert-no-entities tx-data))
    (let [tx-data (map (fn [m]
                         (if (map? m)
-                          (dissoc m :block/children :block/meta :block/top? :block/bottom? :block/anchor
-                                  :block/level :block/container :db/other-tx
-                                  :block/unordered)
+                          (cond->
+                           (dissoc m :block/children :block/meta :block/top? :block/bottom? :block/anchor
+                                   :block/level :block/container :db/other-tx
+                                   :block/unordered)
+                            (not @*transact-fn)
+                            (dissoc :block.temp/load-status))
                           m)) tx-data)
          tx-data (->> (remove-temp-block-data tx-data)
                       (common-util/fast-remove-nils)

+ 20 - 8
deps/db/src/logseq/db/common/initial_data.cljs

@@ -243,22 +243,34 @@
                   nil))
         block-refs-count? (some #{:block.temp/refs-count} properties)]
     (when block
+      ;; (prn :debug :get-block (:db/id block) (:block/title block) :children? children?)
       (let [children (when children?
-                       (let [children (let [children (get-block-children db (:block/uuid block) {:include-collapsed-children? include-collapsed-children?})
-                                            children' (if (>= (count children) 100)
+                       (let [children-blocks (get-block-children db (:block/uuid block) {:include-collapsed-children? include-collapsed-children?})
+                             large-page? (>= (count children-blocks) 100)
+                             children (let [children' (if large-page?
                                                         (:block/_parent block)
-                                                        children)]
+                                                        children-blocks)]
                                         (->> children'
-                                             (remove (fn [e] (:block/closed-value-property e)))))]
+                                             (remove (fn [e] (:block/closed-value-property e)))))
+                             children-ids (set (map :db/id children))]
                          (map
                           (fn [block]
-                            (-> block
-                                (assoc :block.temp/has-children? (some? (:block/_parent block)))
-                                (entity->map)))
+                            (let [collapsed? (:block/collapsed? block)]
+                              (-> block
+                                  (entity->map)
+                                  (assoc :block.temp/has-children? (some? (:block/_parent block))
+                                         :block.temp/load-status (if (and (not collapsed?)
+                                                                          (or (and large-page?
+                                                                                   (every? children-ids (map :db/id (:block/_parent block))))
+                                                                              (not large-page?)))
+                                                                   :full
+                                                                   :self)))))
                           children)))
             block' (cond-> (entity->map block {:properties (set properties)})
                      block-refs-count?
-                     (assoc :block.temp/refs-count (get-block-refs-count db (:db/id block))))]
+                     (assoc :block.temp/refs-count (get-block-refs-count db (:db/id block)))
+                     true
+                     (assoc :block.temp/load-status (if (and children? (empty? properties)) :full :self)))]
         (cond->
          {:block block'}
           children?

+ 2 - 2
src/main/frontend/components/page.cljs

@@ -607,7 +607,7 @@
 
          (if (and whiteboard-page? (not sidebar?))
            [:div ((state/get-component :whiteboard/tldraw-preview) (:block/uuid page))] ;; FIXME: this is not reactive
-           [:div.relative.grid.gap-8.page-inner
+           [:div.relative.grid.gap-8.page-inner.mb-16
             (when-not (or block? sidebar?)
               [:div.flex.flex-row.space-between
                (when (and (or (mobile-util/native-platform?) (util/mobile?)) (not db-based?))
@@ -650,7 +650,7 @@
                                                    :whiteboard? whiteboard?}))])])
 
          (when (and (not preview?) (or (not show-tabs?) objects-ready?))
-           [:div.ml-1.flex.flex-col.gap-8.mt-4
+           [:div.ml-1.flex.flex-col.gap-8
             (when today?
               (today-queries repo today? sidebar?))
 

+ 3 - 10
src/main/frontend/db/async.cljs

@@ -84,7 +84,7 @@
                             :or {children? true}
                             :as opts}]
 
-  ;; (prn :debug :<get-block id-uuid-or-name :children? children?)
+  ;; (prn :debug :<get-block id-uuid-or-name :children? children? :properties properties)
   ;; (js/console.trace)
   (let [name' (str id-uuid-or-name)
         opts (assoc opts :children? children?)
@@ -112,17 +112,11 @@
                {:keys [block children]} (first result)]
          (when-not skip-transact?
            (let [conn (db/get-db graph false)
-                 load-status' (if (and (or children? children-only?) (empty? properties)) :full :self)
-                 block-load-status-tx (when block
-                                        [{:db/id (:db/id block)
-                                          :block.temp/load-status load-status'}])
-                 children (map (fn [child] (assoc child :block.temp/load-status :self)) children)
                  block-and-children (if block (cons block children) children)
                  affected-keys [[:frontend.worker.react/block (:db/id block)]]
                  tx-data (->> (remove (fn [b] (:block.temp/load-status (db/entity (:db/id b)))) block-and-children)
                               (common-util/fast-remove-nils)
-                              (remove empty?)
-                              (concat block-load-status-tx))]
+                              (remove empty?))]
              (when (seq tx-data) (d/transact! conn tx-data))
              (when-not skip-refresh?
                (react/refresh-affected-queries! graph affected-keys {:skip-kv-custom-keys? true}))))
@@ -143,8 +137,7 @@
         (let [conn (db/get-db graph false)
               result' (map :block result)]
           (when (seq result')
-            (let [result'' (map (fn [b] (assoc b :block.temp/load-status :self)) result')]
-              (d/transact! conn result'')))
+            (d/transact! conn result'))
           result')))))
 
 (defn <get-block-parents