Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Function Input not Evaluated in Query Rules #311

Open
MyriaCore opened this issue Aug 5, 2019 · 4 comments
Open

Function Input not Evaluated in Query Rules #311

MyriaCore opened this issue Aug 5, 2019 · 4 comments

Comments

@MyriaCore
Copy link

I could easily be missing something, but to my current understanding, the intended behavior between the two code snippets below should be identical.

(d/q '[:find ?int
       :in ?intersection
       :where [(?intersection #{:a :b :c} #{:c :d :e}) ?int]]
     clojure.set/intersection))
;; => #{[#{:c}]}

(d/q '[:find ?int
       :in % ?intersection
       :where (intersection-rule #{:a :b :c} #{:c :d :e} ?int)]
  '[[(intersection-rule ?s ?t ?int)
     [(?intersection ?s ?t) ?int]]]
  clojure.set/intersection))
;; => Execution error (ExceptionInfo) at datascript.query/bind-by-fn (query.cljc:546). 
;;    Unknown function '?intersection__auto__1 in [(?intersection__auto__1 #{:c :b :a} #{:e :c :d}) 
@MyriaCore MyriaCore changed the title Function input not evaluated in rules Function Input not Evaluated in Query Rules Aug 5, 2019
@tonsky
Copy link
Owner

tonsky commented Aug 6, 2019

Yes, seems like a bug here

(walk/postwalk
#(if (free-var? %)
(db/some-of
(replacements %)
(symbol (str (name %) "__auto__" seqid)))
%)
clauses))))

It tries to rename rule vars based on if symbol starts with a ?, not on actual arguments list

@MyriaCore
Copy link
Author

Wow, thanks for the quick response! I thought I was just doing something wrong.

Is there a workaround for the time being?

@tonsky
Copy link
Owner

tonsky commented Aug 6, 2019

you can try explicitly pass fn as an argument to the rule. Might work, might not

@MyriaCore
Copy link
Author

Alright, that seems to work. Thanks!

(d/q '[:find ?int
       :in ?intersection
       :where [(?intersection #{:a :b :c} #{:c :d :e}) ?int]]
     clojure.set/intersection))
;; => #{[#{:c}]}


(d/q '[:find ?int
       :in % ?intersection
       :where (intersection-rule ?intersection #{:a :b :c} #{:c :d :e} ?int)]
  '[[(intersection-rule ?f ?s ?t ?int)
     [(?f ?s ?t) ?int]]]
  clojure.set/intersection))
;; => #{[#{:c}]}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants