Skip to content

Instantly share code, notes, and snippets.

@camsaul
Created March 11, 2021 19:58
Show Gist options
  • Save camsaul/34b3aa9b3f98ae44a3c51aae66bd8eb7 to your computer and use it in GitHub Desktop.
Save camsaul/34b3aa9b3f98ae44a3c51aae66bd8eb7 to your computer and use it in GitHub Desktop.
Metabase MBQL Driver (demo)
(ns metabase.driver.mbql
(:require [cheshire.core :as json]
[metabase.driver :as driver]
[metabase.driver.sql-jdbc.connection :as sql-jdbc.conn]
[metabase.mbql.normalize :as normalize]
[metabase.models :refer [Database]]
[metabase.query-processor :as qp]
[metabase.query-processor.store :as qp.store]
[toucan.db :as db]))
(driver/register! :mbql, :parent :h2)
(defmethod driver/connection-properties :mbql
[_]
[])
(defmethod driver/can-connect? :mbql
[_ _]
true)
(defmethod sql-jdbc.conn/connection-details->spec :mbql
[_ details-map]
(sql-jdbc.conn/connection-details->spec :h2 (db/select-one-field :details Database :engine "h2", :name "Sample Dataset")))
(defmethod driver/mbql->native :mbql
[_ query]
query)
(defmethod driver/execute-reducible-query :mbql
[_ query context respond]
(let [mbql (-> query
:native
:query
(json/parse-string true)
normalize/normalize)]
(println "MBQL =>" (pr-str mbql))
(qp.store/with-store
(let [mbql (qp/query->preprocessed mbql)
sql-query (sql.qp/mbql->native :h2 mbql)]
(println "sql-query:" (:query sql-query))
(sql-jdbc.execute/execute-reducible-query :h2 {:native sql-query} context respond)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment