diff --git a/src/metabase/api/dataset.clj b/src/metabase/api/dataset.clj index 37726e5d7b196985597dd44785a3556678fa3e9f..b79e9aafe87d39070b9d00aff6d7f3e96fa04809 100644 --- a/src/metabase/api/dataset.clj +++ b/src/metabase/api/dataset.clj @@ -26,6 +26,7 @@ [metabase.shared.models.visualization-settings :as mb.viz] [metabase.util :as u] [metabase.util.i18n :refer [trs tru]] + [metabase.util.malli.schema :as ms] [metabase.util.schema :as su] [schema.core :as s] [toucan.db :as db])) @@ -176,22 +177,18 @@ (qp.pivot/run-pivot-query (assoc query :async? true) info context)))) -(def ^:private Parameter - (su/open-schema - {:values_source_type (s/enum nil "static-list" "card")})) - -(def ^:private FieldIds (s/maybe [s/Int])) - (defn- parameter-field-values [field-ids query] - (reduce (fn [resp id] - (let [{values :values more? :has_more_values} (api.field/field-id->values id query)] - (-> resp - (update :values concat values) - (update :has_more_values #(or % more?))))) - {:has_more_values false - :values []} - field-ids)) + (-> (reduce (fn [resp id] + (let [{values :values more? :has_more_values} (api.field/field-id->values id query)] + (-> resp + (update :values concat values) + (update :has_more_values #(or % more?))))) + {:has_more_values false + :values []} + field-ids) + ;; deduplicate the values returned from multiple fields + (update :values set))) (defn parameter-values "Fetch parameter values. Parameter should be a full parameter, field-ids is an optional vector of field ids, only @@ -209,22 +206,20 @@ {:status-code 400 :parameter parameter})))) -#_{:clj-kondo/ignore [:deprecated-var]} -(api/defendpoint-schema POST "/parameter/values" +(api/defendpoint POST "/parameter/values" "Return parameter values for cards or dashboards that are being edited." [:as {{:keys [parameter field_ids]} :body}] - {parameter Parameter - field_ids FieldIds} + {parameter ms/Parameter + field_ids [:maybe [:sequential ms/IntGreaterThanZero]]} (let [nil-query nil] (parameter-values parameter field_ids nil-query))) -#_{:clj-kondo/ignore [:deprecated-var]} -(api/defendpoint-schema POST "/parameter/search/:query" +(api/defendpoint POST "/parameter/search/:query" "Return parameter values for cards or dashboards that are being edited. Expects a query string at `?query=foo`." [query :as {{:keys [parameter field_ids]} :body}] - {parameter Parameter - field_ids FieldIds - query s/Str} + {parameter ms/Parameter + field_ids [:maybe [:sequential ms/IntGreaterThanZero]] + query :string} (parameter-values parameter field_ids query)) (api/define-routes) diff --git a/test/metabase/api/dataset_test.clj b/test/metabase/api/dataset_test.clj index 79fc5efac8ea234a492b7dcb1d1129ff85eb5325..71b652120761f2871f167ca91c2b244576d995a1 100644 --- a/test/metabase/api/dataset_test.clj +++ b/test/metabase/api/dataset_test.clj @@ -461,6 +461,7 @@ (mt/id :people :source)]}) :values set)] (is (set/subset? #{["Doohickey"] ["Facebook"]} values)))) + (testing "search" (let [values (-> (mt/user-http-request :rasta :post 200 "dataset/parameter/search/g" @@ -470,4 +471,13 @@ :values set)] ;; results matched on g, does not include Doohickey (which is in above results) (is (set/subset? #{["Widget"] ["Google"]} values)) - (is (not (contains? values ["Doohickey"]))))))))) + (is (not (contains? values ["Doohickey"]))))) + + (testing "deduplicates the values returned from multiple fields" + (let [values (-> (mt/user-http-request :rasta :post 200 + "dataset/parameter/values" + {:parameter parameter + :field_ids [(mt/id :people :source) + (mt/id :people :source)]}) + :values)] + (is (= [["Twitter"] ["Organic"] ["Affiliate"] ["Google"] ["Facebook"]] values))))))))