Browse Source

Async get block and children

Tienson Qin 1 year ago
parent
commit
752f88de19

+ 1 - 0
deps/db/src/logseq/db.cljs

@@ -342,6 +342,7 @@
         parents))))
 
 (defn get-block-children-ids
+  "Returns children UUIDs"
   [db block-uuid]
   (when-let [eid (:db/id (d/entity db [:block/uuid block-uuid]))]
     (let [seen   (volatile! [])]

+ 29 - 1
deps/db/src/logseq/db/sqlite/common_db.cljs

@@ -4,7 +4,9 @@
             ["path" :as node-path]
             [clojure.string :as string]
             [logseq.db.sqlite.util :as sqlite-util]
-            [logseq.common.util.date-time :as date-time-util]))
+            [logseq.db :as ldb]
+            [logseq.common.util.date-time :as date-time-util]
+            [logseq.common.util :as common-util]))
 
 (defn- get-built-in-files
   [db]
@@ -19,6 +21,32 @@
        (map (fn [e]
               (d/pull db '[*] (:e e))))))
 
+(defn get-block-and-children
+  [db name children?]
+  (let [get-children (fn [col]
+                       (map (fn [e]
+                              (select-keys e [:db/id :block/uuid :block/page :block/left :block/parent]))
+                            col))]
+    (if (common-util/uuid-string? name)   ; block
+      (let [id (uuid name)
+            block (d/entity db [:block/uuid id])]
+        (when block
+          (let [result {:block (d/pull db '[*] (:db/id block))}]
+            (if children?
+              (let [children (->> (ldb/get-block-children-ids db id)
+                                  (map #(d/entity db [:block/uuid %])))]
+                (assoc result :children (get-children children)))
+              result))
+          (cond->
+           {:block (d/pull db '[*] (:db/id block))}
+            children?
+            (assoc :children (get-children (:block/_parent block))))))
+      (when-let [block (d/entity db [:block/name name])]
+        (cond->
+         {:block (d/pull db '[*] (:db/id block))}
+          children?
+          (assoc :children (get-children (:block/_page block))))))))
+
 (defn get-latest-journals
   [db n]
   (let [date (js/Date.)

+ 16 - 9
src/main/frontend/components/page.cljs

@@ -48,7 +48,8 @@
             [medley.core :as medley]
             [promesa.core :as p]
             [reitit.frontend.easy :as rfe]
-            [rum.core :as rum]))
+            [rum.core :as rum]
+            [frontend.db.async :as db-async]))
 
 (defn- get-page-name
   [state]
@@ -445,15 +446,16 @@
       (state/get-current-page)))
 
 (defn- get-page-entity
-  [repo path-page-name page-name]
+  [page-name]
   (if-let [block-id (parse-uuid page-name)]
     (let [entity (db/entity [:block/uuid block-id])]
       entity)
-    (do
-      (when-not (db/entity repo [:block/name page-name])
-        (let [m (block/page-name->map path-page-name true)]
-          (db/transact! repo [m])))
-      (db/entity [:block/name page-name]))))
+    (db/entity [:block/name page-name])))
+
+(defn- get-sanity-page-name
+  [state page-name]
+  (when-let [path-page-name (get-path-page-name state page-name)]
+    (util/page-name-sanity-lc path-page-name)))
 
 ;; A page is just a logical block
 (rum/defcs ^:large-vars/cleanup-todo page-inner < rum/reactive db-mixins/query
@@ -461,12 +463,17 @@
   (rum/local false ::control-show?)
   (rum/local nil   ::current-page)
   (rum/local false ::hover-title?)
+  {:init (fn [state]
+           (let [page-name (:page-name (first (:rum/args state)))
+                 page-name' (get-sanity-page-name state page-name)]
+             (db-async/<get-block-and-children (state/get-current-repo) page-name')
+             (assoc state ::page-name page-name')))}
   [state {:keys [repo page-name preview? sidebar?] :as option}]
   (when-let [path-page-name (get-path-page-name state page-name)]
     (let [current-repo (state/sub :git/current-repo)
           repo (or repo current-repo)
           page-name (util/page-name-sanity-lc path-page-name)
-          page (get-page-entity repo path-page-name page-name)
+          page (get-page-entity page-name)
           block-id (:block/uuid page)
           block? (some? (:block/page page))
           journal? (db/journal-page? page-name)
@@ -570,7 +577,7 @@
   (let [path-page-name (get-path-page-name state (:page-name option))
         page-name (util/page-name-sanity-lc path-page-name)
         repo (state/get-current-repo)
-        page (get-page-entity repo path-page-name page-name)
+        page (get-page-entity page-name)
         block? (some? (:block/page page))
         page-unloaded? (or (state/sub-page-unloaded? repo page-name) (nil? page))]
     (if (and page-unloaded? (not block?))

+ 18 - 1
src/main/frontend/db/async.cljs

@@ -8,7 +8,11 @@
             [frontend.util :as util]
             [frontend.db.utils :as db-utils]
             [frontend.db.async.util :as db-async-util]
-            [frontend.db.file-based.async :as file-async]))
+            [frontend.db.file-based.async :as file-async]
+            [frontend.db :as db]
+            [frontend.persist-db.browser :as db-browser]
+            [clojure.edn :as edn]
+            [datascript.core :as d]))
 
 (def <q db-async-util/<q)
 
@@ -98,3 +102,16 @@
   (if (config/db-based-graph? graph)
     (<get-db-based-property-values graph property)
     (file-async/<get-file-based-property-values graph property)))
+
+(defn <get-block-and-children
+  [graph name-or-uuid & {:keys [children?]
+                         :or {children? true}}]
+  (when-let [^Object sqlite @db-browser/*worker]
+    (p/let [name' (str name-or-uuid)
+            result (.get-block-and-children sqlite graph name' children?)
+            {:keys [block children] :as result'} (edn/read-string result)
+            conn (db/get-db graph false)
+            _ (d/transact! conn (cons block children))]
+      (if children?
+        block
+        result'))))

+ 6 - 0
src/main/frontend/db_worker.cljs

@@ -285,6 +285,12 @@
          (let [result (apply d/q (first inputs) @conn (rest inputs))]
            (bean/->js result)))))
 
+  (get-block-and-children
+   [_this repo name children?]
+   (assert (string? name))
+   (when-let [conn (worker-state/get-datascript-conn repo)]
+     (pr-str (sqlite-common-db/get-block-and-children @conn name children?))))
+
   (transact
    [_this repo tx-data tx-meta context]
    (when repo (worker-state/set-db-latest-tx-time! repo))