Skip to content
Snippets Groups Projects
Commit 8767368b authored by Allen Gilliland's avatar Allen Gilliland
Browse files

fix up Crate driver.

parent 2d64fcee
No related branches found
No related tags found
No related merge requests found
......@@ -4,8 +4,7 @@
[metabase.driver.generic-sql :as sql]
(metabase.driver.crate [query-processor :as qp]
[util :as u]
[generic-sql :as gs]
[native :as n])
[generic-sql :as gs])
[korma.core :as k])
(:import (clojure.lang Named)))
......@@ -82,13 +81,13 @@
(extend CrateDriver
driver/IDriver
(merge (sql/IDriverSQLDefaultsMixin)
{:details-fields (constantly [{:name "hosts"
:display-name "Hosts"
:default "//localhost:4300"}])
{:analyze-table gs/analyze-table
:can-connect? can-connect
:date-interval u/date-interval
:analyze-table gs/analyze-table
:process-native n/process-and-run
:details-fields (constantly [{:name "hosts"
:display-name "Hosts"
:default "//localhost:4300"}])
:execute-query qp/execute-query
:features (fn [this]
(set/difference (sql/features this)
#{:foreign-keys}))})
......
(ns metabase.driver.crate.native
(:require [clojure.java.jdbc :as jdbc]
[metabase.models.database :refer [Database]]
[metabase.db :refer [sel]]
[metabase.driver.generic-sql :as sql]
[clojure.tools.logging :as log]
[metabase.util :as u]
[metabase.driver.generic-sql.native :as n]))
(defn process-and-run
"Process and run a native (raw SQL) QUERY."
[driver {{sql :query} :native, database-id :database, :as query}]
(try (let [database (sel :one :fields [Database :engine :details] :id database-id)
db-conn (sql/db->jdbc-connection-spec database)]
(jdbc/with-db-connection [t-conn db-conn]
(let [^java.sql.Connection jdbc-connection (:connection t-conn)]
(try
;; Now run the query itself
(log/debug (u/format-color 'green "%s" sql))
(let [[columns & [first-row :as rows]] (jdbc/query t-conn sql, :as-arrays? true)]
{:rows rows
:columns columns
:cols (for [[column first-value] (partition 2 (interleave columns first-row))]
{:name column
:base_type (n/value->base-type first-value)})})))))
(catch java.sql.SQLException e
(let [^String message (or (->> (.getMessage e) ; error message comes back like 'Column "ZID" not found; SQL statement: ... [error-code]' sometimes
(re-find #"^(.*);") ; the user already knows the SQL, and error code is meaningless
second) ; so just return the part of the exception that is relevant
(.getMessage e))]
(throw (Exception. message))))))
(ns metabase.driver.crate.query-processor
(:require [korma.core :as k]
[metabase.driver.generic-sql.query-processor :as qp]
[korma.sql.fns :as kfns]
(:require [clojure.java.jdbc :as jdbc]
[korma.core :as k]
[korma.sql.engine :as kengine]
[korma.sql.fns :as kfns]
[metabase.driver.generic-sql :as sql]
[metabase.driver.generic-sql.query-processor :as qp]
[metabase.query-processor.interface :as i])
(:import (metabase.query_processor.interface ComparisonFilter CompoundFilter)))
......@@ -28,3 +30,23 @@
"Apply custom generic SQL filter. This is the place to perform query rewrites."
[_ korma-form {clause :filter}]
(k/where korma-form (resolve-subclauses clause)))
(defn execute-query
"Execute a query against Crate database.
We specifically write out own `execute-query` function to avoid the autoCommit(false) call."
[_ {:keys [database], {sql :query, params :params} :native}]
(try (let [db-conn (sql/db->jdbc-connection-spec database)]
(jdbc/with-db-transaction [t-conn db-conn]
(let [statement (if params
(into [sql] params)
sql)]
(let [[columns & rows] (jdbc/query t-conn statement, :identifiers identity, :as-arrays? true)]
{:rows rows
:columns columns}))))
(catch java.sql.SQLException e
(let [^String message (or (->> (.getMessage e) ; error message comes back like 'Column "ZID" not found; SQL statement: ... [error-code]' sometimes
(re-find #"^(.*);") ; the user already knows the SQL, and error code is meaningless
second) ; so just return the part of the exception that is relevant
(.getMessage e))]
(throw (Exception. message))))))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment