Skip to content
Snippets Groups Projects
Commit 9ad9ca97 authored by Cam Saül's avatar Cam Saül
Browse files

Remove korma-entity from SQL driver protocol :honey_pot:

parent 2a64e6a1
Branches
Tags
No related merge requests found
......@@ -3,8 +3,7 @@
[clojure.set :as set]
[honeysql.core :as hsql]
[metabase.driver :as driver]
(metabase.driver.crate [analyze :as analyze]
[query-processor :as qp]
(metabase.driver.crate [query-processor :as qp]
[util :as crate-util])
[metabase.driver.generic-sql :as sql]
[metabase.util :as u]))
......@@ -67,8 +66,7 @@
(u/strict-extend CrateDriver
driver/IDriver
(merge (sql/IDriverSQLDefaultsMixin)
{:analyze-table analyze/analyze-table
:can-connect? (u/drop-first-arg can-connect?)
{:can-connect? (u/drop-first-arg can-connect?)
:date-interval crate-util/date-interval
:details-fields (constantly [{:name "hosts"
:display-name "Hosts"
......
(ns metabase.driver.crate.analyze
(:require [korma.core :as k]
[metabase.driver.generic-sql :as sql]
[metabase.models.field :as field]
[metabase.sync-database.analyze :as analyze]))
(defn- field-avg-length [field]
(or (some-> (sql/korma-entity (field/table field))
(k/select (k/aggregate (avg (k/sqlfn :CHAR_LENGTH
(sql/escape-field-name (:name field))))
:len))
first
:len
int)
0))
(defn- field-percent-urls [field]
(or (let [korma-table (sql/korma-entity (field/table field))]
(when-let [total-non-null-count (:count (first (k/select korma-table
(k/aggregate (count (k/raw "*")) :count)
(k/where {(sql/escape-field-name (:name field)) [not= nil]}))))]
(when (> total-non-null-count 0)
(when-let [url-count (:count (first (k/select korma-table
(k/aggregate (count (k/raw "*")) :count)
(k/where {(sql/escape-field-name (:name field)) [like "http%://_%.__%"]}))))]
(float (/ url-count total-non-null-count))))))
0.0))
(defn analyze-table
"Default implementation of `analyze-table` for SQL drivers."
[driver table new-table-ids]
((analyze/make-analyze-table driver
:field-avg-length-fn field-avg-length
:field-percent-urls-fn field-percent-urls)
driver
table
new-table-ids))
......@@ -5,8 +5,7 @@
[clojure.tools.logging :as log]
(honeysql [core :as hsql]
[format :as hformat])
(korma [core :as k]
[db :as kdb])
[korma.db :as kdb]
[metabase.driver :as driver]
[metabase.sync-database.analyze :as analyze]
metabase.query-processor.interface
......@@ -240,8 +239,7 @@
(defn- table-rows-seq [driver database table]
(query driver database table {:select [:*]}))
(defn- field-avg-length
[driver field]
(defn- field-avg-length [driver field]
(let [table (field/table field)
db (table/database table)]
(or (some-> (query driver db table {:select [[(hsql/call :avg (string-length-fn driver (qualify+escape table field))) :len]]})
......@@ -427,39 +425,3 @@
:mbql->native (resolve 'metabase.driver.generic-sql.query-processor/mbql->native)
:notify-database-updated notify-database-updated
:table-rows-seq table-rows-seq}))
;;; ### Util Fns
(defn create-db
"Like `korma.db/create-db`, but adds a fn to unescape escaped dots when generating SQL."
[spec]
(update-in (kdb/create-db spec) [:options :naming :fields] comp hx/unescape-dots))
(defn- db->korma-db
"Return a DB spec for Metabase DATABASE."
[{:keys [details engine], :as database}]
(let [spec (connection-details->spec (driver/engine->driver engine) details)]
(assoc (create-db spec)
:pool (db->jdbc-connection-spec database))))
(defn create-entity
"Like `korma.db/create-entity`, but takes a sequence of name components instead; escapes dots in names as well."
[name-components]
(k/create-entity (apply str (interpose "." (for [s name-components
:when (seq s)]
(name (hx/escape-dots (name s))))))))
(defn korma-entity
"Return a entity for [DB and] TABLE.
(-> (Table :id 100)
korma-entity
(select (aggregate (count :*) :count)))"
([table] (korma-entity (table/database table) table))
([db table] (let [{schema :schema, table-name :name} table]
(k/database
(create-entity [schema table-name])
(db->korma-db db)))))
......@@ -2,7 +2,6 @@
(:require [expectations :refer :all]
[metabase.db :as db]
[metabase.driver :as driver]
[metabase.driver.generic-sql :refer [korma-entity]]
(metabase.models [database :refer [Database]]
[field :refer [Field]]
[field-values :refer [FieldValues]]
......
......@@ -50,10 +50,6 @@
(add-fk-sql ^String [this, ^DatabaseDefinition dbdef, ^TableDefinition tabledef, ^FieldDefinition fielddef]
"*Optional* Return a `ALTER TABLE ADD CONSTRAINT FOREIGN KEY` statement.")
;; Other optional methods
(korma-entity [this, ^DatabaseDefinition dbdef, ^TableDefinition tabledef]
"*Optional* Return an entity for TABLEDEF.")
(prepare-identifier [this, ^String identifier]
"*OPTIONAL*. Prepare an identifier, such as a Table or Field name, when it is used in a SQL query.
This is used by drivers like H2 to transform names to upper-case.
......@@ -161,11 +157,9 @@
(let [spec (sql/connection-details->spec driver (i/database->connection-details driver context dbdef))]
(assoc spec :make-pool? (not (:short-lived? spec)))))
(defn default-korma-entity [driver {:keys [database-name], :as dbdef} {:keys [table-name]}]
(k/database (sql/create-entity (qualified-name-components driver database-name table-name))
(sql/create-db (database->spec driver :db dbdef))))
;;; Loading Table Data
;; Since different DBs have constraints on how we can do this, the logic is broken out into a few different functions
;; you can compose together a driver that works with a given DB.
;; (ex. SQL Server has a low limit on how many ? args we can have in a prepared statement, so it needs to be broken out into chunks;
......@@ -239,9 +233,8 @@
the calls the resulting function with the rows to insert."
[& wrap-insert-fns]
(fn [driver dbdef tabledef]
(let [entity (korma-entity driver dbdef tabledef)
spec (database->spec driver :db dbdef)
insert! ((apply comp wrap-insert-fns) (partial do-insert! driver spec (:table entity)))
(let [spec (database->spec driver :db dbdef)
insert! ((apply comp wrap-insert-fns) (partial do-insert! driver spec (:table-name tabledef)))
rows (load-data-get-rows driver dbdef tabledef)]
(insert! rows))))
......@@ -282,7 +275,6 @@
:drop-db-if-exists-sql default-drop-db-if-exists-sql
:drop-table-if-exists-sql default-drop-table-if-exists-sql
:execute-sql! default-execute-sql!
:korma-entity default-korma-entity
:load-data! load-data-chunked!
:pk-field-name (constantly "id")
:prepare-identifier (u/drop-first-arg identity)
......
......@@ -39,12 +39,6 @@
(defn quote-name [_ nm]
(str \" (s/upper-case nm) \"))
(defn- korma-entity [_ dbdef {:keys [table-name]}]
(-> (k/create-entity table-name)
(k/database (kdb/create-db (kdb/h2 (assoc (database->connection-details nil :db dbdef)
:naming {:keys s/lower-case
:fields s/upper-case}))))))
(def ^:private ^:const ^String create-db-sql
(str
;; We don't need to actually do anything to create a database here. Just disable the undo
......@@ -79,7 +73,6 @@
;; (never try connect as GUEST, since we're not giving them priviledges to create tables / etc)
(execute-sql! this :server dbdef sql))
:field-base-type->sql-type (u/drop-first-arg field-base-type->sql-type)
:korma-entity korma-entity
:load-data! generic/load-data-all-at-once!
:pk-field-name (constantly "ID")
:pk-sql-type (constantly "BIGINT AUTO_INCREMENT")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment