Просмотр исходного кода

Fix simple queries not working in advanced query - close #4498

Also removed unused repo fn in query-dsl ns and configured custom-query
to throw exception
Gabriel Horner 3 лет назад
Родитель
Сommit
f9cb132482

+ 2 - 1
.clj-kondo/config.edn

@@ -13,7 +13,8 @@
   {:aliases {datascript.core d
              datascript.transit dt
              datascript.db ddb
-             lambdaisland.glogi log}}}
+             lambdaisland.glogi log
+             frontend.db.query-dsl query-dsl}}}
 
  :hooks {:analyze-call {rum.core/defc hooks.rum/defc
                          rum.core/defcs hooks.rum/defcs}}

+ 2 - 2
src/main/frontend/db/query_custom.cljs

@@ -4,7 +4,7 @@
             [clojure.string :as string]
             [cljs.reader :as reader]
             [frontend.db.query-react :as react]
-            [frontend.db.query-dsl :as dsl]
+            [frontend.db.query-dsl :as query-dsl]
             [frontend.db.model :as model]
             [clojure.walk :as walk]))
 
@@ -40,5 +40,5 @@
            query' (replace-star-with-block-attrs! query)]
        (if (or (list? (:query query'))
                (not= :find (first (:query query')))) ; dsl query
-         (dsl/custom-query repo query' query-opts )
+         (query-dsl/custom-query repo query' query-opts)
          (react/react-query repo query' query-opts))))))

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

@@ -13,7 +13,6 @@
             [frontend.template :as template]
             [frontend.text :as text]
             [frontend.util :as util]
-            [frontend.state :as state]
             [lambdaisland.glogi :as log]))
 
 
@@ -169,9 +168,9 @@
 (defonce remove-nil? (partial remove nil?))
 
 (defn- build-and-or-not
-  [repo e {:keys [current-filter vars] :as env} level fe]
+  [e {:keys [current-filter vars] :as env} level fe]
   (let [raw-clauses (map (fn [form]
-                           (build-query repo form (assoc env :current-filter fe) (inc level)))
+                           (build-query form (assoc env :current-filter fe) (inc level)))
                          (rest e))
         clauses (->> raw-clauses
                      (map :query)
@@ -384,9 +383,9 @@ Some bindings in this fn:
 
 * e - the list being processed
 * fe - the query operator e.g. `property`"
-  ([repo e env]
-   (build-query repo e (assoc env :vars (atom {})) 0))
-  ([repo e {:keys [sort-by blocks? sample] :as env} level]
+  ([e env]
+   (build-query e (assoc env :vars (atom {})) 0))
+  ([e {:keys [sort-by blocks? sample] :as env :or {blocks? (atom nil)}} level]
    (let [fe (first e)
          fe (when fe (symbol (string/lower-case (name fe))))
          page-ref? (text/page-ref? e)]
@@ -406,7 +405,7 @@ Some bindings in this fn:
        (build-block-content e)
 
        (contains? #{'and 'or 'not} fe)
-       (build-and-or-not repo e env level fe)
+       (build-and-or-not e env level fe)
 
        (= 'between fe)
        (build-between e)
@@ -503,7 +502,7 @@ Some bindings in this fn:
       q)))
 
 (defn parse
-  [repo s]
+  [s]
   (when (and (string? s)
              (not (string/blank? s)))
     (try
@@ -517,9 +516,9 @@ Some bindings in this fn:
                 blocks? (atom nil)
                 sample (atom nil)
                 {result :query rules :rules}
-                (when form (build-query repo form {:sort-by sort-by
-                                                   :blocks? blocks?
-                                                   :sample sample}))]
+                (when form (build-query form {:sort-by sort-by
+                                              :blocks? blocks?
+                                              :sample sample}))]
             (cond
               (and (nil? result) (string? form))
               form
@@ -566,58 +565,58 @@ Some bindings in this fn:
       result)))
 
 (defn query
-  ([query-string]
-   (query (state/get-current-repo) query-string))
-  ([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 repo query-string)
-               query (if (string? query) (string/trim query) query)
-               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?)]
-               (let [sort-by (or sort-by identity)
-                     random-samples (if @sample
-                                      (fn [col]
-                                        (take @sample (shuffle col)))
-                                      identity)
-                     transform-fn (comp sort-by random-samples)]
-                 (try
-                   (react/react-query repo
-                                      {:query query
-                                       :query-string query-string
-                                       :rules rules
-                                       :throw-exception true}
-                                      {:use-cache? false
-                                       :transform-fn transform-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)))))))))))))
+  "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)
+              query (if (string? query) (string/trim query) query)
+              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?)]
+              (let [sort-by (or sort-by identity)
+                    random-samples (if @sample
+                                     (fn [col]
+                                       (take @sample (shuffle col)))
+                                     identity)
+                    transform-fn (comp sort-by random-samples)]
+                (try
+                  (react/react-query repo
+                                     {:query query
+                                      :query-string query-string
+                                      :rules rules
+                                      :throw-exception true}
+                                     {:use-cache? false
+                                      :transform-fn transform-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))))))))))))
 
 (defn custom-query
+  "Runs a dsl query with query as a seq. Primary use is from advanced query"
   [repo query-m query-opts]
   (when (seq (:query query-m))
-    (let [query-string (pr-str (:query query-m))
-          query-string (template/resolve-dynamic-template! query-string)
-          {:keys [query sort-by blocks?]} (parse repo query-string)
+    (let [query-string (template/resolve-dynamic-template! (pr-str (:query query-m)))
+          {:keys [query sort-by blocks? rules]} (parse query-string)
           query (if (string? query) (string/trim query) query)]
-      (when query
-        (when-let [query (query-wrapper query blocks?)]
-          (react/react-query repo
-                             (merge
-                              query-m
-                              {:query query})
-                             (merge
-                              query-opts
-                              (when sort-by
-                                {:transform-fn sort-by}))))))))
+      (when-let [query (query-wrapper query blocks?)]
+        (react/react-query repo
+                           (merge
+                            query-m
+                            {:query query
+                             :rules rules
+                             :throw-exception true})
+                           (merge
+                            query-opts
+                            (when sort-by
+                              {:transform-fn sort-by})))))))
 
 (comment
   ;; {{query (and (page-property foo bar) [[hello]])}}

+ 1 - 1
src/main/frontend/extensions/srs.cljs

@@ -253,7 +253,7 @@
                        :or {use-cache? true}}]
    (when (string? query-string)
      (let [query-string (template/resolve-dynamic-template! query-string)
-           {:keys [query sort-by]} (query-dsl/parse repo query-string)
+           {:keys [query sort-by]} (query-dsl/parse query-string)
            query* (concat [['?b :block/refs [:block/name card-hash-tag]]]
                           (if (coll? (first query))
                             query

+ 26 - 19
src/test/frontend/db/query_dsl_test.cljs

@@ -3,7 +3,7 @@
             [clojure.string :as str]
             [frontend.db :as db]
             [frontend.db.config :refer [test-db] :as config]
-            [frontend.db.query-dsl :as dsl]
+            [frontend.db.query-dsl :as query-dsl]
             [frontend.handler.repo :as repo-handler]))
 
 ;; TODO: quickcheck
@@ -19,30 +19,22 @@
 (defn- dsl-query
   [s]
   (db/clear-query-state!)
-  (when-let [result (dsl/query test-db s)]
+  (when-let [result (query-dsl/query test-db s)]
     (map first (deref result))))
 
-(def parse (partial dsl/parse test-db))
+(defn- custom-query
+  [query]
+  (db/clear-query-state!)
+  (when-let [result (query-dsl/custom-query test-db query {})]
+    (map first (deref result))))
 
 (defn- q
   [s]
   (db/clear-query-state!)
-  (let [parse-result (parse s)
+  (let [parse-result (query-dsl/parse s)
         query (:query parse-result)]
     {:query (if (seq query) (vec query) query)
-     :result (dsl/query test-db s)}))
-
-(defn q-count
-  [s]
-  (let [{:keys [query result]} (q s)]
-    {:query query
-     :count (if result
-              (count @result)
-              0)}))
-
-(defn count-only
-  [s]
-  (:count (q-count s)))
+     :result (query-dsl/query test-db s)}))
 
 ;; Tests
 ;; =====
@@ -431,7 +423,7 @@ last-modified-at:: 1609084800002"}]]
 (deftest between-queries
   (load-test-files-with-timestamps)
 
-  (are [x y] (= (count-only x) y)
+  (are [x y] (= (count (dsl-query x)) y)
        "(and (task now later done) (between [[Dec 26th, 2020]] tomorrow))"
        5
 
@@ -449,6 +441,21 @@ last-modified-at:: 1609084800002"}]]
        )
   )
 
+(deftest custom-query-test
+  (load-test-files [{:file/path "pages/page1.md"
+                     :file/content "foo:: bar
+- NOW b1
+- TODO b2
+- LATER b3
+- b3"}])
+
+  (is (= ["LATER b3"]
+         (map :block/content (custom-query {:query '(task later)}))))
+
+  (is (= ["LATER b3"]
+         (map :block/content (custom-query {:query (list 'and '(task later) "b")})))
+      "Try"))
+
 #_(deftest sort-by-queries
     (load-test-files-with-timestamps)
     ;; (testing "sort-by (created-at defaults to desc)"
@@ -523,7 +530,7 @@ last-modified-at:: 1609084800002"}]]
  (config/start-test-db!)
  (load-test-files-with-timestamps)
 
- (dsl/query test-db "(task done)")
+ (query-dsl/query test-db "(task done)")
 
  ;; Useful for debugging
  (prn