Browse Source

refactor: listen to db changes for outliner pipeline

Tienson Qin 3 years ago
parent
commit
06e932d130

+ 4 - 10
src/main/frontend/db.cljs

@@ -116,8 +116,8 @@
 
 
 ;; only save when user's idle
 ;; only save when user's idle
 
 
-;; TODO: pass as a parameter
-(defonce *sync-search-indice-f (atom nil))
+(def *db-listener (atom nil))
+
 (defn- repo-listen-to-tx!
 (defn- repo-listen-to-tx!
   [repo conn]
   [repo conn]
   (d/listen! conn :persistence
   (d/listen! conn :persistence
@@ -138,14 +138,8 @@
                      (state/set-last-transact-time! repo (util/time-ms))
                      (state/set-last-transact-time! repo (util/time-ms))
                      (persist-if-idle! repo)))
                      (persist-if-idle! repo)))
 
 
-                 ;; rebuild search indices
-                 (let [data (:tx-data tx-report)
-                       datoms (filter
-                               (fn [datom]
-                                 (contains? #{:block/name :block/content} (:a datom)))
-                               data)]
-                   (when-let [f @*sync-search-indice-f]
-                     (f datoms)))))))
+                 (when-let [db-listener @*db-listener]
+                   (db-listener repo tx-report))))))
 
 
 (defn listen-and-persist!
 (defn listen-and-persist!
   [repo]
   [repo]

+ 4 - 3
src/main/frontend/handler.cljs

@@ -24,7 +24,6 @@
             [frontend.idb :as idb]
             [frontend.idb :as idb]
             [frontend.modules.instrumentation.core :as instrument]
             [frontend.modules.instrumentation.core :as instrument]
             [frontend.modules.shortcut.core :as shortcut]
             [frontend.modules.shortcut.core :as shortcut]
-            [frontend.search :as search]
             [frontend.state :as state]
             [frontend.state :as state]
             [frontend.storage :as storage]
             [frontend.storage :as storage]
             [frontend.util :as util]
             [frontend.util :as util]
@@ -33,7 +32,8 @@
             [goog.object :as gobj]
             [goog.object :as gobj]
             [lambdaisland.glogi :as log]
             [lambdaisland.glogi :as log]
             [promesa.core :as p]
             [promesa.core :as p]
-            [frontend.db.persist :as db-persist]))
+            [frontend.db.persist :as db-persist]
+            [frontend.modules.outliner.datascript :as outliner-db]))
 
 
 (defn set-global-error-notification!
 (defn set-global-error-notification!
   []
   []
@@ -169,6 +169,8 @@
   (state/set-component! :block/linked-references reference/block-linked-references)
   (state/set-component! :block/linked-references reference/block-linked-references)
   (command-palette/register-global-shortcut-commands))
   (command-palette/register-global-shortcut-commands))
 
 
