lilactown / pyramid

A library for storing and querying graph data in Clojure
Eclipse Public License 2.0
228 stars 10 forks source link

Dynamic map keys #35

Open lilactown opened 7 months ago

lilactown commented 7 months ago

Support something like

(p/pull
  (p/db
    [{:classroom/id "c1" :school [:school/id 1]}
     {:classroom/id "c2" :school [:school/id 1]}
     {:classroom/id "c3" :school [:school/id 2]}

     {:school/id 1
      :allocations {[:classroom/id "c1"] [[:course/id 1] [:course/id 2]]
                    [:classroom/id "c2"] [[:course/id 1]]}}
     {:school/id 2
      :allocations {[:classroom/id "c3"] [[:course/id 1] [:course/id 3]]}}

     {:course/id 1 :course/name "A"}
     {:course/id 2 :course/name "B"}
     {:course/id 3 :course/name "C"}])

  [{[:school/id 1] [{:allocations [{???? [:course/name]}]}]}])
;; => {[:school/id 1]
;;     {:allocations
;;      {[:classroom/id "c1"] [#:course{:name "A"} #:course{:name "B"}],
;;       [:classroom/id "c2"] [#:course{:name "A"}]}}}

We'd want to support this for joins and unions.

A few ideas:

  1. Use _ as the key, e.g. [{'_ [:course/name]}]
  2. Support some kind of regex a la spec, perhaps use spec itself. E.g. [{(s/spec (s/tuple keyword? string?)) [:course/name]}]
  3. Accept a predicate fn, such as [{(fn [x] (and (vector? x) (= :classroom/id (first x)))) [:course/name]}]
lilactown commented 7 months ago

Options 2 and 3 would require changes to the EQL parsing library to allow functions in the key position...