diff --git a/src/metabase/driver/generic_sql/query_processor.clj b/src/metabase/driver/generic_sql/query_processor.clj index 6c7728ead403eee88b01767e69d8c80e285fb8d6..3820f145cb61bf616fa1a4de116a6dfd796bba6c 100644 --- a/src/metabase/driver/generic_sql/query_processor.clj +++ b/src/metabase/driver/generic_sql/query_processor.clj @@ -219,26 +219,14 @@ first (= "cum_sum"))) -(defn- cumulative-sum - "Recursively cumulative sum a sequence of VALUES." - ([values] - {:pre [(sequential? values) - (every? number? values)]} - (cumulative-sum 0 [] values)) - ([acc-sum acc-values [value & more]] - (let [acc-sum (+ acc-sum value) - acc-values (conj acc-values acc-sum)] - (if-not (seq? more) acc-values - (recur acc-sum acc-values more))))) - (defn- apply-cumulative-sum - "Apply `cumulative-sum` to values of the aggregate `Field` in RESULTS." + "Cumulative sum the values of the aggregate `Field` in RESULTS." {:arglists '([query results])} [{[_ field-id] :aggregation} results] (let [field (field-id->kw field-id) values (->> results ; make a sequence of cumulative sum values for each row (map field) - cumulative-sum)] + (reductions +))] (map (fn [row value] ; replace the value for each row with the cumulative sum value (assoc row field value)) results values))) diff --git a/test/metabase/driver/generic_sql/query_processor_test.clj b/test/metabase/driver/generic_sql/query_processor_test.clj index 4e885683f6adfafd9d873c39ddb84465f7154e6b..bef80343a9e4f49e638b0c2e9a089975ca90c21d 100644 --- a/test/metabase/driver/generic_sql/query_processor_test.clj +++ b/test/metabase/driver/generic_sql/query_processor_test.clj @@ -387,6 +387,7 @@ ;; # POST PROCESSING TESTS ;; ## CUMULATIVE SUM + ;; ### Simple cumulative sum w/o any breakout (expect {:status :completed :row_count 15