From cd0da5a16e405e9a53f0ab58278ee34c43b95649 Mon Sep 17 00:00:00 2001 From: Cam Saul <cam@geotip.com> Date: Mon, 6 Jul 2015 15:48:05 -0700 Subject: [PATCH] Add some error checking to hydrate; complain when nested hydration vectors are used incorrectly --- src/metabase/api/meta/table.clj | 2 +- src/metabase/models/hydrate.clj | 5 ++++- test/metabase/models/hydrate_test.clj | 12 +++++++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/metabase/api/meta/table.clj b/src/metabase/api/meta/table.clj index 07e83da6196..552bac779f0 100644 --- a/src/metabase/api/meta/table.clj +++ b/src/metabase/api/meta/table.clj @@ -62,7 +62,7 @@ {include_sensitive_fields String->Boolean} (->404 (sel :one Table :id id) read-check - (hydrate :db [:fields [:target]] :field_values) + (hydrate :db [:fields :target] :field_values) (update-in [:fields] (if include_sensitive_fields ;; If someone passes include_sensitive_fields return hydrated :fields as-is identity diff --git a/src/metabase/models/hydrate.clj b/src/metabase/models/hydrate.clj index 1c684efec9f..b5f81f4cc74 100644 --- a/src/metabase/models/hydrate.clj +++ b/src/metabase/models/hydrate.clj @@ -117,7 +117,10 @@ (defn- hydrate-vector "Hydrate a nested hydration form (vector) by recursively calling `hydrate`." - [results [k & more]] + [results [k & more :as vect]] + ;; TODO - it would be super snazzy if we could make this a compile-time check + (assert (> (count vect) 1) + (format "Replace '%s' with '%s'. Vectors are for nested hydration. There's no need to use one when you only have a single key." vect (first vect))) (let [results (hydrate results k)] (if-not (seq more) results (counts-apply results k #(apply hydrate % more))))) diff --git a/test/metabase/models/hydrate_test.clj b/test/metabase/models/hydrate_test.clj index bf98426bc2b..af9098d703a 100644 --- a/test/metabase/models/hydrate_test.clj +++ b/test/metabase/models/hydrate_test.clj @@ -237,11 +237,13 @@ :b d2} :b)) -;; specifying "nested" hydration with no "nested" keys should still work -(expect {:a 1 :b 2} - (hydrate {:a 1 - :b d2} - [:b])) +;; specifying "nested" hydration with no "nested" keys should throw an exception and tell you not to do it +(expect "Assert failed: Replace '[:b]' with ':b'. Vectors are for nested hydration. There's no need to use one when you only have a single key.\n(> (count vect) 1)" + (try (hydrate {:a 1 + :b d2} + [:b]) + (catch Throwable e + (.getMessage e)))) ;; check that returning an array works correctly (expect {:c [1 2 3]} -- GitLab