query-dsl + tests cleanup

Remove old string checks that no longer apply. Also added another blank
string case that causes an issue
pull/4573/head
Gabriel Horner 2022-03-10 16:20:26 -05:00 committed by Tienson Qin
parent 5f0efcf2d8
commit 8468602881
2 changed files with 64 additions and 99 deletions

View File

@ -374,6 +374,7 @@ Some bindings in this fn:
([e env]
(build-query e (assoc env :vars (atom {})) 0))
([e {:keys [sort-by blocks? sample] :as env :or {blocks? (atom nil)}} level]
; {:post [(or (nil? %) (map? %))]}
(let [fe (first e)
fe (when fe (symbol (string/lower-case (name fe))))
page-ref? (text/page-ref? e)]
@ -506,16 +507,8 @@ Some bindings in this fn:
{result :query rules :rules}
(when form (build-query form {:sort-by sort-by
:blocks? blocks?
:sample sample}))]
(cond
(and (nil? result) (string? form))
form
(string? result)
(string/trim result)
:else
(let [result (when (seq result)
:sample sample}))
result' (when (seq result)
(let [key (if (coll? (first result))
(keyword (ffirst result))
(keyword (first result)))
@ -525,11 +518,11 @@ Some bindings in this fn:
result)]
(add-bindings! form result)))]
{:query result
{:query result'
:rules (mapv rules/query-dsl-rules rules)
:sort-by @sort-by
:blocks? (boolean @blocks?)
:sample sample})))))
:sample sample})))
(catch js/Error e
(log/error :query-dsl/parse-error e)))))
@ -538,7 +531,6 @@ Some bindings in this fn:
(defn query-wrapper
[where blocks?]
(when where
(let [q (if blocks? ; FIXME: it doesn't need to be either blocks or pages
`[:find (~'pull ~'?b ~model/block-attrs)
:in ~'$ ~'%
@ -550,22 +542,15 @@ Some bindings in this fn:
(apply conj q where)
(conj q where))]
(prn "Datascript query: " result)
result)))
result))
(defn query
"Runs a dsl query with query as a string. Primary use is from '{{query }}'"
[repo query-string]
(when (string? query-string)
(let [query-string (template/resolve-dynamic-template! query-string)]
(when-not (string/blank? query-string)
(let [{:keys [query rules sort-by blocks? sample] :as result} (parse query-string)
full-text-query? (and (string? result)
(not (string/includes? result " ")))]
(if full-text-query?
(if (= "\"" (first result) (last result))
(subs result 1 (dec (count result)))
result)
(when-let [query (query-wrapper query blocks?)]
(when (and (string? query-string) (not= "\"\"" query-string))
(let [query-string' (template/resolve-dynamic-template! query-string)
{:keys [query rules sort-by blocks? sample]} (parse query-string')]
(when-let [query' (some-> query (query-wrapper blocks?))]
(let [sort-by (or sort-by identity)
random-samples (if @sample
(fn [col]
@ -574,7 +559,7 @@ Some bindings in this fn:
transform-fn (comp sort-by random-samples)]
(try
(query-react/react-query repo
{:query query
{:query query'
:query-string query-string
:rules rules}
{:use-cache? false
@ -582,8 +567,8 @@ Some bindings in this fn:
(catch ExceptionInfo e
;; Allow non-existent page queries to be ignored
(if (string/includes? (str (.-message e)) "Nothing found for entity")
(log/error :query-dsl-error e)
(throw e))))))))))))
(log/error :nothing-found-error e)
(throw e)))))))))
(defn custom-query
"Runs a dsl query with query as a seq. Primary use is from advanced query"
@ -591,11 +576,11 @@ Some bindings in this fn:
(when (seq (:query query-m))
(let [query-string (template/resolve-dynamic-template! (pr-str (:query query-m)))
{:keys [query sort-by blocks? rules]} (parse query-string)]
(when-let [query (query-wrapper query blocks?)]
(when-let [query' (some-> query (query-wrapper blocks?))]
(query-react/react-query repo
(merge
query-m
{:query query
{:query query'
:rules rules})
(merge
query-opts

View File

@ -42,14 +42,6 @@
(when-let [result (query-dsl/custom-query test-helper/test-db query {})]
(map first (deref result))))
(defn- q
[s]
(db/clear-query-state!)
(let [parse-result (query-dsl/parse s)
query (:query parse-result)]
{:query (if (seq query) (vec query) query)
:result (query-dsl/query test-helper/test-db s)}))
;; Tests
;; =====
@ -351,17 +343,17 @@ tags: other
"Correctly returns no results"))
(deftest empty-queries
(let [empty-result {:query nil :result nil}]
(testing "nil or blank strings should be ignored"
(are [x y] (= (q x) y)
nil empty-result
"" empty-result
" " empty-result))
(are [x] (nil? (dsl-query x))
nil
""
" "
"\"\""))
(testing "Non exists page should be ignored"
(are [x y] (nil? (:result (q x)))
"[[page-not-exist]]" empty-result
"[[another-page-not-exist]]" empty-result))))
(are [x] (nil? (dsl-query x))
"[[page-not-exist]]"
"[[another-page-not-exist]]")))
(deftest page-ref-and-boolean-queries
(load-test-files [{:file/path "pages/page1.md"
@ -487,60 +479,48 @@ last-modified-at:: 1609084800002"}]]
(load-test-files-with-timestamps)
;; (testing "sort-by (created-at defaults to desc)"
;; (db/clear-query-state!)
;; (let [result (->> (q "(and (task now later done)
;; (let [result (->> (dsl-query "(and (task now later done)
;; (sort-by created-at))")
;; :result
;; deref
;; (map #(get-in % [:block/properties "created-at"])))]
;; (is (= result
;; '(1609052959376 1609052958714 1608968448115 1608968448114 1608968448113)))))
;; (testing "sort-by (created-at desc)"
;; (db/clear-query-state!)
;; (let [result (->> (q "(and (todo now later done)
;; (let [result (->> (dsl-query "(and (todo now later done)
;; (sort-by created-at desc))")
;; :result
;; deref
;; (map #(get-in % [:block/properties "created-at"])))]
;; (is (= result
;; '(1609052959376 1609052958714 1608968448115 1608968448114 1608968448113)))))
;; (testing "sort-by (created-at asc)"
;; (db/clear-query-state!)
;; (let [result (->> (q "(and (todo now later done)
;; (let [result (->> (dsl-query "(and (todo now later done)
;; (sort-by created-at asc))")
;; :result
;; deref
;; (map #(get-in % [:block/properties "created-at"])))]
;; (is (= result
;; '(1608968448113 1608968448114 1608968448115 1609052958714 1609052959376)))))
;; (testing "sort-by (last-modified-at defaults to desc)"
;; (db/clear-query-state!)
;; (let [result (->> (q "(and (todo now later done)
;; (let [result (->> (dsl-query "(and (todo now later done)
;; (sort-by last-modified-at))")
;; :result
;; deref
;; (map #(get-in % [:block/properties "last-modified-at"])))]
;; (is (= result
;; '(1609052974285 1609052958714 1608968448120 1608968448115 1608968448113)))))
;; (testing "sort-by (last-modified-at desc)"
;; (db/clear-query-state!)
;; (let [result (->> (q "(and (todo now later done)
;; (let [result (->> (dsl-query "(and (todo now later done)
;; (sort-by last-modified-at desc))")
;; :result
;; deref
;; (map #(get-in % [:block/properties "last-modified-at"])))]
;; (is (= result
;; '(1609052974285 1609052958714 1608968448120 1608968448115 1608968448113)))))
;; (testing "sort-by (last-modified-at desc)"
;; (db/clear-query-state!)
;; (let [result (->> (q "(and (todo now later done)
;; (let [result (->> (dsl-query "(and (todo now later done)
;; (sort-by last-modified-at asc))")
;; :result
;; deref
;; (map #(get-in % [:block/properties "last-modified-at"])))]
;; (is (= result
;; '(1608968448113 1608968448115 1608968448120 1609052958714 1609052974285)))))