datascript
datascript copied to clipboard
Rules - Required bindings doesn't evaluate correctly
Attempting to follow the Datomic Rules with required bindings documentation and discovered this bug in DataScript.
Here's a short example:
(d/q '[:find ?need
:in $ % ?name
:where (needs ?name ?need)]
'[["george" :wants :foo]
["george" :needs :foo]
["sally" :needs :bar]]
'[[(needs ?name ?need) [?name :needs ?need]]] "george")
;; => #{[:foo]} (expected)
;; Now try with ?name being a required binding by placing it in brackets
;; -- (needs ?name ?need) -> (needs [?name] ?need)
(d/q '[:find ?need
:in $ % ?name
:where (needs ?name ?need)]
'[["george" :wants :foo]
["george" :needs :foo]
["sally" :needs :bar]]
'[[(needs [?name] ?need) [?name :needs ?need]]] "george")
;; => #{[:foo :bar]} (incorrect)
It may be that the required binding version is always evaluating to true.
I don’t think we support this. There’s some work in the parser but it’s not used in current query impl. There are no tests on this either