feat: add (sample n) query

This commit is contained in:
Tienson Qin
2021-09-29 18:50:05 +08:00
parent 7a6b4a7b36
commit 5dee92f95b

View File

@@ -144,7 +144,7 @@
(defn build-query
([repo e env]
(build-query repo e (assoc env :vars (atom {})) 0))
([repo e {:keys [sort-by blocks? counter current-filter vars] :as env} level]
([repo e {:keys [sort-by blocks? sample counter current-filter vars] :as env} level]
;; TODO: replace with multi-methods for extensibility.
(let [fe (first e)
page-ref? (text/page-ref? e)]
@@ -365,6 +365,12 @@
(= 'all-page-tags fe)
[['?e :block/tags '?p]]
(= 'sample fe)
(when-let [num (second e)]
(when (integer? num)
(reset! sample num))
nil)
:else
nil))))
@@ -417,9 +423,11 @@
(str form)
(let [sort-by (atom nil)
blocks? (atom nil)
sample (atom nil)
result (when form (build-query repo form {:sort-by sort-by
:blocks? blocks?
:counter counter}))]
:counter counter
:sample sample}))]
(cond
(and (nil? result) (string? form))
form
@@ -429,18 +437,19 @@
:else
(let [result (when (seq result)
(let [key (if (coll? (first result))
(keyword (ffirst result))
(keyword (first result)))
result (case key
:and
(rest result)
(let [key (if (coll? (first result))
(keyword (ffirst result))
(keyword (first result)))
result (case key
:and
(rest result)
result)]
(add-bindings! result)))]
{:query result
:sort-by @sort-by
:blocks? (boolean @blocks?)})))))
result)]
(add-bindings! result)))]
{:query result
:sort-by @sort-by
:blocks? (boolean @blocks?)
:sample sample})))))
(catch js/Error e
(log/error :query-dsl/parse-error e))))))
@@ -449,19 +458,24 @@
(when (string? query-string)
(let [query-string (template/resolve-dynamic-template! query-string)]
(when-not (string/blank? query-string)
(let [{:keys [query sort-by blocks?] :as result} (parse repo query-string)]
(let [{:keys [query sort-by blocks? sample] :as result} (parse repo query-string)]
(if (and (string? result) (not (string/includes? result " ")))
(if (= "\"" (first result) (last result))
(subs result 1 (dec (count result)))
result)
(when-let [query (query-wrapper query blocks?)]
(react/react-query repo
{:query query
:query-string query-string}
(cond->
{:use-cache? false}
sort-by
(assoc :transform-fn sort-by))))))))))
(let [result (react/react-query repo
{:query query
:query-string query-string}
(cond->
{:use-cache? false}
sort-by
(assoc :transform-fn sort-by)))]
(if @sample
(do
(swap! result (fn [col] (take @sample (shuffle col))))
result)
result)))))))))
(defn custom-query
[repo query-m query-opts]