Adds an expression clause based on the selected column and temporal unit. Entry points:
Query transformation:
Extra constraints:
| (ns metabase.lib.drill-thru.column-extract (:require [medley.core :as m] [metabase.lib.drill-thru.column-filter :as lib.drill-thru.column-filter] [metabase.lib.drill-thru.common :as lib.drill-thru.common] [metabase.lib.extraction :as lib.extraction] [metabase.lib.metadata.calculation :as lib.metadata.calculation] [metabase.lib.schema :as lib.schema] [metabase.lib.schema.drill-thru :as lib.schema.drill-thru] [metabase.lib.schema.extraction :as lib.schema.extraction] [metabase.lib.types.isa :as lib.types.isa] [metabase.util.i18n :as i18n] [metabase.util.malli :as mu])) |
(defn- column-extract-drill-for-column [query column]
(when-let [extractions (not-empty (lib.extraction/column-extractions query column))]
{:extractions extractions
:display-name (cond
(lib.types.isa/temporal? column) (i18n/tru "Extract day, month…")
(lib.types.isa/email? column) (i18n/tru "Extract domain, host…")
(lib.types.isa/URL? column) (i18n/tru "Extract domain, subdomain…"))})) | |
(mu/defn column-extract-drill :- [:maybe ::lib.schema.drill-thru/drill-thru.column-extract]
"Column clicks on temporal columns only.
Might add a stage, like `:drill-thru/column-filter` does, if the current stage has aggregations."
[query :- ::lib.schema/query
stage-number :- :int
{:keys [column column-ref value]} :- ::lib.schema.drill-thru/context]
(when (and column
(nil? value)
(lib.drill-thru.common/mbql-stage? query stage-number))
(when-let [drill (column-extract-drill-for-column query column)]
(when-let [drill-details (lib.drill-thru.column-filter/prepare-query-for-drill-addition
query stage-number column column-ref :expression)]
(merge drill
drill-details
{:lib/type :metabase.lib.drill-thru/drill-thru
:type :drill-thru/column-extract}))))) | |
(mu/defn extractions-for-drill :- [:sequential ::lib.schema.extraction/extraction] "Returns the extractions from a given drill." [drill :- ::lib.schema.drill-thru/drill-thru.column-extract] (:extractions drill)) | |
(defmethod lib.drill-thru.common/drill-thru-info-method :drill-thru/column-extract
[query stage-number drill]
(-> drill
(select-keys [:display-name :type])
(assoc :extractions (map #(lib.metadata.calculation/display-info query stage-number %)
(:extractions drill))))) | |
(defmethod lib.drill-thru.common/drill-thru-method :drill-thru/column-extract
[_query _stage-number {:keys [query stage-number column extractions]} & [tag]]
(let [tag (keyword tag)
extraction (m/find-first #(= (:tag %) tag) extractions)]
(lib.extraction/extract query stage-number
;; Replace the column on the extraction because we added an extra stage.
(assoc extraction :column column)))) | |