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)
This commit is contained in:
Tienson Qin
2024-10-10 16:55:58 +08:00
parent 6ce66e6f09
commit 35c3dba160
2 changed files with 77 additions and 20 deletions

View File

@@ -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)