瀏覽代碼

Add timestamp support to sort-by for db graphs

Gabriel Horner 2 年之前
父節點
當前提交
81ae67cdbe
共有 3 個文件被更改,包括 38 次插入27 次删除
  1. 17 7
      src/main/frontend/db/query_dsl.cljs
  2. 3 4
      src/test/frontend/db/query_dsl_test.cljs
  3. 18 16
      src/test/frontend/test/helper.cljs

+ 17 - 7
src/main/frontend/db/query_dsl.cljs

@@ -344,9 +344,9 @@
                 :desc)
         comp (if (= order :desc) >= <=)]
     (reset! sort-by_
-            (fn sort-results [result block-attribute]
+            (fn sort-results [result property-val-fn]
               ;; first because there is one binding result in query-wrapper
-              (sort-by #(-> % first (get-in [block-attribute k]))
+              (sort-by #(-> % first (property-val-fn k))
                        comp
                        result)))
     ;; blank b/c this post-process filter doesn't effect query
@@ -612,6 +612,15 @@ Some bindings in this fn:
            col))
     col))
 
+(defn get-db-property-value
+  "Fetch a property's value given a block map and proeprty name. Similar to
+  query-table/sort-by-fn. We should standardize this soon"
+  [m prop]
+  (case prop
+    :created-at (:block/created-at m)
+    :updated-at (:block/updated-at m)
+    (get-in m [:block/properties-by-name prop])))
+
 (defn query
   "Runs a dsl query with query as a string. Primary use is from '{{query }}'"
   ([repo query-string]
@@ -626,8 +635,8 @@ Some bindings in this fn:
                                 identity)
                sort-by' (if sort-by
                           (if (config/db-based-graph? repo)
-                            (comp (fn [col] (sort-by col :block/properties-by-name)) sort-by-prep)
-                            #(sort-by % :block/properties))
+                            (comp (fn [col] (sort-by col get-db-property-value)) sort-by-prep)
+                            #(sort-by % (fn [m prop] (get-in m [:block/properties prop]))))
                           identity)
                transform-fn (comp sort-by' random-samples)]
            (query-react/react-query repo
@@ -654,9 +663,10 @@ Some bindings in this fn:
                                  (merge
                                   query-opts
                                   (when sort-by
-                                    {:transform-fn (if (config/db-based-graph? repo)
-                                                     (comp (fn [col] (sort-by col :block/properties-by-name)) sort-by-prep)
-                                                     #(sort-by % :block/properties))})))))))
+                                    {:transform-fn
+                                    (if (config/db-based-graph? repo)
+                                                     (comp (fn [col] (sort-by col get-db-property-value)) sort-by-prep)
+                                                     #(sort-by % (fn [m prop] (get-in m [:block/properties prop]))))})))))))
 
 (defn query-contains-filter?
   [query filter-name]

+ 3 - 4
src/test/frontend/db/query_dsl_test.cljs

@@ -518,10 +518,10 @@ created-at:: 1608968448116
       "Query with rule that can't be derived from the form itself"))
 
 (if js/process.env.DB_GRAPH
-  (def get-property-value  #(get-in %1 [:block/properties-by-name %2]))
+  (def get-property-value query-dsl/get-db-property-value)
   (def get-property-value  #(get-in %1 [:block/properties %2])))
 
-(deftest ^:focus2 sort-by-queries
+(deftest sort-by-queries
   (load-test-files [{:file/path "journals/2020_02_25.md"
                      :file/content "rating:: 10"}
                     {:file/path "journals/2020_12_26.md"
@@ -539,8 +539,7 @@ created-at:: 1608968448116
 "}])
   (testing "sort-by user block property fruit"
     (let [result (->> (dsl-query "(and (task now later done) (sort-by fruit))")
-                      (map #(get-property-value % :fruit))
-                      #_set)]
+                      (map #(get-property-value % :fruit)))]
       (is (= ["plum" "apple" nil]
              result)
           "sort-by correctly defaults to desc"))

+ 18 - 16
src/test/frontend/test/helper.cljs

@@ -149,22 +149,24 @@
            (fn [file]
              (map
               (fn [{:keys [name-or-content properties page-properties?]}]
-                {:block/uuid (if page-properties?
-                               (or (page-name-map name-or-content)
-                                   (throw (ex-info "No uuid for page" {:page-name name-or-content})))
-                               (or (content-uuid-map name-or-content)
-                                   (throw (ex-info "No uuid for content" {:content name-or-content}))))
-                 :block/properties
-                 (->> properties
-                      (map
-                       (fn [[prop-name val]]
-                         [(or (property-uuids prop-name)
-                              (throw (ex-info "No uuid for property" {:name prop-name})))
-                          (if (set? val)
-                            (set (map (fn [p] (or (page-uuids p) (throw (ex-info "No uuid for page" {:name p}))))
-                                      val))
-                            val)]))
-                      (into {}))})
+                (cond-> {:block/uuid (if page-properties?
+                                       (or (page-name-map name-or-content)
+                                           (throw (ex-info "No uuid for page" {:page-name name-or-content})))
+                                       (or (content-uuid-map name-or-content)
+                                           (throw (ex-info "No uuid for content" {:content name-or-content}))))
+                         :block/properties
+                         (->> (dissoc properties :created-at)
+                              (map
+                               (fn [[prop-name val]]
+                                 [(or (property-uuids prop-name)
+                                      (throw (ex-info "No uuid for property" {:name prop-name})))
+                                  (if (set? val)
+                                    (set (map (fn [p] (or (page-uuids p) (throw (ex-info "No uuid for page" {:name p}))))
+                                              val))
+                                    val)]))
+                              (into {}))}
+                  (:created-at properties)
+                  (assoc :block/created-at (:created-at properties))))
               (:file/block-properties file)))
            files)]
       (db/transact! test-db (vec (concat page-tx new-properties-tx block-properties-tx))))))