Browse Source

fix: query result now showing when :db/id is not specified

fix https://github.com/logseq/db-test/issues/510
Tienson Qin 6 days ago
parent
commit
7d39b510dd

+ 10 - 4
deps/db/src/logseq/db/common/view.cljs

@@ -421,11 +421,17 @@
      (common-util/distinct-by :label))))
 
 (defn- get-query-properties
-  [entities]
-  (distinct (mapcat keys entities)))
+  [query entities]
+  (let [properties (when (and (coll? query) (= :find (first query)))
+                     (let [expr (second query)]
+                       (when (= 'pull (first expr))
+                         (last expr))))]
+    (if (and (seq properties) (not= properties ['*]))
+      properties
+      (distinct (mapcat keys entities)))))
 
 (defn ^:api ^:large-vars/cleanup-todo get-view-data
-  [db view-id {:keys [journals? _view-for-id view-feature-type group-by-property-ident input query-entity-ids filters sorting]
+  [db view-id {:keys [journals? _view-for-id view-feature-type group-by-property-ident input query-entity-ids query filters sorting]
                :as opts}]
   ;; TODO: create a view for journals maybe?
   (cond
@@ -537,4 +543,4 @@
         (= feat-type :linked-references)
         (merge (select-keys entities-result [:ref-pages-count :ref-matched-children-ids]))
         query?
-        (assoc :properties (get-query-properties entities-result))))))
+        (assoc :properties (get-query-properties query entities-result))))))

+ 5 - 3
src/main/frontend/components/query.cljs

@@ -61,9 +61,11 @@
            (util/hiccup-keywordize result))
 
          (and db-graph? (not (:built-in-query? config)))
-         (when-let [query (:logseq.property/query current-block)]
-           (when-not (string/blank? (:block/title query))
-             (query-view/query-result (assoc config :id (str (:block/uuid current-block)))
+         (when-let [query-block (:logseq.property/query current-block)]
+           (when-not (string/blank? (:block/title query-block))
+             (query-view/query-result (assoc config
+                                             :id (str (:block/uuid current-block))
+                                             :query query)
                                       current-block result)))
 
          (and (not db-graph?)

+ 1 - 0
src/main/frontend/components/query/view.cljs

@@ -37,4 +37,5 @@
        :view-feature-type :query-result
        :data ids
        :set-data! set-data!
+       :query (:query config)
        :query-entity-ids ids})]))

+ 33 - 22
src/main/frontend/components/views.cljs

