Skip to content

Instantly share code, notes, and snippets.

@dpsutton
Created June 3, 2021 19:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dpsutton/504cba19bb513e11c1a12eecd25aca6c to your computer and use it in GitHub Desktop.
Save dpsutton/504cba19bb513e11c1a12eecd25aca6c to your computer and use it in GitHub Desktop.
(ns dev.nocommit.pprint-middleware
(:require [honeysql.core :as hsql]
[sql-honey.core :as sqlhoney]
[metabase.models.database :refer [Database]]
[clojure.string :as str])
(:import org.apache.openjpa.lib.jdbc.SQLFormatter))
(let [formatter (SQLFormatter.)]
(println
(.prettyPrint formatter "select * from orders")))
(comment
;; need the following in project clj
;; bump pretty top level
[pretty "1.0.5"]
;; add into dev profile
[com.camsaul/sqlhoney "0.1.0-alpha-SNAPSHOT"]
[org.apache.openjpa/openjpa "3.2.0"]
)
(defn report-success
[version parsed]
(run! tap> (concat [(str (name version) " ---->")]
(str/split-lines parsed)
[(str (name version) "<----")])))
(defn report-error
[version query e]
(tap> {:version version
:failed query
:message (ex-data e)}))
(defn pprint-queries
[qp]
(fn [{:keys [native database] :as query} rff context]
(when (and (contains? #{:postgres :h2 :mysql} (:engine (Database database)))
(contains? native :query))
(try (let [parsed (with-out-str
(sqlhoney/pretty-print-sql (:query native)))]
(report-success :sqlhoney parsed))
(catch Exception e
(report-error :sqlhoney (:query native) e)))
(try (let [formatter (SQLFormatter.)]
(report-success :openjpa (.prettyPrint formatter (:query native))))
(catch Exception e
(report-error :openjpq (:query native) e))))
(qp query rff context)))
(comment
(alter-var-root #'metabase.query-processor/default-middleware (fn [middleware]
(into [#'pprint-queries]
middleware)))
(in-ns 'metabase.query-processor)
(def ^{:arglists '([query] [query context])} process-query-async
"Process a query asynchronously, returning a `core.async` channel that is called with the final result (or Throwable)."
(base-qp default-middleware))
(def userland-middleware
"The default set of middleware applied to 'userland' queries ran via `process-query-and-save-execution!` (i.e., via
the REST API)."
(concat
default-middleware
[#'constraints/add-default-userland-constraints
#'process-userland-query/process-userland-query
#'catch-exceptions/catch-exceptions]))
(def ^{:arglists '([query] [query context])} process-userland-query-async
"Like `process-query-async`, but for 'userland' queries (e.g., queries ran via the REST API). Adds extra middleware."
(base-qp userland-middleware))
(def ^{:arglists '([query] [query context])} process-userland-query-sync
"Like `process-query-sync`, but for 'userland' queries (e.g., queries ran via the REST API). Adds extra middleware."
(qp.reducible/sync-qp process-userland-query-async))
(in-ns 'dev.nocommit.pprint-middleware))
;; undo:
#_(require 'metabase.query-processor :reload)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment