Skip to content

Commit b354f3d

Browse files
authored
Merge pull request #514 from fluree/fix/group-by-vars
Fix/group by vars
2 parents 2e17159 + 7209466 commit b354f3d

File tree

3 files changed

+28
-12
lines changed

3 files changed

+28
-12
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,4 @@ package-lock.json
3131
/js-packages/browser/flureedb.js
3232
/js-packages/nodejs/flureenjs.js
3333
/js-packages/webworker/flureeworker.js
34+
/.shadow-cljs/

src/fluree/db/query/analytical.cljc

+10-3
Original file line numberDiff line numberDiff line change
@@ -623,10 +623,17 @@
623623

624624

625625
(defn calculate-aggregate
626-
[tuples aggregate-fn-map]
626+
[{:keys [headers vars tuples]} aggregate-fn-map]
627627
(let [{:keys [variable as function]} aggregate-fn-map
628-
agg-params (flatten (select-from-tuples [variable] tuples))
629-
agg-result (function agg-params)]
628+
var (or (as-variable variable)
629+
(:variable variable))
630+
value (if-let [var-idx (util/index-of headers var)]
631+
(map #(nth % var-idx) tuples)
632+
(if-let [val (get vars var)]
633+
(map (constantly val) tuples)
634+
(throw (ex-info (str "Invalid aggregate variable:" var)
635+
{:status 400 :error :db/invalid-query}))))
636+
agg-result (function value)]
630637
[as agg-result]))
631638

632639
(defn add-aggregate-cols

src/fluree/db/query/fql.cljc

+17-9
Original file line numberDiff line numberDiff line change
@@ -324,22 +324,30 @@
324324
(<? (pipeline-expandmaps-result select pp-keys single-result? db fuel max-fuel opts 8 result))
325325
result))))))
326326

327-
328327
(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)
330330
(let [[inVector? groupBy] (cond (vector? groupBy) [true (map symbol groupBy)]
331331
(string? groupBy) [false [(symbol groupBy)]]
332332
:else (throw (ex-info
333333
(str "Invalid groupBy clause, must be a string or vector. Provided: " groupBy)
334334
{: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)]
340344
(reduce
341345
(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)
343351
k' (if inVector? (into [] k) (first k))
344352
v tuple]
345353
(assoc res k' (conj (get res k' []) v))))
@@ -432,7 +440,7 @@
432440
(defn relationship-binding
433441
[{:keys [vars] :as opts}]
434442
(async/go-loop [[next-vars & rest-vars] vars
435-
acc []]
443+
acc (if (:groupBy opts) {} [])]
436444
(if next-vars
437445
(let [opts' (assoc opts :vars next-vars)
438446
res (<? (process-ad-hoc-query opts'))]

0 commit comments

Comments
 (0)