Skip to content

Commit

Permalink
If :format-rows? is false, return jave.util.Date for Druid DateTimes
Browse files Browse the repository at this point in the history
  • Loading branch information
sbelak committed Sep 28, 2017
1 parent c666aba commit cb52647
Showing 1 changed file with 38 additions and 14 deletions.
52 changes: 38 additions & 14 deletions src/metabase/driver/druid/query_processor.clj
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
(:require [cheshire.core :as json]
[clj-time.core :as time]
[clj-time.format :as tformat]
[clj-time.coerce :as tcoerce]
[clojure.core.match :refer [match]]
[clojure.math.numeric-tower :as math]
[clojure.string :as s]
Expand Down Expand Up @@ -730,14 +731,24 @@

(def ^:private druid-ts-format (tformat/formatters :date-time))

(def ^:private ^{:argslist '([timestamp])} parse-timestamp
(comp tcoerce/to-date (partial tformat/parse druid-ts-format)))

(defn- reformat-timestamp [timestamp target-formatter]
(->> timestamp
(tformat/parse druid-ts-format)
(tformat/unparse target-formatter)))

(defmethod post-process ::select [_ projections timezone results]
(let [update-ts-fn (if-let [target-formater (and timezone (tformat/with-zone druid-ts-format timezone))]
(defmethod post-process ::select [_ projections {:keys [timezone middleware]} results]
(let [target-formater (and timezone (tformat/with-zone druid-ts-format timezone))
update-ts-fn (cond
(false? (:format-rows? middleware))
#(update % :timestamp parse-timestamp)

target-formater
#(update % :timestamp reformat-timestamp target-formater)

:else
identity)]
(->> results
first
Expand All @@ -746,19 +757,30 @@
(map (comp update-ts-fn :event))
(post-process-map projections))))

(defmethod post-process ::total [_ projections timezone results]
(defmethod post-process ::total [_ projections _ results]
(post-process-map projections (map :result results)))

(defmethod post-process ::topN [_ projections timezone results]
(post-process-map projections (-> results first :result)))

(defmethod post-process ::groupBy [_ projections timezone results]
(post-process-map projections (map :event results)))

(defmethod post-process ::timeseries [_ projections timezone results]
(defmethod post-process ::topN [_ projections {:keys [middleware]} results]
(post-process-map projections
(let [results (-> results first :result)]
(if (false? (:format-rows? middleware))
(map #(u/update-when % :timestamp parse-timestamp) results)
results))))

(defmethod post-process ::groupBy [_ projections {:keys [middleware]} results]
(post-process-map projections
(if (false? (:format-rows? middleware))
(map (comp #(u/update-when % :timestamp parse-timestamp)
:event))
(map :event results))))

(defmethod post-process ::timeseries [_ projections {:keys [middleware]} results]
(post-process-map (conj projections :timestamp)
(for [event results]
(conj {:timestamp (:timestamp event)} (:result event)))))
(let [ts-getter (if (false? (:format-rows? middleware))
(comp parse-timestamp :timestamp)
:timestamp)]
(for [event results]
(conj {:timestamp (ts-getter event)} (:result event))))))

(defn post-process-native
"Post-process the results of a *native* Druid query.
Expand Down Expand Up @@ -824,7 +846,7 @@

(defn execute-query
"Execute a query for a Druid DB."
[do-query {database :database, {:keys [query query-type mbql? projections]} :native :as query-ctx}]
[do-query {database :database, {:keys [query query-type mbql? projections]} :native, middleware :middleware :as query-ctx}]
{:pre [database query]}
(let [details (:details database)
query (if (string? query)
Expand All @@ -833,7 +855,9 @@
query-type (or query-type (keyword "metabase.driver.druid.query-processor" (name (:queryType query))))
post-proc-map (->> query
(do-query details)
(post-process query-type projections (resolve-timezone query-ctx)))
(post-process query-type projections
{:timezone (resolve-timezone query-ctx)
:middleware middleware}))
columns (if mbql?
(->> post-proc-map
:projections
Expand Down

0 comments on commit cb52647

Please sign in to comment.