Skip to content
Snippets Groups Projects
Unverified Commit 3fd01b63 authored by Alexander Polyankin's avatar Alexander Polyankin Committed by GitHub
Browse files

New can-run/can-save restrictions for metrics (#47626)

parent 87a08b9d
Branches
Tags
No related merge requests found
......@@ -17,6 +17,8 @@
[metabase.lib.schema.expression :as lib.schema.expression]
[metabase.lib.schema.id :as lib.schema.id]
[metabase.lib.schema.metadata :as lib.schema.metadata]
[metabase.lib.temporal-bucket :as lib.temporal-bucket]
[metabase.lib.types.isa :as lib.types.isa]
[metabase.lib.util :as lib.util]
[metabase.lib.util.match :as lib.util.match]
[metabase.shared.util.i18n :as i18n]
......@@ -66,8 +68,18 @@
(defmethod can-run-method :mbql.stage/mbql
[query card-type]
(or (not= card-type :metric)
(and (= (stage-count query) 1)
(= (-> (lib.util/query-stage query 0) :aggregation count) 1))))
(let [stage (lib.util/query-stage query 0)
aggregations (:aggregation stage)
breakouts (:breakout stage)]
(and (= (stage-count query) 1)
(= (count aggregations) 1)
(or (empty? breakouts)
(and (= (count breakouts) 1)
(-> (lib.metadata.calculation/metadata query (first breakouts))
;; extraction units change `:effective-type` to `:type/Integer`, so remove temporal bucketing
;; before doing type checks
(lib.temporal-bucket/with-temporal-bucket nil)
lib.types.isa/date-or-datetime?)))))))
(mu/defn can-run :- :boolean
"Returns whether the query is runnable. Manually validate schema for cljs."
......
......@@ -207,13 +207,29 @@
false :metric (-> lib.tu/venues-query
(lib/aggregate (lib/count))
(lib/aggregate (lib/sum (meta/field-metadata :venues :id))))
true :metric (-> lib.tu/venues-query
true :metric (-> (lib/query meta/metadata-provider (meta/table-metadata :people))
(lib/aggregate (lib/count))
(lib/breakout (meta/field-metadata :people :birth-date)))
true :metric (-> (lib/query meta/metadata-provider (meta/table-metadata :people))
(lib/aggregate (lib/count))
(lib/breakout (meta/field-metadata :people :created-at)))
true :metric (-> (lib/query meta/metadata-provider (meta/table-metadata :people))
(lib/aggregate (lib/count))
(lib/breakout (lib/with-temporal-bucket (meta/field-metadata :people :birth-date) :year)))
true :metric (-> (lib/query meta/metadata-provider (meta/table-metadata :people))
(lib/aggregate (lib/count))
(lib/breakout (first (lib/breakoutable-columns lib.tu/venues-query))))
false :metric (-> lib.tu/venues-query
(lib/aggregate (lib/count))
(lib/append-stage)
(lib/aggregate (lib/count))))))
(lib/breakout (lib/with-temporal-bucket (meta/field-metadata :people :birth-date) :hour-of-day)))
false :metric (-> (lib/query meta/metadata-provider (meta/table-metadata :people))
(lib/aggregate (lib/count))
(lib/breakout (meta/field-metadata :people :created-at))
(lib/breakout (meta/field-metadata :people :birth-date)))
false :metric (-> (lib/query meta/metadata-provider (meta/table-metadata :people))
(lib/aggregate (lib/count))
(lib/breakout (meta/field-metadata :people :name)))
false :metric (-> lib.tu/venues-query
(lib/aggregate (lib/count))
(lib/append-stage)
(lib/aggregate (lib/count))))))
(deftest ^:parallel can-save-test
(mu/disable-enforcement
......@@ -226,16 +242,29 @@
false :metric lib.tu/venues-query
true :metric (-> lib.tu/venues-query
(lib/aggregate (lib/count)))
false :metric (-> lib.tu/venues-query
true :metric (-> (lib/query meta/metadata-provider (meta/table-metadata :people))
(lib/aggregate (lib/count))
(lib/aggregate (lib/sum (meta/field-metadata :venues :id))))
true :metric (-> lib.tu/venues-query
(lib/breakout (meta/field-metadata :people :birth-date)))
true :metric (-> (lib/query meta/metadata-provider (meta/table-metadata :people))
(lib/aggregate (lib/count))
(lib/breakout (meta/field-metadata :people :created-at)))
true :metric (-> (lib/query meta/metadata-provider (meta/table-metadata :people))
(lib/aggregate (lib/count))
(lib/breakout (lib/with-temporal-bucket (meta/field-metadata :people :birth-date) :year)))
true :metric (-> (lib/query meta/metadata-provider (meta/table-metadata :people))
(lib/aggregate (lib/count))
(lib/breakout (lib/with-temporal-bucket (meta/field-metadata :people :birth-date) :hour-of-day)))
false :metric (-> (lib/query meta/metadata-provider (meta/table-metadata :people))
(lib/aggregate (lib/count))
(lib/breakout (meta/field-metadata :people :created-at))
(lib/breakout (meta/field-metadata :people :birth-date)))
false :metric (-> (lib/query meta/metadata-provider (meta/table-metadata :people))
(lib/aggregate (lib/count))
(lib/breakout (meta/field-metadata :people :id)))
false :metric (-> lib.tu/venues-query
(lib/aggregate (lib/count))
(lib/breakout (first (lib/breakoutable-columns lib.tu/venues-query))))
false :metric (-> lib.tu/venues-query
(lib/aggregate (lib/count))
(lib/append-stage)
(lib/aggregate (lib/count))))))
(lib/append-stage)
(lib/aggregate (lib/count))))))
(deftest ^:parallel can-preview-test
(mu/disable-enforcement
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment