(ns metabase.query-processor.middleware.pre-alias-aggregations (:require [metabase.driver :as driver] [metabase.legacy-mbql.util :as mbql.u] [metabase.query-processor.middleware.annotate :as annotate])) | |
(defn- ag-name [inner-query ag-clause] (driver/escape-alias driver/*driver* (annotate/aggregation-name inner-query ag-clause))) | |
(defn- pre-alias-and-uniquify [inner-query aggregations] (mapv (fn [original-ag updated-ag] (if (= original-ag updated-ag) original-ag (with-meta updated-ag {:auto-generated? true}))) aggregations (mbql.u/pre-alias-and-uniquify-aggregations (partial ag-name inner-query) aggregations))) | |
Make sure all aggregations have aliases, and all aliases are unique, in an 'inner' MBQL query. | (defn pre-alias-aggregations-in-inner-query [{:keys [aggregation source-query joins], :as inner-query}] (cond-> inner-query (seq aggregation) (update :aggregation (partial pre-alias-and-uniquify inner-query)) source-query (update :source-query pre-alias-aggregations-in-inner-query) joins (update :joins (partial mapv pre-alias-aggregations-in-inner-query)))) |
Middleware that generates aliases for all aggregations anywhere in a query, and makes sure they're unique. | (defn pre-alias-aggregations [{query-type :type, :as query}] (if-not (= query-type :query) query (update query :query pre-alias-aggregations-in-inner-query))) |