Skip to content
Snippets Groups Projects
Unverified Commit 7ef8c11e authored by Ngoc Khuat's avatar Ngoc Khuat Committed by GitHub
Browse files

Deduplicate params values when call with multiple fields (#27990)

deduplicates values returned from multiple fields and use malli for API schema
parent c4fd58f0
No related branches found
No related tags found
No related merge requests found
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
[metabase.shared.models.visualization-settings :as mb.viz] [metabase.shared.models.visualization-settings :as mb.viz]
[metabase.util :as u] [metabase.util :as u]
[metabase.util.i18n :refer [trs tru]] [metabase.util.i18n :refer [trs tru]]
[metabase.util.malli.schema :as ms]
[metabase.util.schema :as su] [metabase.util.schema :as su]
[schema.core :as s] [schema.core :as s]
[toucan.db :as db])) [toucan.db :as db]))
...@@ -176,22 +177,18 @@ ...@@ -176,22 +177,18 @@
(qp.pivot/run-pivot-query (assoc query :async? true) info context)))) (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 (defn- parameter-field-values
[field-ids query] [field-ids query]
(reduce (fn [resp id] (-> (reduce (fn [resp id]
(let [{values :values more? :has_more_values} (api.field/field-id->values id query)] (let [{values :values more? :has_more_values} (api.field/field-id->values id query)]
(-> resp (-> resp
(update :values concat values) (update :values concat values)
(update :has_more_values #(or % more?))))) (update :has_more_values #(or % more?)))))
{:has_more_values false {:has_more_values false
:values []} :values []}
field-ids)) field-ids)
;; deduplicate the values returned from multiple fields
(update :values set)))
(defn parameter-values (defn parameter-values
"Fetch parameter values. Parameter should be a full parameter, field-ids is an optional vector of field ids, only "Fetch parameter values. Parameter should be a full parameter, field-ids is an optional vector of field ids, only
...@@ -209,22 +206,20 @@ ...@@ -209,22 +206,20 @@
{:status-code 400 {:status-code 400
:parameter parameter})))) :parameter parameter}))))
#_{:clj-kondo/ignore [:deprecated-var]} (api/defendpoint POST "/parameter/values"
(api/defendpoint-schema POST "/parameter/values"
"Return parameter values for cards or dashboards that are being edited." "Return parameter values for cards or dashboards that are being edited."
[:as {{:keys [parameter field_ids]} :body}] [:as {{:keys [parameter field_ids]} :body}]
{parameter Parameter {parameter ms/Parameter
field_ids FieldIds} field_ids [:maybe [:sequential ms/IntGreaterThanZero]]}
(let [nil-query nil] (let [nil-query nil]
(parameter-values parameter field_ids nil-query))) (parameter-values parameter field_ids nil-query)))
#_{:clj-kondo/ignore [:deprecated-var]} (api/defendpoint POST "/parameter/search/:query"
(api/defendpoint-schema POST "/parameter/search/:query"
"Return parameter values for cards or dashboards that are being edited. Expects a query string at `?query=foo`." "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}] [query :as {{:keys [parameter field_ids]} :body}]
{parameter Parameter {parameter ms/Parameter
field_ids FieldIds field_ids [:maybe [:sequential ms/IntGreaterThanZero]]
query s/Str} query :string}
(parameter-values parameter field_ids query)) (parameter-values parameter field_ids query))
(api/define-routes) (api/define-routes)
...@@ -461,6 +461,7 @@ ...@@ -461,6 +461,7 @@
(mt/id :people :source)]}) (mt/id :people :source)]})
:values set)] :values set)]
(is (set/subset? #{["Doohickey"] ["Facebook"]} values)))) (is (set/subset? #{["Doohickey"] ["Facebook"]} values))))
(testing "search" (testing "search"
(let [values (-> (mt/user-http-request :rasta :post 200 (let [values (-> (mt/user-http-request :rasta :post 200
"dataset/parameter/search/g" "dataset/parameter/search/g"
...@@ -470,4 +471,13 @@ ...@@ -470,4 +471,13 @@
:values set)] :values set)]
;; results matched on g, does not include Doohickey (which is in above results) ;; results matched on g, does not include Doohickey (which is in above results)
(is (set/subset? #{["Widget"] ["Google"]} values)) (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))))))))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment