浏览代码

Fix #4007 to allow linked integer page links to match property query

Gabriel Horner 3 年之前
父节点
当前提交
5a126027eb
共有 2 个文件被更改,包括 68 次插入45 次删除
  1. 15 7
      src/main/frontend/db/query_dsl.cljs
  2. 53 38
      src/test/frontend/db/query_dsl_test.cljs

+ 15 - 7
src/main/frontend/db/query_dsl.cljs

@@ -141,6 +141,20 @@
      l)
     @vars))
 
+(defn ->property-query
+  ([k v]
+   (->property-query k v '?v))
+  ([k v sym]
+   [['?b :block/properties '?prop]
+    [(list 'missing? '$ '?b :block/name)]
+    [(list 'get '?prop (keyword k)) sym]
+    (list
+     'or
+     [(list '= sym v)]
+     [(list 'contains? sym v)]
+     ;; For integer pages that aren't strings
+     [(list 'contains? sym (str v))])]))
+
 (defn build-query
   ([repo e env]
    (build-query repo e (assoc env :vars (atom {})) 0))
@@ -269,13 +283,7 @@
              sym (if (= current-filter 'or)
                    '?v
                    (uniq-symbol counter "?v"))]
-         [['?b :block/properties '?prop]
-          [(list 'missing? '$ '?b :block/name)]
-          [(list 'get '?prop (keyword k)) sym]
-          (list
-           'or
-           [(list '= sym v)]
-           [(list 'contains? sym v)])])
+         (->property-query k v sym))
 
        (and (= 'property fe)
             (= 2 (count e)))

+ 53 - 38
src/test/frontend/db/query_dsl_test.cljs

@@ -24,6 +24,8 @@ created-at:: 1608968448113
 last-modified-at:: 1608968448113
 prop-a:: val-a
 prop-c:: [[page a]], [[page b]], [[page c]]
+prop-num:: 2000
+prop-linked-num:: [[3000]]
 - LATER 26-b2-modified-later [[page 2]] #tag1
 created-at:: 1608968448114
 last-modified-at:: 1608968448120
@@ -82,6 +84,9 @@ last-modified-at:: 1609084800002"}]]
 
 (defn q-count
   [s]
+  #_(let [db (frontend.db.conn/get-conn test-db)]
+    (prn :DB (d/q '[:find (pull ?b [*]) :where [?b :block/properties ?prop] [(get ?prop :prop-num)]]
+                db)))
   (let [{:keys [query result]} (q s)]
     {:query query
      :count (if result
@@ -94,6 +99,52 @@ last-modified-at:: 1609084800002"}]]
 
 (defonce empty-result {:query nil :result nil})
 
+(deftest block-property-queries
+  (are [x y] (= (q-count x) y)
+       "(property prop-a val-a)"
+       {:query (dsl/->property-query "prop-a" "val-a")
+        :count 2}
+
+       "(property prop-b val-b)"
+       {:query (dsl/->property-query "prop-b" "val-b")
+        :count 1}
+
+       "(and (property prop-b val-b))"
+       {:query '([?b :block/properties ?prop]
+                 [(missing? $ ?b :block/name)]
+                 [(get ?prop :prop-b) ?v]
+                 (or [(= ?v "val-b")] [(contains? ?v "val-b")] [(contains? ?v "val-b")]))
+        :count 1}
+
+       "(and (property prop-c \"page c\"))"
+       {:query (dsl/->property-query "prop-c" "page c")
+        :count 1}
+
+       ;; TODO: optimize
+       "(and (property prop-c \"page c\") (property prop-c \"page b\"))"
+       {:query '[[?b :block/properties ?prop]
+                 [(missing? $ ?b :block/name)]
+                 [(get ?prop :prop-c) ?v]
+                 (or [(= ?v "page c")] [(contains? ?v "page c")] [(contains? ?v "page c")])
+                 [(get ?prop :prop-c) ?v1]
+                 (or [(= ?v1 "page b")] [(contains? ?v1 "page b")] [(contains? ?v1 "page b")])]
+        :count 1}
+
+       "(or (property prop-c \"page c\") (property prop-b val-b))"
+       {:query '[[?b :block/content ?content]
+                 (or
+                  (and [?b :block/properties ?prop] [(missing? $ ?b :block/name)] [(get ?prop :prop-c) ?v] (or [(= ?v "page c")] [(contains? ?v "page c")] [(contains? ?v "page c")]))
+                  (and [?b :block/properties ?prop] [(missing? $ ?b :block/name)] [(get ?prop :prop-b) ?v] (or [(= ?v "val-b")] [(contains? ?v "val-b")] [(contains? ?v "val-b")])))]
+        :count 2}
+
+       "(property prop-num 2000)"
+       {:query (dsl/->property-query "prop-num" 2000)
+        :count 1}
+
+       "(property prop-linked-num 3000)"
+       {:query (dsl/->property-query "prop-linked-num" 3000)
+        :count 1}))
+
 (deftest test-parse
   []
   (testing "nil or blank strings should be ignored"
@@ -117,43 +168,7 @@ last-modified-at:: 1609084800002"}]]
       {:query '[[?b :block/path-refs [:block/name "page 2"]]]
        :count 4}))
 
-  (testing "Block properties query"
-    (are [x y] (= (q-count x) y)
-      "(property prop-a val-a)"
-      {:query '[[?b :block/properties ?prop] [(missing? $ ?b :block/name)] [(get ?prop :prop-a) ?v] (or [(= ?v "val-a")] [(contains? ?v "val-a")])]
-       :count 2}
-
-      "(property prop-b val-b)"
-      {:query '[[?b :block/properties ?prop] [(missing? $ ?b :block/name)] [(get ?prop :prop-b) ?v] (or [(= ?v "val-b")] [(contains? ?v "val-b")])]
-       :count 1}
-
-      "(and (property prop-b val-b))"
-      {:query '([?b :block/properties ?prop]
-                [(missing? $ ?b :block/name)]
-                [(get ?prop :prop-b) ?v]
-                (or [(= ?v "val-b")] [(contains? ?v "val-b")]))
-       :count 1}
-
-      "(and (property prop-c \"page c\"))"
-      {:query '[[?b :block/properties ?prop] [(missing? $ ?b :block/name)] [(get ?prop :prop-c) ?v] (or [(= ?v "page c")] [(contains? ?v "page c")])]
-       :count 1}
-
-      ;; TODO: optimize
-      "(and (property prop-c \"page c\") (property prop-c \"page b\"))"
-      {:query '[[?b :block/properties ?prop]
-                [(missing? $ ?b :block/name)]
-                [(get ?prop :prop-c) ?v]
-                (or [(= ?v "page c")] [(contains? ?v "page c")])
-                [(get ?prop :prop-c) ?v1]
-                (or [(= ?v1 "page b")] [(contains? ?v1 "page b")])]
-       :count 1}
 
-      "(or (property prop-c \"page c\") (property prop-b val-b))"
-      {:query '[[?b :block/content ?content]
-                (or
-                 (and [?b :block/properties ?prop] [(missing? $ ?b :block/name)] [(get ?prop :prop-c) ?v] (or [(= ?v "page c")] [(contains? ?v "page c")]))
-                 (and [?b :block/properties ?prop] [(missing? $ ?b :block/name)] [(get ?prop :prop-b) ?v] (or [(= ?v "val-b")] [(contains? ?v "val-b")])))]
-       :count 2}))
 
   (testing "task queries"
     (are [x y] (= (q-count x) y)
@@ -319,7 +334,7 @@ last-modified-at:: 1609084800002"}]]
       "(not [[page 1]])"
       {:query '([?b :block/uuid]
                 (not [?b :block/path-refs [:block/name "page 1"]]))
-       :count 36}))
+       :count 37}))
 
   (testing "Between query"
     (are [x y] (= (count-only x) y)
@@ -367,7 +382,7 @@ last-modified-at:: 1609084800002"}]]
                   (and [?b :block/path-refs [:block/name "page 1"]])
                   (and [?b :block/path-refs [:block/name "page 2"]])
                   [?b])))
-       :count 39})
+       :count 40})
 
     ;; FIXME: not working
     ;; (are [x y] (= (q-count x) y)