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

fix: two bugs caused by not getting correct

closed value names for page/date closed values - one in
query builder property value dropdown and the other in show block data command.
Also cleaned up query-dsl which shouldn't be making db graph queries
on file graphs
Gabriel Horner 1 год назад
Родитель
Сommit
79fccaa659

+ 9 - 7
deps/db/src/logseq/db/frontend/property.cljs

@@ -202,15 +202,17 @@
   (when-let [property (get-property db property-name)]
     (get-in property [:block/schema :values])))
 
+(defn closed-value-name
+  "Gets name of closed value given closed value ent/map. Works for all closed value types including pages"
+  [ent]
+  (or (:block/original-name ent) (get-in ent [:block/schema :value])))
+
 (defn get-closed-value-entity-by-name
+  "Given a property, finds one of its closed values by name or nil if none
+  found. Works for all closed value types"
   [db property-name value-name]
   (let [values (get-closed-property-values db property-name)]
     (some (fn [id]
             (let [e (d/entity db [:block/uuid id])]
-              (when (= (get-in e [:block/schema :value]) value-name)
-                e))) values)))
-
-(defn closed-value-name
-  "Gets name of closed value given closed value ent/map. Works for all closed value types including pages"
-  [ent]
-  (or (:block/original-name ent) (get-in ent [:block/schema :value])))
+              (when (= (closed-value-name e) value-name)
+                e))) values)))

+ 5 - 6
src/main/frontend/db/async.cljs

@@ -17,7 +17,8 @@
             [cljs-time.core :as t]
             [cljs-time.format :as tf]
             [logseq.db :as ldb]
-            [frontend.handler.property.util :as pu]))
+            [frontend.handler.property.util :as pu]
+            [logseq.db.frontend.property :as db-property]))
 
 (def <q db-async-util/<q)
 (def <pull db-async-util/<pull)
@@ -97,7 +98,8 @@
            (map (fn [[prop-type v]] [prop-type (if (coll? v) v [v])]))
            (mapcat (fn [[prop-type vals]]
                      (let [result (if closed-values?
-                                    vals
+                                    (map #(db-property/closed-value-name (db-utils/entity graph [:block/uuid %]))
+                                         vals)
                                     (case prop-type
                                       :default
                                       ;; Remove multi-block properties as there isn't a supported approach to query them yet
@@ -109,10 +111,7 @@
                                       vals
                                       ;; Checkboxes returned as strings as builder doesn't display boolean values correctly
                                       (map str vals)))]
-                       (map (fn [value]
-                              (if (uuid? value)
-                                (get-in (db-utils/entity graph [:block/uuid value]) [:block/schema :value])
-                                value)) result))))
+                       result)))
            ;; Remove blanks as they match on everything
            (remove string/blank?)
            (distinct)

+ 10 - 19
src/main/frontend/db/query_dsl.cljs

@@ -21,7 +21,6 @@
             [frontend.util.text :as text-util]
             [frontend.util :as util]
             [frontend.config :as config]
-            [frontend.state :as state]
             [logseq.db.frontend.property :as db-property]))
 
 
@@ -258,30 +257,21 @@
       result)))
 
 (defn- ->keyword-property
+  "Case-insensitive property names for users that manually type queries to enter them as they appear"
   [property-name]
-  (let [repo (state/get-current-repo)]
-    (if (config/db-based-graph? repo)
-      (string/lower-case (str property-name))
-      (keyword property-name))))
+  (keyword (string/lower-case (str property-name))))
 
 (defn- build-property-two-arg
-  [e]
+  [e {:keys [db-graph?]}]
   (let [k (string/replace (name (nth e 1)) "_" "-")
         v (nth e 2)
         v (if-not (nil? v)
             (parse-property-value (str v))
             v)
         v (if (coll? v) (first v) v)
-        property (db-property/get-property (conn/get-db) k)
-        values (get-in property [:block/schema :values])
-        v' (if (seq values)             ; closed values
-             (or
-              (some #(when-let [closed-value (db-property/closed-value-name (db-utils/entity [:block/uuid %]))]
-                       (when (= v closed-value)
-                         %))
-                    values)
-              ;; rule needs a non nil value to not error
-              "_stub_value_so_that_query_doesnt_error_")
+        v' (if-let [closed-value (and db-graph?
+                                      (db-property/get-closed-value-entity-by-name (conn/get-db) k v))]
+             (:block/uuid closed-value)
              v)]
     {:query (list 'property '?b (->keyword-property k) v')
      :rules [:property]}))
@@ -292,10 +282,10 @@
     {:query (list 'has-property '?b (->keyword-property k))
      :rules [:has-property]}))
 
-(defn- build-property [e]
+(defn- build-property [e env]
   (cond
     (= 3 (count e))
-    (build-property-two-arg e)
+    (build-property-two-arg e env)
 
     (= 2 (count e))
     (build-property-one-arg e)))
@@ -436,7 +426,7 @@ Some bindings in this fn:
        (build-between e)
 
        (= 'property fe)
-       (build-property e)
+       (build-property e env)
 
        ;; task is the new name and todo is the old one
        (or (= 'todo fe) (= 'task fe))
@@ -556,6 +546,7 @@ Some bindings in this fn:
           {result :query rules :rules}
           (when form (build-query form {:sort-by sort-by
                                         :blocks? blocks?
+                                        :db-graph? db-graph?
                                         :sample sample}))
           result' (when (seq result)
                     (let [key (if (coll? (first result))

+ 6 - 3
src/main/frontend/handler/common/developer.cljs

@@ -16,6 +16,10 @@
 (defn show-entity-data
   [& pull-args]
   (let [result* (apply db/pull pull-args)
+        ;; handles page uuids and closed values w/o knowing type
+        get-uuid-prop-value (fn [v]
+                              (or (db-pu/get-property-name v)
+                                  (get-in (db/entity [:block/uuid v]) [:block/schema :value])))
         result (cond-> result*
                  (and (seq (:block/properties result*)) (config/db-based-graph? (state/get-current-repo)))
                  (assoc :block.debug/properties
@@ -24,10 +28,9 @@
                                     [k
                                      (cond
                                        (and (set? v) (uuid? (first v)))
-                                       (set (map db-pu/get-property-name v))
+                                       (set (map get-uuid-prop-value v))
                                        (uuid? v)
-                                       (or (db-pu/get-property-name v)
-                                           (get-in (db/entity [:block/uuid v]) [:block/schema :value]))
+                                       (get-uuid-prop-value v)
                                        :else
                                        v)]))
                              (into {})))