Просмотр исходного кода

Merge branch 'feat/db' into enhance/code-type-block

charlie 1 год назад
Родитель
Сommit
4ae499362a

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

@@ -21,38 +21,6 @@
             [logseq.common.util.namespace :as ns-util])
   (:refer-clojure :exclude [object?]))
 
-;; Use it as an input argument for datalog queries
-(def block-attrs
-  '[:db/id
-    :block/uuid
-    :block/parent
-    :block/order
-    :block/collapsed?
-    :block/format
-    :block/refs
-    :block/_refs
-    :block/path-refs
-    :block/tags
-    :block/link
-    :block/title
-    :block/marker
-    :block/priority
-    :block/properties
-    :block/properties-order
-    :block/properties-text-values
-    :block/pre-block?
-    :block/scheduled
-    :block/deadline
-    :block/repeated?
-    :block/created-at
-    :block/updated-at
-    ;; TODO: remove this in later releases
-    :block/heading-level
-    :block/file
-    :logseq.property/parent
-    {:block/page [:db/id :block/name :block/title :block/journal-day]}
-    {:block/_parent ...}])
-
 (defonce *transact-fn (atom nil))
 (defn register-transact-fn!
   [f]

+ 1 - 1
src/main/frontend/commands.cljs

@@ -142,7 +142,7 @@
   []
   [[:editor/input "" {:last-pattern command-trigger}]
    [:editor/set-property :block/tags :logseq.class/Query]
-   [:editor/set-property :logseq.property/query ""]])
+   [:editor/exit]])
 
 (defn file-based-query
   []

+ 2 - 2
src/main/frontend/components/query.cljs

@@ -131,8 +131,8 @@
   (let [collapsed?' (:collapsed? config)
         result' (rum/react *result)]
     (when (seq result')
-      (let [result (when *result (query-result/get-query-result config q result'))
-        ;; Args for displaying query header and results
+      (let [result (when *result (query-result/transform-query-result config q result'))
+            ;; Args for displaying query header and results
             view-fn (if (keyword? view) (get-in (state/sub-config) [:query/views view]) view)
             view-f (and view-fn (sci/eval-string (pr-str view-fn)))
             page-list? (and (seq result) (some? (:block/name (first result))))

+ 5 - 4
src/main/frontend/components/query/result.cljs

@@ -43,7 +43,9 @@
             (set-result! (query-dsl/query (state/get-current-repo) q {:cards? (:cards? config)}))))
 
         :else
-        (set-result! (query-custom/custom-query query {:current-block-uuid current-block-uuid})))
+        (set-result! (query-custom/custom-query query {:current-block-uuid current-block-uuid
+                                                       ;; FIXME: Remove this temporary workaround for reactivity not working
+                                                       :use-cache? false})))
       (catch :default e
         (reset! *query-error e)))))
 
@@ -55,9 +57,8 @@
          (and (not result-transform)
               (not (and (string? query) (string/includes? query "(by-page false)")))))))
 
-(defn get-query-result
-  "Fetches a query's result, transforms it as needed and saves the result into
-  an atom that is passed in as an argument"
+(defn transform-query-result
+  "Transforms a query result if query conditions and config indicate a transformation"
   [{:keys [current-block-uuid table?] :as config} query-m query-result]
   (let [;; exclude the current one, otherwise it'll loop forever
         remove-blocks (if current-block-uuid [current-block-uuid] nil)

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

@@ -239,7 +239,7 @@
                                         [(>= ?d ?day)])]
                              date
                              future-day
-                             db-model/block-attrs)]
+                             db-model/file-graph-block-attrs)]
             (->> result
                  db-model/sort-by-order-recursive
                  db-utils/group-by-page)))))))

+ 32 - 2
src/main/frontend/db/model.cljs

@@ -23,7 +23,37 @@
 ;; TODO: extract to specific models and move data transform logic to the
 ;; corresponding handlers.
 
