Skip to content
Snippets Groups Projects
Commit ffc6e31f authored by Cam Saul's avatar Cam Saul
Browse files

Generic SQL formatting for fields / values from expanded query

parent c082bf93
No related branches found
No related tags found
No related merge requests found
......@@ -88,14 +88,19 @@
(extend-protocol IGenericSQLFormattable
Field
(formatted [{:keys [field-name base-type-special-type]}]
;; TODO
(keyword field-name))
(formatted [{:keys [field-name base-type special-type]}]
;; TODO - add Table names
(cond
(contains? #{:DateField :DateTimeField} base-type) `(raw ~(format "CAST(\"%s\" AS DATE)" field-name))
(= special-type :timestamp_seconds) `(raw ~((:cast-timestamp-seconds-field-to-date-fn qp/*driver*) field-name))
(= special-type :timestamp_milliseconds) `(raw ~((:cast-timestamp-milliseconds-field-to-date-fn qp/*driver*) field-name))
:else (keyword field-name)))
Value
(formatted [{:keys [value base-type special-type]}]
;; TODO
value))
(formatted [{:keys [value]}]
instance?
(if-not (instance? java.util.Date value) value
`(raw ~(format "CAST('%s' AS DATE)" (.toString ^java.util.Date value))))))
(defmethod apply-form :aggregation [[_ {:keys [aggregation-type field]}]]
......@@ -114,16 +119,14 @@
:sum `(aggregate (~'sum ~field) :sum)))))
;; TODO
(defmethod apply-form :breakout [[_ field-ids]]
(let [ ;; Group by all the breakout fields
field-names (map field-id->kw field-ids)
;; Add fields form only for fields that weren't specified in :fields clause -- we don't want to include it twice, or korma will barf
fields-not-in-fields-clause-names (->> field-ids
(filter (partial (complement contains?) (set (:fields (:query qp/*query*)))))
(map field-id->kw))]
`[(group ~@field-names)
(fields ~@fields-not-in-fields-clause-names)]))
(defmethod apply-form :breakout [[_ fields]]
`[ ;; Group by all the breakout fields
(group ~@(map formatted fields))
;; Add fields form only for fields that weren't specified in :fields clause -- we don't want to include it twice, or korma will barf
(fields ~@(->> fields
(filter (partial (complement contains?) (set (:fields (:query qp/*query*)))))
(map formatted)))])
(defmethod apply-form :fields [[_ fields]]
......
......@@ -40,6 +40,7 @@
[string :as s]
[walk :as walk])
[medley.core :as m]
[swiss.arrows :refer [-<>]]
[metabase.db :refer [sel]]
[metabase.models.field :as field]
[metabase.util :as u])
......@@ -72,13 +73,14 @@
;; ## -------------------- Public Interface --------------------
(defn- parse [query-dict]
(update-in query-dict [:query] #(->> (assoc %
(update-in query-dict [:query] #(-<> (set/rename-keys % {:order_by :order-by})
(assoc <>
:aggregation (parse-aggregation (:aggregation %))
:breakout (parse-breakout (:breakout %))
:fields (parse-fields (:fields %))
:filter (parse-filter (:filter %))
:order-by (parse-order-by (:order_by %)))
(m/filter-vals identity))))
:order-by (parse-order-by (:order-by %)))
(m/filter-vals identity <>))))
(defn expand
"Expand a query-dict."
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment