From 846aab76c3d914441b5dd062701a92bf67afd7b0 Mon Sep 17 00:00:00 2001 From: Simon Belak <simon@metabase.com> Date: Thu, 15 Aug 2019 17:56:50 +0100 Subject: [PATCH] Don't disable preview for fields with non-trivial type (#9687) --- src/metabase/automagic_dashboards/core.clj | 1 + .../classifiers/no_preview_display.clj | 17 ++++--- .../classifiers/no_preview_display_test.clj | 44 +++++++++++++++++++ 3 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 test/metabase/sync/analyze/classifiers/no_preview_display_test.clj diff --git a/src/metabase/automagic_dashboards/core.clj b/src/metabase/automagic_dashboards/core.clj index 44b75af192b..e4371f36aaf 100644 --- a/src/metabase/automagic_dashboards/core.clj +++ b/src/metabase/automagic_dashboards/core.clj @@ -737,6 +737,7 @@ (comp (->> (db/select Field :table_id [:in (map u/get-id tables)] :visibility_type "normal" + :preview_display true :active true) field/with-targets (map #(assoc % :engine engine)) diff --git a/src/metabase/sync/analyze/classifiers/no_preview_display.clj b/src/metabase/sync/analyze/classifiers/no_preview_display.clj index d508aa8cee1..ec75050785d 100644 --- a/src/metabase/sync/analyze/classifiers/no_preview_display.clj +++ b/src/metabase/sync/analyze/classifiers/no_preview_display.clj @@ -5,16 +5,21 @@ (:require [metabase.sync.interface :as i] [schema.core :as s])) -(def ^:private ^:const ^Integer average-length-no-preview-threshold +(def ^:private ^:const ^Long average-length-no-preview-threshold "Fields whose values' average length is greater than this amount should be marked as `preview_display = false`." 50) +(defn- long-plain-text-field? + [{:keys [base_type special_type]} fingerprint] + (and (isa? base_type :type/Text) + (contains? #{nil :type/SerializedJSON} special_type) + (some-> fingerprint + (get-in [:type :type/Text :average-length]) + (> average-length-no-preview-threshold)))) + (s/defn infer-no-preview-display :- (s/maybe i/FieldInstance) "Classifier that determines whether FIELD should be marked 'No Preview Display'. If FIELD is textual and its average length is too great, mark it so it isn't displayed in the UI." [field :- i/FieldInstance, fingerprint :- (s/maybe i/Fingerprint)] - (when (isa? (:base_type field) :type/Text) - (when-let [average-length (get-in fingerprint [:type :type/Text :average-length])] - (when (> average-length average-length-no-preview-threshold) - (assoc field - :preview_display false))))) + (when (long-plain-text-field? field fingerprint) + (assoc field :preview_display false))) diff --git a/test/metabase/sync/analyze/classifiers/no_preview_display_test.clj b/test/metabase/sync/analyze/classifiers/no_preview_display_test.clj new file mode 100644 index 00000000000..4f7cbb9f423 --- /dev/null +++ b/test/metabase/sync/analyze/classifiers/no_preview_display_test.clj @@ -0,0 +1,44 @@ +(ns metabase.sync.analyze.classifiers.no-preview-display-test + "Tests for the category classifier." + (:require [expectations :refer :all] + [metabase.models.field :as field] + [metabase.sync.analyze.classifiers.no-preview-display :refer :all])) + +(def ^:private long-text-field + (field/map->FieldInstance + {:database_type "VARCHAR" + :special_type nil + :name "longfield" + :fingerprint_version 1 + :has_field_values nil + :active true + :visibility_type :normal + :preview_display true + :display_name "Mr. Long" + :fingerprint {:global {:distinct-count 42} + :type + {:type/Text + {:percent-json 0.0 + :percent-url 0.0 + :percent-email 0.0 + :average-length 130.516}}} + :base_type :type/Text})) + +;; Leave short text fields intact +(expect + nil + (:preview_display (infer-no-preview-display long-text-field + (-> long-text-field + :fingerprint + (assoc-in [:type :type/Text :average-length] 2))))) + +;; Don't preview generic long text fields +(expect + false + (:preview_display (infer-no-preview-display long-text-field (:fingerprint long-text-field)))) + +;; If the field has a special type, show it regardless of it's length +(expect + nil + (:preview_display (infer-no-preview-display (assoc long-text-field :special_type :type/Name) + (:fingerprint long-text-field)))) -- GitLab