浏览代码

fix: Insufficient bindings error after datascript upgrade

After upgrading our forked datascript from 1.5.3 to 1.7.1,
bindings in two of our rules behaved differently. The workaround
of adding an `and` where none was required before is sufficient.
Fixes LOG-3177
Gabriel Horner 1 年之前
父节点
当前提交
e58f1221d2
共有 4 个文件被更改,包括 20 次插入9 次删除
  1. 3 2
      deps/db/bb.edn
  2. 6 4
      deps/db/src/logseq/db/frontend/rules.cljc
  3. 1 1
      deps/graph-parser/deps.edn
  4. 10 2
      src/test/frontend/db/query_dsl_test.cljs

+ 3 - 2
deps/db/bb.edn

@@ -29,9 +29,10 @@
    :task (datalog/lint-rules
    :task (datalog/lint-rules
           (set
           (set
            (concat (mapcat val rules/rules)
            (concat (mapcat val rules/rules)
-                  ;; TODO: Update linter to handle false positive on ?str-val for :property
+                   ;; TODO: Update linter to handle false positive on ?str-val for :property
                    (rules/extract-rules (dissoc rules/query-dsl-rules :property))
                    (rules/extract-rules (dissoc rules/query-dsl-rules :property))
-                   (rules/extract-rules rules/db-query-dsl-rules))))}}
+                   ;; TODO: Update linter to handle false positive on :task and :priority
+                   (rules/extract-rules (dissoc rules/db-query-dsl-rules :task :priority)))))}}
 
 
  :tasks/config
  :tasks/config
  {:large-vars
  {:large-vars

+ 6 - 4
deps/db/src/logseq/db/frontend/rules.cljc

@@ -196,13 +196,15 @@
 
 
     :task
     :task
     '[(task ?b ?statuses)
     '[(task ?b ?statuses)
-      (property ?b :logseq.task/status ?status)
-      [(contains? ?statuses ?status)]]
+      ;; and needed to avoid binding error
+      (and (property ?b :logseq.task/status ?val)
+           [(contains? ?statuses ?val)])]
 
 
     :priority
     :priority
     '[(priority ?b ?priorities)
     '[(priority ?b ?priorities)
-      (property ?b :logseq.task/priority ?priority)
-      [(contains? ?priorities ?priority)]]}))
+      ;; and needed to avoid binding error
+      (and (property ?b :logseq.task/priority ?priority)
+           [(contains? ?priorities ?priority)])]}))
 
 
 (def rules-dependencies
 (def rules-dependencies
   "For db graphs, a map of rule names and the rules they depend on. If this map
   "For db graphs, a map of rule names and the rules they depend on. If this map

+ 1 - 1
deps/graph-parser/deps.edn

@@ -7,9 +7,9 @@
   logseq/db                   {:local/root "../db"}
   logseq/db                   {:local/root "../db"}
   logseq/common               {:local/root "../common"}
   logseq/common               {:local/root "../common"}
   ;; stubbed in nbb
   ;; stubbed in nbb
-  funcool/promesa             {:mvn/version "4.0.2"}
   com.lambdaisland/glogi      {:mvn/version "1.1.144"}
   com.lambdaisland/glogi      {:mvn/version "1.1.144"}
   ;; built in to nbb
   ;; built in to nbb
+  funcool/promesa             {:mvn/version "4.0.2"}
   cljs-bean/cljs-bean         {:mvn/version "1.5.0"}}
   cljs-bean/cljs-bean         {:mvn/version "1.5.0"}}
 
 
  :aliases
  :aliases

+ 10 - 2
src/test/frontend/db/query_dsl_test.cljs

@@ -286,8 +286,16 @@ prop-d:: [[nada]]"}])
       "Multiple boolean operators with todo and priority operators")
       "Multiple boolean operators with todo and priority operators")
 
 
   (is (= ["DOING b4" "DOING b5"]
   (is (= ["DOING b4" "DOING b5"]
-           (map testable-content
-                (dsl-query "(and (task doing) (or [[A]] [[B]]))")))))
+         (map testable-content
+              (dsl-query "(and (task doing) (or [[A]] [[B]]))")))))
+
+(when js/process.env.DB_GRAPH
+
+  ;; Ensure some filters work when no data with relevant properties exist
+  (deftest queries-with-no-data
+    (load-test-files [])
+    (is (= [] (dsl-query "(task todo)")))
+    (is (= [] (dsl-query "(priority high)")))))
 
 
 (deftest sample-queries
 (deftest sample-queries
   (load-test-files [{:file/path "pages/page1.md"
   (load-test-files [{:file/path "pages/page1.md"