Adds an order by clause on the selected column. Entry points:
Requirements:
Query transformation:
Question transformation:
| (ns metabase.lib.drill-thru.sort (:require [medley.core :as m] [metabase.lib.drill-thru.common :as lib.drill-thru.common] [metabase.lib.equality :as lib.equality] [metabase.lib.order-by :as lib.order-by] [metabase.lib.schema :as lib.schema] [metabase.lib.schema.drill-thru :as lib.schema.drill-thru] [metabase.lib.schema.order-by :as lib.schema.order-by] [metabase.lib.types.isa :as lib.types.isa] [metabase.util.malli :as mu])) |
Is | (defn- orderable-column? [query stage-number column-ref] (lib.equality/find-matching-column query stage-number column-ref (lib.order-by/orderable-columns query stage-number))) |
(mu/defn- existing-order-by-clause :- [:maybe ::lib.schema.order-by/order-by] [query stage-number column] (m/find-first (fn [[_direction _opts expr, :as _asc-or-desc-clause]] (lib.equality/find-matching-column query stage-number expr [column])) (lib.order-by/order-bys query stage-number))) | |
(mu/defn- existing-order-by-direction :- [:maybe ::lib.schema.order-by/direction] [query stage-number column] (when-let [[direction _opts _expr] (existing-order-by-clause query stage-number column)] direction)) | |
(mu/defn sort-drill :- [:maybe ::lib.schema.drill-thru/drill-thru.sort] "Sorting on a clicked column." [query :- ::lib.schema/query stage-number :- :int {:keys [column column-ref value], :as _context} :- ::lib.schema.drill-thru/context] ;; if we have a context with a `:column`, but no `:value`... (when (and (lib.drill-thru.common/mbql-stage? query stage-number) column (nil? value) (not (lib.types.isa/structured? column))) ;; ...and the column is orderable, we can return a sort drill-thru. (when (orderable-column? query stage-number column-ref) ;; check and see if there is already a sort on this column. If there is, we should only suggest flipping the ;; direction to the opposite of what it is now. If there is no existing sort, then return both directions as ;; options. (let [existing-direction (existing-order-by-direction query stage-number column)] {:lib/type :metabase.lib.drill-thru/drill-thru :type :drill-thru/sort :column column :sort-directions (case existing-direction :asc [:desc] :desc [:asc] [:asc :desc])})))) | |
(mu/defmethod lib.drill-thru.common/drill-thru-method :drill-thru/sort ([query stage-number drill] (lib.drill-thru.common/drill-thru-method query stage-number drill :asc)) ([query :- ::lib.schema/query stage-number :- :int {:keys [column], :as _drill} :- ::lib.schema.drill-thru/drill-thru.sort direction :- ::lib.schema.order-by/direction] (let [resolved-column (lib.drill-thru.common/breakout->resolved-column query stage-number column)] (-> query ;; remove all existing order bys (see #37633), then add the new one. (lib.order-by/remove-all-order-bys stage-number) (lib.order-by/order-by stage-number resolved-column (keyword direction)))))) | |
(defmethod lib.drill-thru.common/drill-thru-info-method :drill-thru/sort [_query _stage-number {directions :sort-directions}] {:type :drill-thru/sort :directions directions}) | |