@@ -333,7 +333,7 @@
             (ui/icon "layout-sidebar-right"))]]))]))
 
 (defn build-columns
-  [config properties & {:keys [with-object-name? with-id? add-tags-column?]
+  [config properties & {:keys [with-object-name? with-id? add-tags-column? advanced-query?]
                         :or {with-object-name? true
                              with-id? true
                              add-tags-column? true}}]
@@ -341,7 +341,8 @@
                      (if (or (some #(= (:db/ident %) :block/tags) properties) (not add-tags-column?))
                        properties
                        (conj properties (db/entity :block/tags)))
-                     (remove nil?))]
+                     (remove nil?))
+        property-keys (set (map :db/ident properties'))]
     (->> (concat
           [{:id :select
             :name "Select"
@@ -403,16 +404,20 @@
                     :type (:type property)}))))
            properties')
 
-          [{:id :block/created-at
-            :name (t :page/created-at)
-            :type :datetime
-            :header header-cp
-            :cell timestamp-cell-cp}
-           {:id :block/updated-at
-            :name (t :page/updated-at)
-            :type :datetime
-            :header header-cp
-            :cell timestamp-cell-cp}])
+          [(when (or (not advanced-query?)
+                     (and advanced-query? (property-keys :block/created-at)))
+             {:id :block/created-at
+              :name (t :page/created-at)
+              :type :datetime
+              :header header-cp
+              :cell timestamp-cell-cp})
+           (when (or (not advanced-query?)
+                     (and advanced-query? (property-keys :block/updated-at)))
+             {:id :block/updated-at
+              :name (t :page/updated-at)
+              :type :datetime
+              :header header-cp
+              :cell timestamp-cell-cp})])
          (remove nil?))))
 
 (defn- sort-columns
@@ -2161,15 +2166,19 @@
   (state/<invoke-db-worker :thread-api/get-view-data (state/get-current-repo) (:db/id view) opts))
 
 (defn- get-query-columns
-  [config properties]
-  (->> properties
-       (map db/entity)
-       (remove ldb/hidden?)
-       (ldb/sort-by-order)
-       ((fn [cs] (build-columns config cs {:add-tags-column? false})))))
+  [config view-entity properties]
+  (let [advanced-query? (->> (:logseq.property/query view-entity)
+                             :logseq.property.node/display-type
+                             (= :code))]
+    (->> properties
+         (map db/entity)
+         (remove ldb/hidden?)
+         (ldb/sort-by-order)
+         ((fn [cs] (build-columns config cs {:add-tags-column? false
+                                             :advanced-query? advanced-query?}))))))
 
 (defn- load-view-data-aux
-  [config view-entity view-parent {:keys [query? query-entity-ids sorting filters input
+  [config view-entity view-parent {:keys [query? query query-entity-ids sorting filters input
                                           view-feature-type group-by-property-ident
                                           set-data! set-ref-pages-count! set-ref-matched-children-ids! set-properties! set-loading!]}]
   (c.m/run-task*
@@ -2192,7 +2201,8 @@
                           :filters filters
                           :sorting sorting}
                           query?
-                          (assoc :query-entity-ids query-entity-ids))
+                          (assoc :query-entity-ids query-entity-ids
+                                 :query query))
                    {:keys [data ref-pages-count ref-matched-children-ids properties]}
                    (c.m/<? (<load-view-data view-entity opts))]
                (set-data! data)
@@ -2207,7 +2217,7 @@
                    (reset! *objects-ready? true)))))))))))
 
 (rum/defc view-aux
-  [view-entity {:keys [config view-parent view-feature-type data query-entity-ids set-view-entity!] :as option}]
+  [view-entity {:keys [config view-parent view-feature-type data query-entity-ids query set-view-entity!] :as option}]
   (let [[input set-input!] (hooks/use-state "")
         [properties set-properties!] (hooks/use-state nil)
         db-based? (config/db-based-graph?)
@@ -2234,7 +2244,7 @@
         view-filters (:logseq.property.table/filters view-entity)
         [filters set-filters!] (rum/use-state (or view-filters {}))
         query? (= view-feature-type :query-result)
-        option (if query? (assoc option :columns (get-query-columns config properties)) option)
+        option (if query? (assoc option :columns (get-query-columns config view-entity properties)) option)
         [loading? set-loading!] (hooks/use-state (not query?))
         [data set-data!] (hooks/use-state data)
         [ref-pages-count set-ref-pages-count!] (hooks/use-state nil)
@@ -2242,6 +2252,7 @@
         load-view-data (fn load-view-data []
                          (load-view-data-aux config view-entity view-parent
                                              {:query? query?
+                                              :query query
                                               :query-entity-ids query-entity-ids
                                               :sorting sorting :filters filters :input input
                                               :view-feature-type view-feature-type :group-by-property-ident group-by-property-ident

+ 29 - 7
src/main/frontend/db/async/util.cljs

@@ -1,23 +1,45 @@
 (ns frontend.db.async.util
   "Async util helper"
-  (:require [datascript.core :as d]
+  (:require [clojure.walk :as walk]
+            [datascript.core :as d]
             [frontend.db.conn :as db-conn]
             [frontend.state :as state]
             [promesa.core :as p]))
 
+(defn- transform-pull-query
+  [query]
+  (if (= :find (first query))
+    (walk/postwalk
+     (fn [f]
+       (cond
+         (and (keyword? f) (= f :block/content))
+         :block/title
+
+         (and (list? f) (= 'pull (first f)) (vector? (last f)) (not-any? #{:db/id} f))
+         (list 'pull (second f) (conj (last f) :db/id))
+
+         :else
+         f))
+     query)
+    query))
+
 (defn <q
-  [graph {:keys [transact-db?]
+  [graph {:keys [transact-db? advanced-query?]
           :or {transact-db? true}
           :as opts} & inputs]
   (assert (not-any? fn? inputs) "Async query inputs can't include fns because fn can't be serialized")
   (let [*async-queries (:db/async-queries @state/state)
-        async-requested? (get @*async-queries [inputs opts])]
+        async-requested? (get @*async-queries [inputs opts])
+        inputs' (if advanced-query?
+                  (cons (transform-pull-query (first inputs))
+                        (rest inputs))
+                  inputs)]
     (if (and async-requested? transact-db?)
       (p/promise
        (let [db (db-conn/get-db graph)]
-         (apply d/q (first inputs) db (rest inputs))))
-      (p/let [result (state/<invoke-db-worker :thread-api/q graph inputs)]
-        (swap! *async-queries assoc [inputs opts] true)
+         (apply d/q (first inputs') db (rest inputs'))))
+      (p/let [result (state/<invoke-db-worker :thread-api/q graph inputs')]
+        (swap! *async-queries assoc [inputs' opts] true)
         (when result
           (when (and transact-db? (seq result) (coll? result))
             (when-let [conn (db-conn/get-db graph false)]
@@ -33,7 +55,7 @@
                     (catch :default e
                       (js/console.error "<q failed with:" e)
                       nil))
-                  (js/console.log "<q skipped tx for inputs:" inputs)))))
+                  (js/console.log "<q skipped tx for inputs:" inputs')))))
           result)))))
 
 (defn <pull

+ 2 - 1
src/main/frontend/db/react.cljs

@@ -99,7 +99,8 @@
         q (if util/node-test?
             (fn [query inputs] (apply d/q query db inputs))
             (fn [query inputs]
-              (let [q-f #(apply db-async-util/<q repo {:transact-db? false} (cons query inputs))]
+              (let [q-f #(apply db-async-util/<q repo {:transact-db? false
+                                                       :advanced-query? true} (cons query inputs))]
                 (if built-in-query?
                   ;; delay built-in-queries to not block journal rendering
                   (p/let [_ (p/delay 100)]