(ns metabase.lib.swap (:require [metabase.lib.options :as lib.options] [metabase.lib.util :as lib.util] [metabase.util.log :as log])) | |
(defn- swap-failure-no-match [stage target-clause] (log/warn "No matching clause in swap-clauses" target-clause stage)) | |
(defn- swap-failure-ambiguous [target-clause matches] (log/warn "Ambiguous match for clause in swap-clauses" target-clause matches)) | |
(defn- uuid-match [stage target-clause] (let [target-uuid (lib.options/uuid target-clause) matches (for [root [:aggregation :breakout :expressions :filters :order-by] index (range (count (get stage root))) :let [path [root index] clause (get-in stage path)] :when (= (lib.options/uuid clause) target-uuid)] path)] (case (count matches) 1 (first matches) 0 (swap-failure-no-match stage target-clause) (swap-failure-ambiguous target-clause matches)))) | |
(defn- do-swap [stage source-path target-path source-clause target-clause] (-> stage (assoc-in source-path target-clause) (assoc-in target-path source-clause))) | |
Given a Returns the query with the two clauses exchanged. If either clause is not found inside the same list, emits a warning and returns the query unchanged. | (defn swap-clauses [query stage-number source-clause target-clause] (let [stage (lib.util/query-stage query stage-number) source-path (uuid-match stage source-clause) target-path (uuid-match stage target-clause)] (if (and source-path target-path) (lib.util/update-query-stage query stage-number do-swap source-path target-path source-clause target-clause) query))) |