From 14433723a8ae76db7954e012d7bc003e120b5b98 Mon Sep 17 00:00:00 2001 From: Oleksandr Yakushev <alex@bytopia.org> Date: Wed, 30 Oct 2024 14:00:35 +0200 Subject: [PATCH] [insights] Ensure that timestamps aren't converted to ratios (#49204) --- src/metabase/analyze/fingerprint/insights.clj | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/metabase/analyze/fingerprint/insights.clj b/src/metabase/analyze/fingerprint/insights.clj index a5b107e3cc6..f8d5abd455f 100644 --- a/src/metabase/analyze/fingerprint/insights.clj +++ b/src/metabase/analyze/fingerprint/insights.clj @@ -194,7 +194,7 @@ (= (count datetimes) 1))) ;; We downsize UNIX timestamps to lessen the chance of overflows and numerical instabilities. -(def ^Long ^:const ^:private ms-in-a-day (* 1000 60 60 24)) +(def ^Double ^:const ^:private ms-in-a-day (* 1000.0 60 60 24)) (defn- ms->day [dt] @@ -225,15 +225,14 @@ (m/find-first (partial valid-period? from to) (keys unit->duration))) (defn- ->millis-from-epoch [t] - (when t - (condp instance? t - Instant (.toEpochMilli ^Instant t) - OffsetDateTime (.toEpochMilli (.toInstant ^OffsetDateTime t)) - ZonedDateTime (.toEpochMilli (.toInstant ^ZonedDateTime t)) - LocalDate (->millis-from-epoch (t/offset-date-time t (t/local-time 0) (t/zone-offset 0))) - LocalDateTime (->millis-from-epoch (t/offset-date-time t (t/zone-offset 0))) - LocalTime (->millis-from-epoch (t/offset-date-time (t/local-date "1970-01-01") t (t/zone-offset 0))) - OffsetTime (->millis-from-epoch (t/offset-date-time (t/local-date "1970-01-01") t (t/zone-offset t)))))) + (cond (instance? Instant t) (.toEpochMilli ^Instant t) + (instance? OffsetDateTime t) (.toEpochMilli (.toInstant ^OffsetDateTime t)) + (instance? ZonedDateTime t) (.toEpochMilli (.toInstant ^ZonedDateTime t)) + (instance? LocalDate t) (recur (t/offset-date-time t (t/local-time 0) (t/zone-offset 0))) + (instance? LocalDateTime t) (recur (t/offset-date-time t (t/zone-offset 0))) + (instance? LocalTime t) (recur (t/offset-date-time (t/local-date "1970-01-01") t (t/zone-offset 0))) + (instance? OffsetTime t) (recur (t/offset-date-time (t/local-date "1970-01-01") t (t/zone-offset t))) + :else (throw (ex-info (str "->millis-from-epoch: unsupported type " (class t)) {})))) (defn- timeseries-insight [{:keys [numbers datetimes]}] -- GitLab