Created
July 25, 2025 20:43
-
-
Save camsaul/9f10c56be1827498f3c345980a9ee1a7 to your computer and use it in GitHub Desktop.
Simple QP debugging
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(def ^:dynamic *depth* -1) | |
(defn- middleware-fn-name [middleware-fn] | |
(if-let [fn-name (:name (meta middleware-fn))] | |
(if-let [fn-ns (:ns (meta middleware-fn))] | |
(symbol (format "%s/%s [%d]" (ns-name fn-ns) fn-name *depth*)) | |
fn-name) | |
middleware-fn)) | |
(defn- print-query-diff [middleware-fn before after] | |
(when (and qp.debug/*debug* | |
(zero? *depth*)) | |
(let [simplify (fn [form] | |
(walk/postwalk | |
(fn [form] | |
(cond-> form | |
(map? form) (dissoc | |
:base-type | |
:effective-type | |
:lib.convert/converted? | |
:lib/metadata | |
:lib/options | |
:lib/stage-metadata | |
:lib/type | |
:lib/uuid | |
:metabase.lib.query/transformation-added-base-type | |
:qp/stage-had-source-card | |
:qp/stage-is-from-source-card | |
:source-metadata | |
:source-query/entity-id | |
:source-query/model?))) | |
form)) | |
before (simplify before) | |
after (simplify after)] | |
(when-not (= before after) | |
(println (middleware-fn-name middleware-fn)) | |
(ddiff/pretty-print (ddiff/diff before after)))))) | |
(mu/defn- ->legacy :- mbql.s/Query | |
[query :- [:map | |
[:database ::lib.schema.id/database]]] | |
(lib/->legacy-MBQL query)) | |
(defn- ^:deprecated ensure-legacy [middleware-fn] | |
(-> (fn [query] | |
(let [query (cond-> query | |
(:lib/type query) ->legacy) | |
query' (middleware-fn query)] | |
(print-query-diff middleware-fn query query') | |
(vary-meta query' assoc :converted-form query))) | |
(with-meta (meta middleware-fn)))) | |
(mu/defn- ->mbql-5 :- ::lib.schema/query | |
[query :- [:map | |
[:database ::lib.schema.id/database] | |
;; sanity check: info should only get added in Clojure-land and shouldn't get transformed back and forth | |
;; from JSON; make sure it's in the expected shape | |
[:info {:optional true} [:maybe ::lib.schema.info/info]]]] | |
(cond->> query | |
(not (:lib/type query)) (lib/query (qp.store/metadata-provider)))) | |
(defn- ensure-pmbql [middleware-fn] | |
(-> (fn [query] | |
(let [query (->mbql-5 query) | |
query' (middleware-fn query)] | |
(print-query-diff middleware-fn query query') | |
(vary-meta query' assoc :converted-form query))) | |
(with-meta (meta middleware-fn)))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment