Skip to content

Instantly share code, notes, and snippets.

@camsaul
Created July 25, 2025 20:43
Show Gist options
  • Save camsaul/9f10c56be1827498f3c345980a9ee1a7 to your computer and use it in GitHub Desktop.
Save camsaul/9f10c56be1827498f3c345980a9ee1a7 to your computer and use it in GitHub Desktop.
Simple QP debugging
(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