-(def block-attrs ldb/block-attrs)
+(def file-graph-block-attrs
+  "In file graphs, use it to replace '*' for datalog queries"
+  '[:db/id
+    :block/uuid
+    :block/parent
+    :block/order
+    :block/collapsed?
+    :block/format
+    :block/refs
+    :block/_refs
+    :block/path-refs
+    :block/tags
+    :block/link
+    :block/title
+    :block/marker
+    :block/priority
+    :block/properties
+    :block/properties-order
+    :block/properties-text-values
+    :block/pre-block?
+    :block/scheduled
+    :block/deadline
+    :block/repeated?
+    :block/created-at
+    :block/updated-at
+    ;; TODO: remove this in later releases
+    :block/heading-level
+    :block/file
+    :logseq.property/parent
+    {:block/page [:db/id :block/name :block/title :block/journal-day]}
+    {:block/_parent ...}])
 
 (def hidden-page? ldb/hidden?)
 
@@ -587,7 +617,7 @@ independent of format as format specific heading characters are stripped"
              [?block :block/path-refs ?ref-page]]
            db
            pages
-           (butlast block-attrs))
+           (butlast file-graph-block-attrs))
           (remove (fn [block] (= page-id (:db/id (:block/page block)))))
           db-utils/group-by-page
           (map (fn [[k blocks]]

+ 4 - 3
src/main/frontend/db/query_custom.cljs

@@ -12,7 +12,7 @@
 ;; FIXME: what if users want to query other attributes than block-attrs?
 (defn- replace-star-with-block-attrs!
   [l]
-  (let [block-attrs (butlast model/block-attrs)]
+  (let [block-attrs (butlast model/file-graph-block-attrs)]
     (walk/postwalk
     (fn [f]
       (if (and (list? f)
@@ -73,12 +73,13 @@
   ([query query-opts]
    (custom-query (state/get-current-repo) query query-opts))
   ([repo query query-opts]
-   (let [query' (replace-star-with-block-attrs! query)
+   (let [db-graph? (config/db-based-graph? repo)
+         query' (if db-graph? query (replace-star-with-block-attrs! query))
          query-opts (if (:query-string query-opts) query-opts
                         (assoc query-opts :query-string (str query)))]
      (if (or (list? (:query query'))
              (not= :find (first (:query query')))) ; dsl query
        (query-dsl/custom-query repo query' query-opts)
        (query-react/react-query repo
-                                (add-rules-to-query query' {:db-graph? (config/db-based-graph? repo)})
+                                (add-rules-to-query query' {:db-graph? db-graph?})
                                 query-opts)))))

+ 1 - 1
src/main/frontend/db/query_dsl.cljs

@@ -606,7 +606,7 @@ Some bindings in this fn:
 
 (defn query-wrapper
   [where {:keys [blocks? block-attrs]}]
-  (let [block-attrs (or block-attrs (butlast model/block-attrs))
+  (let [block-attrs (or block-attrs (butlast model/file-graph-block-attrs))
         q (if blocks?                   ; FIXME: it doesn't need to be either blocks or pages
             `[:find (~'pull ~'?b ~block-attrs)
               :in ~'$ ~'%

+ 24 - 32
src/test/frontend/components/query/result_test.cljs

@@ -1,22 +1,14 @@
 (ns frontend.components.query.result-test
   (:require [clojure.test :refer [deftest are testing is]]
-            [rum.core :as rum]
-            [frontend.db.query-custom :as query-custom]
             [frontend.db.model :as model]
             [frontend.components.query.result :as query-result]))
 
-(defn- mock-get-query-result
-  "Mocks get-query-result assuming custom queries are being tested. Db calls are
-  mocked to minimize setup"
-  [result query-m {:keys [table? current-block-uuid config] :or {config {}}}]
-  (with-redefs [query-custom/custom-query (constantly (atom result))
-                model/with-pages identity]
-    (binding [rum/*reactions* (volatile! #{})]
-      (#'query-result/get-query-result (assoc config :table? table? :current-block-uuid current-block-uuid
-                                              :*query-error (atom nil))
-                                       query-m))))
+(defn- transform-query-result
+  [config query-m result]
+  (with-redefs [model/with-pages identity]
+    (query-result/transform-query-result config query-m result)))
 
-(deftest ^:fix-me get-query-result-with-transforms-and-grouping
+(deftest transform-query-result-with-transforms-and-grouping
   (let [result (mapv
                 #(assoc % :block/page {:db/id 1} :block/parent {:db/id 2})
                 [{:block/uuid (random-uuid) :block/scheduled 20230418}
@@ -25,63 +17,63 @@
         sorted-result (sort-by :block/scheduled result)]
     (testing "For list view"
       (are [query-m expected]
-           (= expected (mock-get-query-result result query-m {:table? false}))
+           (= expected (transform-query-result {:table? false} query-m result))
 
-           ;; Default list behavior is to group result
+        ;; Default list behavior is to group result
         {}
         {{:db/id 1} result}
 
-           ;; User overrides default behavior to return result
+        ;; User overrides default behavior to return result
         {:group-by-page? false}
         result
 
-           ;; Return transformed result for list view
+        ;; Return transformed result for list view
         {:result-transform '(partial sort-by :block/scheduled)}
         sorted-result
 
-           ; User overrides transform to return grouped result
+        ; User overrides transform to return grouped result
         {:result-transform '(partial sort-by :block/scheduled) :group-by-page? true}
         {{:db/id 1} sorted-result})
 
       (testing "For table view"
         (are [query expected]
-             (= expected (mock-get-query-result result query {:table? true}))
+             (= expected (transform-query-result {:table? true} query result))
 
-             ;; Default table behavior is to return result
+          ;; Default table behavior is to return result
           {}
           result
 
-             ;; Return transformed result
+          ;; Return transformed result
           {:result-transform '(partial sort-by :block/scheduled)}
           sorted-result
 
-             ;; Ignore override and return normal result
+          ;; Ignore override and return normal result
           {:group-by-page? true}
           result))
 
       (testing "current block in results"
         (is (= result
                (let [current-block {:block/uuid (random-uuid) :block/scheduled 20230420 :block/page {:db/id 1}}]
-                 (mock-get-query-result (conj result current-block)
-                                        {:group-by-page? false}
-                                        {:table? false
-                                         :current-block-uuid (:block/uuid current-block)})))
+                 (transform-query-result {:table? false
+                                          :current-block-uuid (:block/uuid current-block)}
+                                         {:group-by-page? false}
+                                         (conj result current-block))))
             "Current block is not included in results")))))
 
-(deftest ^:fix-me get-query-result-with-remove-block-children-option
+(deftest transform-query-result-with-remove-block-children-option
   (let [result [{:db/id 1 :block/title "parent" :block/uuid 1}
                 {:db/id 2 :block/title "child" :block/uuid 2 :block/parent {:db/id 1}}]]
     (is (= [{:db/id 1 :block/title "parent" :block/uuid 1}]
-           (mock-get-query-result result {:remove-block-children? true} {:table? true}))
+           (transform-query-result {:table? true} {:remove-block-children? true} result))
         "Removes children when :remove-block-children? is true")
     (is (= result
-           (mock-get-query-result result {:remove-block-children? false} {:table? true}))
+           (transform-query-result {:table? true} {:remove-block-children? false} result))
         "Doesn't remove children when :remove-block-children? is false")))
 
-(deftest ^:fix-me get-query-result-sets-result-in-config
+(deftest transform-query-result-sets-result-in-config
   (let [result [{:db/id 1 :block/title "parent" :block/uuid 1}]
-        config {:query-result (atom nil)}]
+        config {:query-result (atom nil) :table? true}]
     (is (= result
-           (mock-get-query-result result {} {:table? true :config config})))
+           (transform-query-result config {} result)))
     (is (= result @(:query-result config))
         "Result is set in config for downstream use e.g. query table fn")))