Skip to content

Commit 005cfee

Browse files
committed
perf: don't load block children if collapsed
1 parent b711a16 commit 005cfee

File tree

13 files changed

+180
-142
lines changed

13 files changed

+180
-142
lines changed

deps/db/src/logseq/db/common/sqlite.cljs

Lines changed: 41 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@
146146
(d/pull-many db '[*] ids')))))
147147

148148
(defn get-block-and-children
149-
[db id {:keys [children? nested-children? including-property-vals? properties]
149+
[db id {:keys [children? children-only? nested-children? including-property-vals? properties children-props]
150150
:or {including-property-vals? true}}]
151151
(let [block (d/entity db (if (uuid? id)
152152
[:block/uuid id]
@@ -157,52 +157,48 @@
157157
:block/tags :block/page]
158158
block-refs-count? (some #{:block.temp/refs-count} properties)]
159159
(when block
160-
(let [block' (if (seq properties)
161-
(select-keys block properties)
162-
block)
163-
block' (cond->
164-
(if (or children? nested-children?)
165-
(mark-block-fully-loaded block')
166-
block')
167-
including-property-vals?
168-
(update-vals (fn [v]
169-
(cond
170-
(de/entity? v)
171-
(select-keys v property-value-ks)
160+
(let [children (when (or children? children-only?)
161+
(let [page? (common-entity-util/page? block)
162+
children (cond
163+
(and nested-children? (not page?))
164+
(get-block-children db (:block/uuid block))
165+
nested-children?
166+
(:block/_page block)
167+
:else
168+
(let [short-page? (when page?
169+
(<= (count (:block/_page block)) 100))]
170+
(if short-page?
171+
(:block/_page block)
172+
(:block/_parent block))))
173+
children-props (or children-props [:db/id :block/uuid :block/parent :block/order :block/collapsed?])]
174+
(map
175+
(fn [block]
176+
(select-keys block children-props))
177+
children)))]
178+
(if children-only?
179+
{:children children}
180+
(let [block' (if (seq properties)
181+
(select-keys block properties)
182+
block)
183+
block' (cond->
184+
(mark-block-fully-loaded block')
185+
including-property-vals?
186+
(update-vals (fn [v]
187+
(cond
188+
(de/entity? v)
189+
(select-keys v property-value-ks)
172190

173-
(and (coll? v) (every? de/entity? v))
174-
(map #(select-keys % property-value-ks) v)
191+
(and (coll? v) (every? de/entity? v))
192+
(map #(select-keys % property-value-ks) v)
175193

176-
:else
177-
v)))
178-
block-refs-count?
179-
(assoc :block.temp/refs-count (count (:block/_refs block))))]
180-
(cond->
181-
{:block (assoc (into {} block') :db/id (:db/id block))}
182-
children?
183-
(assoc :children
184-
(let [page? (common-entity-util/page? block)
185-
children (if (and nested-children? (not page?))
186-
(get-block-children db (:block/uuid block))
187-
(if page?
188-
(:block/_page block)
189-
(:block/_parent block)))
190-
long-page? (and (> (count children) 500) (not (common-entity-util/whiteboard? block)))]
191-
(if long-page?
192-
(->> (map (fn [e]
193-
(select-keys e [:db/id :block/uuid :block/page :block/order :block/parent :block/collapsed? :block/link]))
194-
children)
195-
(map #(with-block-link db %)))
196-
(->> (d/pull-many db '[*] (map :db/id children))
197-
(map #(with-block-refs db %))
198-
(map #(with-block-link db %))
199-
(mapcat (fn [block]
200-
(let [e (d/entity db (:db/id block))]
201-
(conj
202-
(if (seq (:block/properties e))
203-
(vec (property-with-values db e nil))
204-
[])
205-
block)))))))))))))
194+
:else
195+
v)))
196+
block-refs-count?
197+
(assoc :block.temp/refs-count (count (:block/_refs block))))]
198+
(cond->
199+
{:block (assoc (into {} block') :db/id (:db/id block))}
200+
children?
201+
(assoc :children children))))))))
206202

207203
(defn get-latest-journals
208204
[db]

src/main/electron/listener.cljs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,23 @@
55
[clojure.string :as string]
66
[dommy.core :as dom]
77
[electron.ipc :as ipc]
8+
[frontend.db :as db]
9+
[frontend.db.async :as db-async]
810
[frontend.db.model :as db-model]
911
[frontend.fs.sync :as sync]
1012
[frontend.fs.watcher-handler :as watcher-handler]
1113
[frontend.handler.file-sync :as file-sync-handler]
1214
[frontend.handler.notification :as notification]
15+
[frontend.handler.property.util :as pu]
1316
[frontend.handler.route :as route-handler]
17+
[frontend.handler.search :as search-handler]
1418
[frontend.handler.ui :as ui-handler]
1519
[frontend.handler.user :as user]
16-
[frontend.handler.search :as search-handler]
1720
[frontend.state :as state]
1821
[frontend.ui :as ui]
1922
[logseq.common.path :as path]
2023
[logseq.common.util :as common-util]
21-
[promesa.core :as p]
22-
[frontend.handler.property.util :as pu]
23-
[frontend.db :as db]
24-
[frontend.db.async :as db-async]))
24+
[promesa.core :as p]))
2525

2626
(defn- safe-api-call
2727
"Force the callback result to be nil, otherwise, ipc calls could lead to
@@ -87,7 +87,7 @@
8787
(route-handler/redirect-to-page! page-name {:block-id block-id}))
8888

8989
block-id
90-
(p/let [block (db-async/<get-block (state/get-current-repo) block-id)]
90+
(p/let [block (db-async/<get-block (state/get-current-repo) block-id {:children? false})]
9191
(if block
9292
(if (pu/shape-block? block)
9393
(route-handler/redirect-to-page! (get-in block [:block/page :block/uuid]) {:block-id block-id})

src/main/frontend/components/block.cljs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3630,6 +3630,12 @@
36303630
(select-keys (first (:rum/args new-state)) config-compare-keys)))]
36313631
(boolean result)))
36323632

3633+
(defn- set-collapsed-block!
3634+
[block-id v]
3635+
(if (false? v)
3636+
(editor-handler/expand-block! block-id {:skip-db-collpsing? true})
3637+
(state/set-collapsed-block! block-id v)))
3638+
36333639
(rum/defcs loaded-block-container < rum/reactive db-mixins/query
36343640
(rum/local false ::show-block-left-menu?)
36353641
(rum/local false ::show-block-right-menu?)
@@ -3642,14 +3648,14 @@
36423648
(cond
36433649
(and (:page-title? config) (or (ldb/class? block) (ldb/property? block)) (not config/publishing?))
36443650
(let [collapsed? (state/get-block-collapsed block-id)]
3645-
(state/set-collapsed-block! block-id (if (some? collapsed?) collapsed? true)))
3651+
(set-collapsed-block! block-id (if (some? collapsed?) collapsed? true)))
36463652

36473653
(root-block? config block)
3648-
(state/set-collapsed-block! block-id false)
3654+
(set-collapsed-block! block-id false)
36493655

36503656
(or (:ref? config) (:custom-query? config) (:view? config))
3651-
(state/set-collapsed-block! block-id
3652-
(boolean (editor-handler/block-default-collapsed? block config)))
3657+
(set-collapsed-block! block-id
3658+
(boolean (editor-handler/block-default-collapsed? block config)))
36533659

36543660
:else
36553661
nil)
@@ -3664,7 +3670,7 @@
36643670
(let [[config block] (:rum/args state)
36653671
block-id (:block/uuid block)]
36663672
(when (root-block? config block)
3667-
(state/set-collapsed-block! block-id nil)))
3673+
(set-collapsed-block! block-id nil)))
36683674
state)}
36693675
[state config block & {:as opts}]
36703676
(let [repo (state/get-current-repo)
@@ -3699,10 +3705,17 @@
36993705
(hooks/use-effect!
37003706
(fn []
37013707
(p/do!
3702-
(db-async/<get-block (state/get-current-repo) (:db/id block*))
3708+
(db-async/<get-block (state/get-current-repo)
3709+
(:db/id block*)
3710+
{:children? (not
3711+
(if-some [result (state/get-block-collapsed (:block/uuid block))]
3712+
result
3713+
(:block/collapsed? block)))
3714+
:skip-refresh? true})
37033715
(set-block! (some-> (:db/id block*) db/entity))))
37043716
[]))
3705-
(loaded-block-container config block opts)))
3717+
(when (or (:view? config) (:block.temp/fully-loaded? block))
3718+
(loaded-block-container config block opts))))
37063719

37073720
(defn divide-lists
37083721
[[f & l]]

src/main/frontend/components/page.cljs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -485,10 +485,11 @@
485485
[e *control-show? *all-collapsed?]
486486
(util/stop e)
487487
(reset! *control-show? true)
488-
(let [all-collapsed?
489-
(->> (editor-handler/all-blocks-with-level {:collapse? true})
490-
(filter (fn [b] (editor-handler/collapsable? (:block/uuid b))))
491-
(empty?))]
488+
(p/let [blocks (editor-handler/<all-blocks-with-level {:collapse? true})
489+
all-collapsed?
490+
(->> blocks
491+
(filter (fn [b] (editor-handler/collapsable? (:block/uuid b))))
492+
(empty?))]
492493
(reset! *all-collapsed? all-collapsed?)))
493494

494495
(defn- page-mouse-leave
@@ -670,7 +671,7 @@
670671
:preview? preview?})))
671672
(lsp-pagebar-slot)])
672673

