|
324 | 324 | (<? (pipeline-expandmaps-result select pp-keys single-result? db fuel max-fuel opts 8 result))
|
325 | 325 | result))))))
|
326 | 326 |
|
327 |
| - |
328 | 327 | (defn ad-hoc-group-by
|
329 |
| - [{:keys [headers tuples] :as res} groupBy] |
| 328 | + [{:keys [headers vars tuples] :as res} groupBy] |
| 329 | + (log/info "Result passed to group-by:" res) |
330 | 330 | (let [[inVector? groupBy] (cond (vector? groupBy) [true (map symbol groupBy)]
|
331 | 331 | (string? groupBy) [false [(symbol groupBy)]]
|
332 | 332 | :else (throw (ex-info
|
333 | 333 | (str "Invalid groupBy clause, must be a string or vector. Provided: " groupBy)
|
334 | 334 | {:status 400 :error :db/invalid-query})))
|
335 |
| - group-idxs (map #(util/index-of headers %) groupBy) |
336 |
| - _ (when (some nil? group-idxs) |
337 |
| - (throw (ex-info |
338 |
| - (str "Invalid groupBy clause - are all groupBy vars declared in the where clause. Provided: " groupBy) |
339 |
| - {:status 400 :error :db/invalid-query})))] |
| 335 | + group-idxs (map (fn [group-var] |
| 336 | + (if-let [group-idx (util/index-of headers group-var)] |
| 337 | + {::idx group-idx} |
| 338 | + (if-let [group-val (get vars group-var)] |
| 339 | + {::value group-val} |
| 340 | + (throw (ex-info |
| 341 | + (str "Invalid groupBy clause - are all groupBy vars declared in the where clause. Provided: " groupBy) |
| 342 | + {:status 400 :error :db/invalid-query}))))) |
| 343 | + groupBy)] |
340 | 344 | (reduce
|
341 | 345 | (fn [res tuple]
|
342 |
| - (let [k (map #(nth tuple %) group-idxs) |
| 346 | + (let [k (map (fn [val-spec] |
| 347 | + (if-let [idx (::idx val-spec)] |
| 348 | + (nth tuple idx) |
| 349 | + (::value val-spec))) |
| 350 | + group-idxs) |
343 | 351 | k' (if inVector? (into [] k) (first k))
|
344 | 352 | v tuple]
|
345 | 353 | (assoc res k' (conj (get res k' []) v))))
|
|
432 | 440 | (defn relationship-binding
|
433 | 441 | [{:keys [vars] :as opts}]
|
434 | 442 | (async/go-loop [[next-vars & rest-vars] vars
|
435 |
| - acc []] |
| 443 | + acc (if (:groupBy opts) {} [])] |
436 | 444 | (if next-vars
|
437 | 445 | (let [opts' (assoc opts :vars next-vars)
|
438 | 446 | res (<? (process-ad-hoc-query opts'))]
|
|
0 commit comments