I'm dabbling in Clojure and HugSQL, coming from a Java + MyBatis
background, and I'm working through approaches for avoiding the ol' 1+N
SELECTs when retrieving nested data. Being a beginner, I'm looking for a
general sanity check, whether in the small or the large.
In Java + MyBatis, I've used two approaches:
* Run a single query with eager joins, leaning on MyBatis to sort out my
data graph. Very nice (but also easy to break off a little too much).
* First run a query for a driver result and then query again for an
aggregate of sub-details, e.g. first query for order headers, then again
for order lines WHERE ORDER_NUM IN ({{orderNumbers}}). Finally, merge the
results to build up the object graph.
It's the latter approach that I'm working through in Clojure at the moment,
which has led me to assoc'ing groups, as follows:
;; assoc groups of ys into corresponding xs with assoc-key, matching xs to
ys on match-fn
(defn assoc-groups [xs ys match-fn assoc-key]
(let [groups (group-by match-fn ys)]
(map
#(assoc % assoc-key (get groups (match-fn %)))
xs)))
(def orders
[{:order-number 1 :city "Arris Dome"}
{:order-number 2 :city "Narshe"}
{:order-number 3 :city "Etria"}])
(def lines
[{:order-number 1 :item-number "BASEMENT-KEY" :qty-ordered 1}
{:order-number 1 :item-number "SEEDLING" :qty-ordered 11}
{:order-number 2 :item-number "MAGITEK-BATTERY" :qty-ordered 2}
{:order-number 2 :item-number "WOOL-GLOVES" :qty-ordered 22}
{:order-number 3 :item-number "ARIADNE-THREAD" :qty-ordered 3}])
;; apply order lines to headers, matching on :order-number
(def result (assoc-groups orders lines :order-number :lines))
;; output
=> result
({:order-number 1,
:city "Arris Dome",
:lines
[{:order-number 1,
:item-number "BASEMENT-KEY",
:qty-ordered 1}
{:order-number 1,
:item-number "SEEDLING",
:qty-ordered 11}]}
{:order-number 2,
:city "Narshe",
:lines
[{:order-number 2,
:item-number "MAGITEK-BATTERY",
:qty-ordered 2}
{:order-number 2,
:item-number "WOOL-GLOVES",
:qty-ordered 22}]}
{:order-number 3,
:city "Etria",
:lines
[{:order-number 3,
:item-number "ARIADNE-THREAD",
:qty-ordered 3}]})
To my naive way of thinking, this "assoc-groups" concept seems like it
would be fairly common, which makes me wonder if I've reinvented a wheel
and my limited grasp of functional terminology is preventing me from
finding it. Or, maybe it's not very common because a different approach is
more widespread.
I'd appreciate any quick mentoring. Thanks!
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.