rules aren't correctly unifying
Nobody has claimed this yet.
- Dominant language
- Clojure
- Stars
- 5.8k
- Forks
- 318
- PR merge metrics
- No merged PRs in 30d
Description
The problem: walk references until finding the root reference.
This example returns {:id :a :root 1} in the results as expected for datomic, but fails in datascript:
(let [c (db/empty-db {:id {:db/unique :db.unique/identity}})]
(db/q '[:find (pull ?root [*]) :in $ ?id % :where [?e :id ?id] (root ?id ?root)]
(db/db-with c [{:id :a :root 1} {:id :b :parent [:id :a]} {:id :c :parent [:id :b]} {:id :d :root 2}])
:b
'[[(root ?e ?e) (not [?e :parent _])]
[(root ?e ?r) [?e :parent ?p] (root ?p ?r)]]))
;; => ExceptionInfo Insufficient bindings: none of #{?root} is bound in (not [?root :parent _]) clojure.core/ex-info (core.clj:4739)
This example throws an ArrayIndexOutOfBoundsException in datomic 🤷♂️ while in datascript returns too many results (however did it reach {:id :d}?):
(let [c (db/empty-db {:id {:db/unique :db.unique/identity}})]
(db/q '[:find (pull ?root [*]) :in $ ?id % :where [?e :id ?id] (root ?id ?root)]
(db/db-with c [{:id :a :root 1} {:id :b :parent [:id :a]} {:id :c :parent [:id :b]} {:id :d :root 2}])
:b
'[[(root ?e ?e) [?e :root _]]
[(root ?e ?r) [?e :parent ?p] (root ?p ?r)]]))
;; => ([{:db/id 4, :id :d, :root 2}] [{:db/id 1, :id :a, :root 1}])
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
The issue names no source files or tests. Reproduce both recursive-rule examples through db/q, then trace rule evaluation and unification from that entry point; done means the first query returns the expected root and the second no longer returns the unrelated entity or throws.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- clojure
- Domain
- databases
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100