1
0
Эх сурвалжийг харах

enhance: between support (between :created-at -1d)

So now `between` support:
1. (between start end) to query journal blocks
2. (between :created-at|:updated-at start end)
3. (between :created-at|:updated-at start)
Tienson Qin 1 жил өмнө
parent
commit
35c3dba160

+ 20 - 0
src/main/frontend/components/query/builder.cljs

@@ -473,6 +473,26 @@
              :else
              (last clause)))
 
+      ;; between timestamp start (optional end)
+      (and (= (keyword f) :between) (query-dsl/get-timestamp-property clause))
+      (let [k (query-dsl/get-timestamp-property clause)
+            [_ _property start end] clause
+            start (if (or (keyword? start)
+                          (symbol? start))
+                    (name start)
+                    (second start))
+            end (if (or (keyword? end)
+                        (symbol? end))
+                  (name end)
+                  (second end))]
+        (str (if (= k :block/created-at)
+               "Created"
+               "Updated")
+             " " start
+             (when end
+               (str " ~ " end))))
+
+      ;; between journal start end
       (= (keyword f) :between)
       (let [start (if (or (keyword? (second clause))
                           (symbol? (second clause)))

+ 57 - 20
src/main/frontend/db/query_dsl.cljs

@@ -205,7 +205,27 @@
 
 ;; build-query fns
 ;; ===============
-(defn- build-between-two-arg
+(defn- resolve-timestamp-property
+  [e]
+  (let [k (-> (second e)
+              (name)
+              (string/lower-case)
+              (string/replace "_" "-")
+              keyword)]
+    (case k
+      :created-at
+      :block/created-at
+      :updated-at
+      :block/updated-at
+      k)))
+
+(defn get-timestamp-property
+  [e]
+  (let [k (resolve-timestamp-property e)]
+    (when (contains? #{:block/created-at :block/updated-at} k)
+      k)))
+
+(defn- build-journal-between-two-arg
   [e]
   (let [start (->journal-day-int (nth e 1))
         end (->journal-day-int (nth e 2))
@@ -213,32 +233,49 @@
     {:query (list 'between '?b start end)
      :rules [:between]}))
 
-(defn- build-between-three-arg
+(defn- file-based-build-between-three-arg
   [e]
-  (let [k (-> (second e)
-              (name)
-              (string/lower-case)
-              (string/replace "-" "_"))]
-    (when (contains? #{"created_at" "last_modified_at"} k)
-      (let [start (->timestamp (nth e 2))
-            end (->timestamp (nth e 3))]
-        (when (and start end)
-          (let [[start end] (sort [start end])
-                sym '?v]
-            {:query [['?b :block/properties '?prop]
-                     [(list 'get '?prop k) sym]
-                     [(list '>= sym start)]
-                     [(list '< sym end)]]}))))))
+  (when-let [k (get-timestamp-property e)]
+    (let [start (->timestamp (nth e 2))
+          end (->timestamp (nth e 3))]
+      (when (and start end)
+        (let [[start end] (sort [start end])
+              sym '?v]
+          {:query [['?b :block/properties '?prop]
+                   [(list 'get '?prop k) sym]
+                   [(list '>= sym start)]
+                   [(list '< sym end)]]})))))
+
+(defn- db-based-build-between-three-arg
+  [e]
+  (when-let [k (get-timestamp-property e)]
+    (let [start (->timestamp (nth e 2))
+          end (->timestamp (nth e 3))]
+      (when (and start end)
+        (let [[start end] (sort [start end])
+              sym '?v]
+          {:query [['?b k sym]
+                   [(list '>= sym start)]
+                   [(list '< sym end)]]})))))
+
+(defn- db-based-build-between-two-arg
+  [e]
+  (db-based-build-between-three-arg (concat e ['now])))
 
 (defn- build-between
-  [e]
+  [e db-graph?]
   (cond
     (= 3 (count e))
-    (build-between-two-arg e)
+    (let [k (get-timestamp-property e)]
+      (if (and db-graph? k)
+        (db-based-build-between-two-arg e)
+        (build-journal-between-two-arg e)))
 
     ;; (between created_at -1d today)
     (= 4 (count e))
-    (build-between-three-arg e)))
+    (if db-graph?
+      (db-based-build-between-three-arg e)
+      (file-based-build-between-three-arg e))))
 
 (defn ->file-property-value
   "Parses property values for file graphs and handles non-string values or any page-ref like values"
@@ -467,7 +504,7 @@ Some bindings in this fn:
        (build-and-or-not e env level fe)
 
        (= 'between fe)
-       (build-between e)
+       (build-between e (:db-graph? env))
 
        (= 'property fe)
        (build-property e env)