+(reset! db/*db-listener outliner-db/after-transact-pipelines)
+
 (defn start!
 (defn start!
   [render]
   [render]
   (set-global-error-notification!)
   (set-global-error-notification!)
@@ -197,7 +199,6 @@
       (when (mobile-util/native-platform?)
       (when (mobile-util/native-platform?)
         (p/do! (mobile-util/hide-splash))))
         (p/do! (mobile-util/hide-splash))))
 
 
-    (reset! db/*sync-search-indice-f search/sync-search-indice!)
     (db/run-batch-txs!)
     (db/run-batch-txs!)
     (file-handler/run-writes-chan!)
     (file-handler/run-writes-chan!)
     (when config/dev?
     (when config/dev?

+ 6 - 5
src/main/frontend/handler/file.cljs

@@ -93,8 +93,8 @@
 
 
 (defn reset-file!
 (defn reset-file!
   ([repo-url file content]
   ([repo-url file content]
-   (reset-file! repo-url file content false))
-  ([repo-url file content new-graph?]
+   (reset-file! repo-url file content {}))
+  ([repo-url file content {:keys [new-graph? from-disk?]}]
    (let [electron-local-repo? (and (util/electron?)
    (let [electron-local-repo? (and (util/electron?)
                                    (config/local-db? repo-url))
                                    (config/local-db? repo-url))
          file (cond
          file (cond
@@ -163,8 +163,8 @@
                               {:file/path file}
                               {:file/path file}
                               new?
                               new?
                               (assoc :file/created-at t)))])]
                               (assoc :file/created-at t)))])]
-       (db/transact! repo-url tx (when new-graph? {:new-graph? true}))))))
-
+       (db/transact! repo-url tx {:new-graph? true
+                                  :from-disk? from-disk?})))))
 ;; TODO: Remove this function in favor of `alter-files`
 ;; TODO: Remove this function in favor of `alter-files`
 (defn alter-file
 (defn alter-file
   [repo path content {:keys [reset? re-render-root? from-disk? skip-compare? new-graph?]
   [repo path content {:keys [reset? re-render-root? from-disk? skip-compare? new-graph?]
@@ -184,7 +184,8 @@
           (db/transact! repo
           (db/transact! repo
             [[:db/retract page-id :block/alias]
             [[:db/retract page-id :block/alias]
              [:db/retract page-id :block/tags]]))
              [:db/retract page-id :block/tags]]))
-        (reset-file! repo path content new-graph?))
+        (reset-file! repo path content {:new-graph? new-graph?
+                                        :from-disk? from-disk?}))
       (db/set-file-content! repo path content))
       (db/set-file-content! repo path content))
     (util/p-handle (write-file!)
     (util/p-handle (write-file!)
                    (fn [_]
                    (fn [_]

+ 11 - 7
src/main/frontend/modules/outliner/datascript.cljc

@@ -8,7 +8,8 @@
                      [frontend.state :as state]
                      [frontend.state :as state]
                      [frontend.config :as config]
                      [frontend.config :as config]
                      [logseq.graph-parser.util :as gp-util]
                      [logseq.graph-parser.util :as gp-util]
-                     [lambdaisland.glogi :as log])))
+                     [lambdaisland.glogi :as log]
+                     [frontend.search :as search])))
 
 
 #?(:cljs
 #?(:cljs
    (defn new-outliner-txs-state [] (atom [])))
    (defn new-outliner-txs-state [] (atom [])))
@@ -22,9 +23,14 @@
 
 
 #?(:cljs
 #?(:cljs
    (defn after-transact-pipelines
    (defn after-transact-pipelines
-     [{:keys [_db-before _db-after _tx-data _tempids _tx-meta] :as tx-report}]
-     (pipelines/invoke-hooks tx-report)
-     (undo-redo/listen-outliner-operation tx-report)))
+     [repo {:keys [_db-before _db-after _tx-data _tempids tx-meta] :as tx-report}]
+     (when-not config/test?
+       (pipelines/invoke-hooks tx-report)
+
+       (when (:outliner/transact? tx-meta)
+         (undo-redo/listen-outliner-operation tx-report))
+
+       (search/sync-search-indice! repo tx-report))))
 
 
 #?(:cljs
 #?(:cljs
    (defn- remove-nil-from-transaction
    (defn- remove-nil-from-transaction
@@ -54,7 +60,7 @@
                  conn (conn/get-db repo false)
                  conn (conn/get-db repo false)
                  editor-cursor (state/get-current-edit-block-and-position)
                  editor-cursor (state/get-current-edit-block-and-position)
                  meta (merge opts {:editor-cursor editor-cursor})
                  meta (merge opts {:editor-cursor editor-cursor})
-                 rs (d/transact! conn txs meta)]
+                 rs (d/transact! conn txs (assoc meta :outliner/transact? true))]
              (when true                 ; TODO: add debug flag
              (when true                 ; TODO: add debug flag
                (let [eids (distinct (mapv first (:tx-data rs)))
                (let [eids (distinct (mapv first (:tx-data rs)))
                      left&parent-list (->>
                      left&parent-list (->>
@@ -66,8 +72,6 @@
                                        (vec)
                                        (vec)
                                        (map next))]
                                        (map next))]
                  (assert (= (count left&parent-list) (count (distinct left&parent-list))) eids)))
                  (assert (= (count left&parent-list) (count (distinct left&parent-list))) eids)))
-             (when-not config/test?
-               (after-transact-pipelines rs))
              rs)
              rs)
            (catch js/Error e
            (catch js/Error e
              (log/error :exception e)
              (log/error :exception e)

+ 3 - 2
src/main/frontend/modules/outliner/pipeline.cljs

@@ -4,13 +4,14 @@
             [frontend.state :as state]))
             [frontend.state :as state]))
 
 
 (defn updated-page-hook
 (defn updated-page-hook
-  [page]
+  [_tx-report page]
   (file/sync-to-file page))
   (file/sync-to-file page))
 
 
 (defn invoke-hooks
 (defn invoke-hooks
   [tx-report]
   [tx-report]
   (let [{:keys [pages blocks]} (ds-report/get-blocks-and-pages tx-report)]
   (let [{:keys [pages blocks]} (ds-report/get-blocks-and-pages tx-report)]
-    (doseq [p (seq pages)] (updated-page-hook p))
+    (when-not (:from-disk? (:tx-meta tx-report))
+      (doseq [p (seq pages)] (updated-page-hook tx-report p)))
     (when (and state/lsp-enabled? (seq blocks))
     (when (and state/lsp-enabled? (seq blocks))
       (state/pub-event! [:plugin/hook-db-tx
       (state/pub-event! [:plugin/hook-db-tx
                          {:blocks  blocks
                          {:blocks  blocks

+ 7 - 3
src/main/frontend/search.cljs

@@ -162,9 +162,13 @@
          (vec (select-keys templates result)))))))
          (vec (select-keys templates result)))))))
 
 
 (defn sync-search-indice!
 (defn sync-search-indice!
-  [datoms]
-  (when (seq datoms)
-    (when-let [repo (state/get-current-repo)]
+  [repo tx-report]
+  (let [data (:tx-data tx-report)
+        datoms (filter
+                (fn [datom]
+                  (contains? #{:block/name :block/content} (:a datom)))
+                data)]
+    (when (seq datoms)
       (let [datoms (group-by :a datoms)
       (let [datoms (group-by :a datoms)
             pages (:block/name datoms)
             pages (:block/name datoms)
             blocks (:block/content datoms)]
             blocks (:block/content datoms)]