673-
(when (and db-based? sidebar?)
674+
(when (and db-based? sidebar? (ldb/page? page))
674675
[:div.-mb-8
675676
(sidebar-page-properties config page)])
676677

src/main/frontend/components/property/config.cljs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -757,8 +757,7 @@
757757
repo (state/get-current-repo)
758758
property (first (:rum/args state))
759759
ident (:db/ident property)]
760-
(p/let [_ (db-async/<get-block repo (:block/uuid property))
761-
result (db-async/<get-property-values ident)]
760+
(p/let [result (db-async/<get-property-values ident)]
762761
(reset! *values result))
763762
(assoc state ::values *values)))}
764763
[state property* owner-block opts]

src/main/frontend/components/query/result.cljs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@
4747
(util/react (query-dsl/query (state/get-current-repo) q {:cards? (:cards? config)}))))
4848

4949
:else
50-
(util/react (query-custom/custom-query query {:current-block-uuid current-block-uuid})))
50+
(util/react (query-custom/custom-query query {:current-block-uuid current-block-uuid
51+
:built-in-query? (:built-in-query? config)})))
5152
(catch :default e
5253
(reset! *query-error e)))))
5354

src/main/frontend/components/views.cljs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@
579579
sized-columns (get-in table [:state :sized-columns])
580580
row-cell-f (fn [column {:keys [_lazy?]}]
581581
(when-let [render (get column :cell)]
582-
(let [id (str row "-" (:id column))
582+
(let [id (str (:id row) "-" (:id column))
583583
width (get-column-size column sized-columns)
584584
select? (= (:id column) :select)
585585
add-property? (= (:id column) :add-property)
@@ -1234,7 +1234,7 @@
12341234
(let [[first-block-id blocks] row]
12351235
[:div
12361236
{:key (str "partition-" first-block-id)}
1237-
[:div.ml-2
1237+
[:div.ml-6.text-sm.opacity-70.hover:opacity-100.mt-1
12381238
(breadcrumb (assoc config :list-view? true)
12391239
(state/get-current-repo) first-block-id
12401240
{:show-page? false})]

src/main/frontend/db/async.cljs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@
100100

101101
(defonce *block-cache (atom (cache/lru-cache-factory {} :threshold 1000)))
102102
(defn <get-block
103-
[graph id-uuid-or-name & {:keys [children? skip-transact? skip-refresh? block-only? _properties]
103+
[graph id-uuid-or-name & {:keys [children? nested-children? skip-transact? skip-refresh? block-only? children-only? _properties]
104104
:or {children? true}
105105
:as opts}]
106106

@@ -124,7 +124,9 @@
124124
(and (util/uuid-string? name') name')
125125
id-uuid-or-name)]
126126
(cond
127-
(:block.temp/fully-loaded? e)
127+
(and (:block.temp/fully-loaded? e) ; children may not be fully loaded
128+
(not children-only?)
129+
(not nested-children?))
128130
e
129131

130132
cached-response
@@ -139,18 +141,23 @@
139141
(state/update-state! :db/async-query-loading (fn [s] (disj s name')))
140142
(if skip-transact?
141143
(reset! *block-cache (cache/miss @*block-cache cache-key
142-
(if (or children? block-only?)
144+
(if (and (not children-only?) (or children? block-only?))
143145
(:block result')
144146
result')))
145147
(let [conn (db/get-db graph false)
146-
block-and-children (cons block children)
147-
affected-keys [[:frontend.worker.react/block (:db/id block)]]]
148-
(d/transact! conn (remove (fn [b] (:block.temp/fully-loaded? (db/entity (:db/id b)))) block-and-children))
148+
block-and-children (if block (cons block children) children)
149+
affected-keys [[:frontend.worker.react/block (:db/id block)]]
150+
tx-data (remove (fn [b] (:block.temp/fully-loaded? (db/entity (:db/id b)))) block-and-children)]
151+
(when (seq tx-data) (d/transact! conn tx-data))
149152
(when-not skip-refresh?
150153
(react/refresh-affected-queries! graph affected-keys))))
151154

152-
(if (or children? block-only?)
155+
(cond
156+
children-only?
157+
children
158+
(or children? block-only?)
153159
block
160+
:else
154161
result'))))))
155162

156163
(defn <get-blocks

src/main/frontend/db/react.cljs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,17 @@
8686
(:result result)))
8787

8888
(defn- <q-aux
89-
[repo db query-fn async-query-fn inputs-fn k query inputs]
89+
[repo db query-fn async-query-fn inputs-fn k query inputs built-in-query?]
9090
(let [kv? (and (vector? k) (= :kv (second k)))
9191
q (if util/node-test?
9292
(fn [query inputs] (apply d/q query db inputs))
93-
(fn [query inputs] (apply db-async-util/<q repo {} (cons query inputs))))]
93+
(fn [query inputs]
94+
(let [q-f #(apply db-async-util/<q repo {} (cons query inputs))]
95+
(if built-in-query?
96+
;; delay built-in-queries to not block journal rendering
97+
(p/let [_ (p/delay 100)]
98+
(q-f))
99+
(q-f)))))]
94100
(when (or query-fn async-query-fn query kv?)
95101
(cond
96102
async-query-fn
@@ -113,7 +119,8 @@
113119
(q query nil)))))
114120

115121
(defn q
116-
[repo k {:keys [use-cache? transform-fn query-fn async-query-fn inputs-fn disable-reactive? return-promise?]
122+
[repo k {:keys [use-cache? transform-fn query-fn async-query-fn inputs-fn
123+
disable-reactive? return-promise? built-in-query?]
117124
:or {use-cache? true
118125
transform-fn identity}} query & inputs]
119126
;; {:pre [(s/valid? :frontend.worker.react/block k)]}
@@ -128,7 +135,7 @@
128135
(if (and use-cache? result-atom)
129136
result-atom
130137
(let [result-atom (or result-atom (atom nil))
131-
p-or-value (<q-aux repo db query-fn async-query-fn inputs-fn k query inputs)]
138+
p-or-value (<q-aux repo db query-fn async-query-fn inputs-fn k query inputs built-in-query?)]
132139
(when-not disable-reactive?
133140
(add-q! k query inputs result-atom transform-fn query-fn async-query-fn inputs-fn))
134141
(cond
@@ -162,9 +169,9 @@
162169
(ldb/get-page (conn/get-db) page)))))
163170

164171
(defn- execute-query!
165-
[graph db k {:keys [query inputs transform-fn query-fn async-query-fn inputs-fn result]
172+
[graph db k {:keys [query inputs transform-fn query-fn async-query-fn inputs-fn result built-in-query?]
166173
:or {transform-fn identity}}]
167-
(p/let [p-or-value (<q-aux graph db query-fn async-query-fn inputs-fn k query inputs)
174+
(p/let [p-or-value (<q-aux graph db query-fn async-query-fn inputs-fn k query inputs built-in-query?)
168175
result' (transform-fn p-or-value)]
169176
(when-not (= result' result)
170177
(set-new-result! k result'))))

src/main/frontend/extensions/fsrs.cljs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
(ns frontend.extensions.fsrs
22
"Flashcards functions based on FSRS, only works in db-based graphs"
33
(:require [clojure.string :as string]
4+
[frontend.common.missionary :as c.m]
45
[frontend.components.block :as component-block]
56
[frontend.config :as config]
67
[frontend.context.i18n :refer [t]]
@@ -16,7 +17,6 @@
1617
[frontend.state :as state]
1718
[frontend.ui :as ui]
1819
[frontend.util :as util]
19-
[frontend.common.missionary :as c.m]
2020
[logseq.db :as ldb]
2121
[logseq.db.frontend.entity-plus :as entity-plus]
2222
[logseq.shui.ui :as shui]
@@ -189,7 +189,7 @@
189189
(rum/defcs ^:private card-view < rum/reactive db-mixins/query
190190
{:will-mount (fn [state]
191191
(when-let [[repo block-id _] (:rum/args state)]
192-
(db-async/<get-block repo block-id))
192+
(db-async/<get-block repo block-id {:children? false}))
193193
state)}
194194
[state repo block-id *card-index *phase]
195195
(when-let [block-entity (db/sub-block block-id)]

0 commit comments

Comments
 (0)