diff --git a/src/metabase/automagic_dashboards/core.clj b/src/metabase/automagic_dashboards/core.clj index 44b75af192bf7a6ee12d55f7248d7e038b86ee3e..e4371f36aaf4ee96aaa7a82f46fa6eebfca24bef 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 d508aa8cee1f1d0f5004a65af1ebf910179520cc..ec75050785d24bd0508634a02076242a5b6b53d5 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 0000000000000000000000000000000000000000..4f7cbb9f42385077ea0a67572699d57d161d98f2 --- /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))))