enhance: group db transactions

pull/10726/head
Tienson Qin 2023-12-18 23:21:55 +08:00
parent 222b2f84bc
commit b27709ce13
1 changed files with 42 additions and 48 deletions

View File

@ -50,8 +50,8 @@
(state/set-edit-content! input content)
(when pos (cursor/move-cursor-to input pos)))))))))))
(defn- delete-property-parent-block-if-empty!
[repo tx-report deleted-block-uuids]
(defn- delete-property-parent-block-if-empty
[tx-report deleted-block-uuids]
(let [empty-property-parents (->> (keep (fn [child-id]
(let [e (d/entity (:db-before tx-report) [:block/uuid child-id])]
(when (:created-from-property (:block/metadata (:block/parent e)))
@ -60,23 +60,21 @@
parent-now))))) deleted-block-uuids)
distinct)]
(when (seq empty-property-parents)
(let [tx-data (->>
(mapcat (fn [b]
(let [{:keys [created-from-block created-from-property]} (:block/metadata b)
created-block (db/entity [:block/uuid created-from-block])
properties (assoc (:block/properties created-block) created-from-property "")]
(when (and created-block created-from-property)
[[:db/retractEntity (:db/id b)]
[:db/add (:db/id created-block) :block/properties properties]])))
empty-property-parents)
(remove nil?))]
(db/transact! repo tx-data {:outliner/transact? true
:replace? true})))))
(->>
(mapcat (fn [b]
(let [{:keys [created-from-block created-from-property]} (:block/metadata b)
created-block (db/entity [:block/uuid created-from-block])
properties (assoc (:block/properties created-block) created-from-property "")]
(when (and created-block created-from-property)
[[:db/retractEntity (:db/id b)]
[:db/add (:db/id created-block) :block/properties properties]])))
empty-property-parents)
(remove nil?)))))
(defn invoke-hooks
[tx-report]
(let [tx-meta (:tx-meta tx-report)
{:keys [compute-path-refs? from-disk? new-graph? replace?]} tx-meta]
{:keys [from-disk? new-graph? pipeline-replace?]} tx-meta]
(when (and (not from-disk?)
(not new-graph?))
(try
@ -87,51 +85,47 @@
(let [{:keys [pages blocks]} (ds-report/get-blocks-and-pages tx-report)
repo (state/get-current-repo)
tx (when-not compute-path-refs?
(util/profile
"Compute path refs: "
(set (compute-block-path-refs-tx tx-report blocks))))
tx-report' (if (seq tx)
(let [refs-tx-data' (:tx-data (db/transact! repo tx {:outliner/transact? true
:replace? true
:compute-path-refs? true}))]
;; merge
(assoc tx-report :tx-data (concat (:tx-data tx-report) refs-tx-data')))
tx-report)
importing? (:graph/importing @state/state)
deleted-block-uuids (set (outliner-pipeline/filter-deleted-blocks (:tx-data tx-report)))]
deleted-block-uuids (set (outliner-pipeline/filter-deleted-blocks (:tx-data tx-report)))
replace-full-tx (when-not pipeline-replace?
(concat
;; block path refs
(util/profile
"Compute path refs: "
(set (compute-block-path-refs-tx tx-report blocks)))
(when (and (seq deleted-block-uuids) (not replace?)
(not compute-path-refs?))
(delete-property-parent-block-if-empty! repo tx-report deleted-block-uuids))
;; delete empty property parent block
(when (seq deleted-block-uuids)
(delete-property-parent-block-if-empty tx-report deleted-block-uuids))
(let [updated-blocks (remove (fn [b] (contains? (set deleted-block-uuids) (:block/uuid b))) blocks)
tx-id (get-in tx-report' [:tempids :db/current-tx])
update-tx-ids (->>
(map (fn [b]
(when-let [db-id (:db/id b)]
{:db/id db-id
:block/tx-id tx-id})) updated-blocks)
(remove nil?))]
(when (and (seq update-tx-ids)
(not (:update-tx-ids? tx-meta)))
(db/transact! repo update-tx-ids {:replace? true
:update-tx-ids? true}))
(when (and (config/db-based-graph? repo) (not config/publishing?))
(persist-db/<transact-data repo (:tx-data tx-report) (:tx-meta tx-report))))
;; update block/tx-id
(let [updated-blocks (remove (fn [b] (contains? (set deleted-block-uuids) (:block/uuid b))) blocks)
tx-id (get-in tx-report [:tempids :db/current-tx])]
(->>
(map (fn [b]
(when-let [db-id (:db/id b)]
{:db/id db-id
:block/tx-id tx-id})) updated-blocks)
(remove nil?)))))]
(when-not importing?
(react/refresh! repo tx-report'))
(when (and (not config/publishing?) (not pipeline-replace?))
(let [tx-report' (db/transact! repo replace-full-tx {:outliner/transact? true
:replace? true
:pipeline-replace? true})
full-tx-data (concat (:tx-data tx-report) (:tx-data tx-report'))]
(persist-db/<transact-data repo full-tx-data (:tx-meta tx-report))
(when-not importing?
(react/refresh! repo (assoc tx-report :tx-data full-tx-data)))))
(when (and (not (:delete-files? tx-meta))
(not replace?))
(not pipeline-replace?))
(doseq [p (seq pages)]
(updated-page-hook tx-report p)))
(when (and state/lsp-enabled?
(seq blocks)
(not importing?)
(not replace?)
(not pipeline-replace?)
(<= (count blocks) 1000))
(state/pub-event! [:plugin/hook-db-tx
{:blocks blocks