Created
June 3, 2021 19:53
-
-
Save dpsutton/504cba19bb513e11c1a12eecd25aca6c to your computer and use it in GitHub Desktop.
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
(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