mirror of https://github.com/logseq/logseq
enhance: group db transactions
parent
222b2f84bc
commit
b27709ce13
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue