From e094c38bfe748c365a01e8cc713765dc6781efe8 Mon Sep 17 00:00:00 2001 From: lbrdnk <lbrdnk@users.noreply.github.com> Date: Thu, 17 Oct 2024 21:06:40 +0200 Subject: [PATCH] Splice expression into appropriate stage during v2 metric expansion (#48800) * Fix expression stage * Add test * Parallel test * Adjust test * Adjust test --- .../query_processor/middleware/metrics.clj | 7 +++--- .../middleware/metrics_test.clj | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/metabase/query_processor/middleware/metrics.clj b/src/metabase/query_processor/middleware/metrics.clj index 89d34f7844e..805a36d9a93 100644 --- a/src/metabase/query_processor/middleware/metrics.clj +++ b/src/metabase/query_processor/middleware/metrics.clj @@ -64,8 +64,8 @@ not-empty))) (defn- expression-with-name-from-source - [query [_ {:lib/keys [expression-name]} :as expression]] - (lib/expression query 0 expression-name expression)) + [query agg-stage-index [_ {:lib/keys [expression-name]} :as expression]] + (lib/expression query agg-stage-index expression-name expression)) (defn- update-metric-query-expression-names [metric-query unique-name-fn] @@ -137,7 +137,8 @@ (:qp/stage-had-source-card (lib.util/query-stage query agg-stage-index))))) (let [metric-query (update-metric-query-expression-names metric-query unique-name-fn)] (as-> query $q - (reduce expression-with-name-from-source $q (lib/expressions metric-query -1)) + (reduce #(expression-with-name-from-source %1 agg-stage-index %2) + $q (lib/expressions metric-query -1)) (include-implicit-joins $q agg-stage-index metric-query) (reduce #(lib/filter %1 agg-stage-index %2) $q (lib/filters metric-query -1)) (replace-metric-aggregation-refs $q agg-stage-index lookup))) diff --git a/test/metabase/query_processor/middleware/metrics_test.clj b/test/metabase/query_processor/middleware/metrics_test.clj index c8eb2cea6ed..e32643568d8 100644 --- a/test/metabase/query_processor/middleware/metrics_test.clj +++ b/test/metabase/query_processor/middleware/metrics_test.clj @@ -1,6 +1,7 @@ (ns metabase.query-processor.middleware.metrics-test (:require [clojure.test :refer [deftest is testing]] + [java-time.api :as t] [mb.hawk.assert-exprs.approximately-equal :as =?] [medley.core :as m] [metabase.analytics.prometheus :as prometheus] @@ -788,6 +789,30 @@ [u.date/temporal-str->iso8601-str int int 3.0] (mt/rows (qp/process-query query))))))))) +(deftest ^:parallel expressions-from-metrics-are-spliced-to-correct-stage-test + (testing "Integration test: Expression is spliced into correct stage during metric expansion (#48722)" + (mt/with-temp [:model/Card source-model {:dataset_query (mt/mbql-query orders {}) + :database_id (mt/id) + :name "source model" + :type :model} + :model/Card metric {:dataset_query + (mt/mbql-query + orders + {:source-table (str "card__" (:id source-model)) + :expressions {"somedays" [:datetime-diff + [:field "CREATED_AT" {:base-type :type/DateTime}] + (t/offset-date-time 2024 10 16 0 0 0) + :day]} + :aggregation [[:median [:expression "somedays" {:base-type :type/Integer}]]]}) + :database_id (mt/id) + :name "somedays median" + :type :metric}] + (let [mp (lib.metadata.jvm/application-database-metadata-provider (mt/id)) + query (-> (lib/query mp (lib.metadata/card mp (:id source-model))) + (lib/aggregate (lib.metadata/metric mp (:id metric))))] + (is (= 2162 + (ffirst (mt/rows (qp/process-query query))))))))) + (deftest ^:parallel ^:mb/once fetch-referenced-metrics-test (testing "Metric's aggregation `:name` is used in expanded aggregation (#48625)" (let [mp (lib.metadata.jvm/application-database-metadata-provider (mt/id)) -- GitLab