Skip to content

Duplicated/un-merged results for nested optionals #256

@kirahowe

Description

@kirahowe

There's a bug where matches of optional clauses seem to return duplicated or unbound vars when they're nested inside a map in a build query.

For example:

;; Given this data:
(def db (matcha/index-triples [[:s1 :p1 :o1]
                               [:s1 :p2 :o2]
                               [:o1 :po1 :oo1]
                               [:o1 :po2 :oo2]]))

;; This works as expected (whether the last clause is optional or not, i.e. both):
(matcha/build [:id ?id]
              {:p1  ?o1
               :po1 ?oo1
               :po2 ?oo2}
              [[?id :p1 ?o1]
               [?id :p2 ?o2]
               [?o1 :po1 ?oo1]
               [?o1 :po2 ?oo2]]
              db)

;; and
(matcha/build [:id ?id]
              {:p1  ?o1
               :po1 ?oo1
               :po2 ?oo2}
              [[?id :p1 ?o1]
               [?id :p2 ?o2]
               [?o1 :po1 ?oo1]
               (matcha/optional [[?o1 :po2 ?oo2]])]
              db)

;; Return, as expected: 
({:id :s1
  :p1 :o1
  :po1 :oo1
  :po2 :oo2})

;; Nesting some of the results under a separate key also works when no clauses are optional:
(matcha/build [:id ?id]
              {:p1  ?o1
               :o1 {:po1 ?oo1
                    :po2 ?oo2}}
              [[?id :p1 ?o1]
               [?id :p2 ?o2]
               [?o1 :po1 ?oo1]
               [?o1 :po2 ?oo2]]
              db)

;; Returns, as expected:
({:id :s1
  :p1 :o1
  :o1 {:po1 :oo1
       :po2 :oo2}})

;; But making one of the clauses optional breaks the result (I would expect the same result as above here, but we get a set instead of a single nested resource):
(matcha/build [:id ?id]
              {:p1  ?o1
               :o1 {:po1 ?oo1
                    :po2 ?oo2}}
              [[?id :p1 ?o1]
               [?id :p2 ?o2]
               [?o1 :po1 ?oo1]
               (matcha/optional [[?o1 :po2 ?oo2]])]
              db)

;; Returns:
({:id :s1
  :p1 :o1
  :o1 #{{:po1 :oo1, :po2 _0}
        {:po1 :oo1, :po2 :oo2}}})

These can be manually fixed/flattened of course, but I think the result given is not the ideal solution.

This may have been introduced when fixing #21.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions