Improve long page editing performance (#3855)

* Remove expensive parsing when saving files

* Add limit to page blocks query

* Don't collapse block's body to make it compatible with other tools

* Alert if there're unsaved changes when switching graphs

* DB schema migration for :block/collapsed? from it's property

Co-authored-by: Andelf <andelf@gmail.com>
This commit is contained in:
Tienson Qin
2022-01-18 10:37:31 +08:00
committed by GitHub
parent 6a151937d7
commit 6aba8c3241
28 changed files with 429 additions and 348 deletions

View File

@@ -10,6 +10,7 @@
[frontend.db.react]
[frontend.db.utils]
[frontend.db.persist :as db-persist]
[frontend.db.migrate :as db-migrate]
[frontend.namespaces :refer [import-vars]]
[frontend.state :as state]
[frontend.util :as util]
@@ -29,7 +30,7 @@
[frontend.db.utils
date->int db->json db->edn-str db->string get-max-tx-id get-tx-id
group-by-page seq-flatten sort-by-pos
string->db with-repo
string->db
entity pull pull-many transact! get-key-value]
@@ -48,7 +49,7 @@
get-page-blocks-count get-page-blocks-no-cache get-page-file get-page-format get-page-properties
get-page-referenced-blocks get-page-referenced-pages get-page-unlinked-references get-page-referenced-blocks-no-cache
get-all-pages get-pages get-pages-relation get-pages-that-mentioned-page get-public-pages get-tag-pages
journal-page? local-native-fs? mark-repo-as-cloned! page-alias-set page-blocks-transform pull-block
journal-page? mark-repo-as-cloned! page-alias-set pull-block
set-file-last-modified-at! transact-files-db! page-empty? page-empty-or-dummy? get-alias-source-page
set-file-content! has-children? get-namespace-pages get-all-namespace-relation get-pages-by-name-partition]
@@ -66,6 +67,21 @@
[frontend.db.default built-in-pages-names built-in-pages])
(defn get-schema-version [db]
(d/q
'[:find ?v .
:where
[_ :schema/version ?v]]
db))
(defn old-schema?
[db]
(let [v (get-schema-version db)]
(if (integer? v)
(> db-schema/version v)
;; backward compatibility
true)))
;; persisting DBs between page reloads
(defn persist! [repo]
(let [key (datascript-db repo)
@@ -137,6 +153,8 @@
(assoc option
:listen-handler listen-and-persist!))))
;; TODO: only restore the current graph instead of all the graphs to speedup and
;; reduce memory usage.
(defn restore!
[{:keys [repos] :as me} _old-db-schema restore-config-handler]
(let [logged? (:name me)]
@@ -145,17 +163,20 @@
(let [repo url]
(p/let [db-name (datascript-db repo)
db-conn (d/create-conn db-schema/schema)
_ (d/transact! db-conn [{:schema/version db-schema/version}])
_ (swap! conns assoc db-name db-conn)
stored (db-persist/get-serialized-graph db-name)
_ (if stored
(let [stored-db (string->db stored)
attached-db (d/db-with stored-db (concat
[(me-tx stored-db me)]
default-db/built-in-pages))]
(conn/reset-conn! db-conn attached-db))
default-db/built-in-pages))
db (if (old-schema? attached-db)
(db-migrate/migrate attached-db)
attached-db)]
(conn/reset-conn! db-conn db))
(when logged?
(d/transact! db-conn [(me-tx (d/db db-conn) me)])))]
(d/transact! db-conn [{:schema/version db-schema/version}])
(restore-config-handler repo)
(listen-and-persist! repo)))))))