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

Add compile-time checked strict-extend fn :ghost:

parent d2a1d165
No related branches found
No related tags found
No related merge requests found
Showing
with 47 additions and 39 deletions
......@@ -370,11 +370,13 @@
(def ^:private driver (BigQueryDriver.))
(extend BigQueryDriver
(u/strict-extend BigQueryDriver
sql/ISQLDriver
(merge (sql/ISQLDriverDefaultsMixin)
{:apply-breakout (u/drop-first-arg apply-breakout)
:apply-order-by (u/drop-first-arg apply-order-by)
:column->base-type (constantly nil) ; these two are actually not applicable
:connection-details->spec (constantly nil) ; since we don't use JDBC
:current-datetime-fn (constantly (k/sqlfn* :CURRENT_TIMESTAMP))
:date (u/drop-first-arg date)
:field->alias (u/drop-first-arg field->alias)
......
......@@ -165,7 +165,7 @@
clojure.lang.Named
(getName [_] "Druid"))
(extend DruidDriver
(u/strict-extend DruidDriver
driver/IDriver
(merge driver/IDriverDefaultsMixin
{:can-connect? can-connect?
......
......@@ -201,9 +201,9 @@
(defn features
"Default implementation of `IDriver` `features` for SQL drivers."
[driver]
(set (cond-> [:foreign-keys
:standard-deviation-aggregations]
(set-timezone-sql driver) (conj :set-timezone))))
(cond-> #{:standard-deviation-aggregations
:foreign-keys}
(set-timezone-sql driver) (conj :set-timezone)))
;;; ## Database introspection methods used by sync process
......
......@@ -64,12 +64,11 @@
AgFieldRef
(formatted [_]
(let [{:keys [aggregation-type]} (:aggregation (:query *query*))]
(case aggregation-type
:avg :avg
:count :count
:distinct :count
:stddev :stddev
:sum :sum)))
;; For some arcane reason we name the results of a distinct aggregation "count",
;; everything else is named the same as the aggregation
(if (= aggregation-type :distinct)
:count
aggregation-type)))
Value
(formatted [value] (sql/prepare-value (driver) value))
......
......@@ -7,6 +7,7 @@
[metabase.driver :as driver]
[metabase.driver.generic-sql :as sql]
[metabase.models.database :refer [Database]]
[metabase.util :as u]
[metabase.util.korma-extensions :as kx]))
(defn- column->base-type [_ column-type]
......@@ -196,7 +197,7 @@
clojure.lang.Named
(getName [_] "H2"))
(extend H2Driver
(u/strict-extend H2Driver
driver/IDriver
(merge (sql/IDriverSQLDefaultsMixin)
{:date-interval date-interval
......@@ -213,7 +214,6 @@
:column->base-type column->base-type
:connection-details->spec connection-details->spec
:date date
:date-interval date-interval
:string-length-fn (constantly :LENGTH)
:unix-timestamp->timestamp unix-timestamp->timestamp}))
......
......@@ -159,7 +159,7 @@
clojure.lang.Named
(getName [_] "MongoDB"))
(extend MongoDriver
(u/strict-extend MongoDriver
driver/IDriver
(merge driver/IDriverDefaultsMixin
{:analyze-table analyze-table
......
......@@ -140,7 +140,7 @@
clojure.lang.Named
(getName [_] "MySQL"))
(extend MySQLDriver
(u/strict-extend MySQLDriver
driver/IDriver
(merge (sql/IDriverSQLDefaultsMixin)
{:date-interval date-interval
......
......@@ -186,7 +186,7 @@
:string-length-fn (constantly :CHAR_LENGTH)
:unix-timestamp->timestamp unix-timestamp->timestamp}))
(extend PostgresDriver
(u/strict-extend PostgresDriver
driver/IDriver
(merge (sql/IDriverSQLDefaultsMixin)
{:date-interval date-interval
......
......@@ -116,7 +116,8 @@
(def ^:ql ^{:arglists '([f])} cum-sum "Aggregation clause. Return the cumulative sum of the values of F." (partial ag-with-field :cumulative-sum))
(defn ^:ql stddev
"Aggregation clause. Return the standard deviation of values of F."
"Aggregation clause. Return the standard deviation of values of F.
Requires the feature `:standard-deviation-aggregations`."
[f]
(i/assert-driver-supports :standard-deviation-aggregations)
(ag-with-field :stddev f))
......
......@@ -56,8 +56,8 @@
:resolve-field (fn [this _] this)
:resolve-table (fn [this _] this)})
(extend Object IResolve IResolveDefaults)
(extend nil IResolve IResolveDefaults)
(u/strict-extend Object IResolve IResolveDefaults)
(u/strict-extend nil IResolve IResolveDefaults)
;;; ## ------------------------------------------------------------ FIELD ------------------------------------------------------------
......@@ -84,7 +84,7 @@
:table-name (:name table)
:schema-name (:schema table))))
(extend Field
(u/strict-extend Field
IResolve (merge IResolveDefaults
{:unresolved-field-id field-unresolved-field-id
:resolve-field field-resolve-field
......@@ -107,7 +107,7 @@
;; If that fails just return ourselves as-is
this))
(extend FieldPlaceholder
(u/strict-extend FieldPlaceholder
IResolve (merge IResolveDefaults
{:unresolved-field-id :field-id
:fk-field-id :fk-field-id
......@@ -147,7 +147,7 @@
(throw (Exception. (format "Unable to resolve field: %s" field-placeholder))))
(parse-value resolved-field value)))
(extend ValuePlaceholder
(u/strict-extend ValuePlaceholder
IResolve (merge IResolveDefaults
{:resolve-field value-ph-resolve-field}))
......
......@@ -5,8 +5,9 @@
[db :as kdb])
(metabase [config :as config]
[driver :as driver])
[metabase.driver.generic-sql :as sql]
[metabase.driver.postgres :as postgres]
(metabase.driver [generic-sql :as sql]
[postgres :as postgres])
[metabase.util :as u]
[metabase.util.korma-extensions :as kx]))
(defn- connection-details->spec [_ details]
......@@ -55,7 +56,7 @@
clojure.lang.Named
(getName [_] "Amazon Redshift"))
(extend RedshiftDriver
(u/strict-extend RedshiftDriver
driver/IDriver
(merge (sql/IDriverSQLDefaultsMixin)
{:date-interval date-interval
......
......@@ -103,7 +103,7 @@
clojure.lang.Named
(getName [_] "SQLite"))
(extend SQLiteDriver
(u/strict-extend SQLiteDriver
driver/IDriver
(merge (sql/IDriverSQLDefaultsMixin)
{:date-interval date-interval
......
......@@ -4,6 +4,7 @@
[db :as kdb])
[metabase.driver :as driver]
[metabase.driver.generic-sql :as sql]
[metabase.util :as u]
[metabase.util.korma-extensions :as kx])
(:import net.sourceforge.jtds.jdbc.Driver)) ; need to import this in order to load JDBC driver
......@@ -129,7 +130,7 @@
clojure.lang.Named
(getName [_] "SQL Server"))
(extend SQLServerDriver
(u/strict-extend SQLServerDriver
driver/IDriver
(merge (sql/IDriverSQLDefaultsMixin)
{:date-interval date-interval
......
......@@ -29,7 +29,7 @@
"segment" (db/exists? Segment, :id model_id, :is_active true)
nil))
(extend (class Activity)
(u/strict-extend (class Activity)
i/IEntity
(merge i/IEntityDefaults
{:types (constantly {:details :json, :topic :keyword})
......
......@@ -5,7 +5,8 @@
(metabase.models [dependency :as dependency]
[interface :as i]
[revision :as revision])
[metabase.query :as q]))
(metabase [query :as q]
[util :as u])))
(def ^:const display-types
"Valid values of `Card.display_type`."
......@@ -73,7 +74,7 @@
:Segment (q/extract-segment-ids (:query dataset_query))}))
(extend (class Card)
(u/strict-extend (class Card)
i/IEntity
(merge i/IEntityDefaults
{:hydration-keys (constantly [:card])
......
(ns metabase.models.card-favorite
(:require [metabase.models.interface :as i]))
(:require [metabase.models.interface :as i]
[metabase.util :as u]))
(i/defentity CardFavorite :report_cardfavorite)
(extend (class CardFavorite)
(u/strict-extend (class CardFavorite)
i/IEntity
(merge i/IEntityDefaults
{:timestamped? (constantly true)}))
......@@ -23,7 +23,7 @@
(i/defentity Dashboard :report_dashboard)
(extend (class Dashboard)
(u/strict-extend (class Dashboard)
i/IEntity
(merge i/IEntityDefaults
{:timestamped? (constantly true)
......@@ -111,7 +111,7 @@
build-sentence)))))
(extend (class Dashboard)
(u/strict-extend (class Dashboard)
revision/IRevisioned
(merge revision/IRevisionedDefaults
{:serialize-instance (fn [_ _ dashboard] (serialize-dashboard dashboard))
......
......@@ -24,7 +24,7 @@
(defn- pre-cascade-delete [{:keys [id]}]
(db/cascade-delete 'DashboardCardSeries :dashboardcard_id id))
(extend (class DashboardCard)
(u/strict-extend (class DashboardCard)
i/IEntity
(merge i/IEntityDefaults
{:timestamped? (constantly true)
......
......@@ -3,7 +3,8 @@
[korma.core :as k]
[metabase.api.common :refer [*current-user*]]
[metabase.db :refer [cascade-delete sel]]
[metabase.models.interface :as i]))
[metabase.models.interface :as i]
[metabase.util :as u]))
(def ^:const protected-password
"The string to replace passwords with when serializing Databases."
......@@ -26,7 +27,7 @@
[{:keys [id]}]
(sel :many 'Table :db_id id, :active true, (k/order :display_name :ASC)))
(extend (class Database)
(u/strict-extend (class Database)
i/IEntity
(merge i/IEntityDefaults
{:hydration-keys (constantly [:database :db])
......
......@@ -4,7 +4,8 @@
(metabase.models [common :as common]
[field-values :refer [FieldValues]]
[foreign-key :refer [ForeignKey]]
[interface :as i])))
[interface :as i])
[metabase.util :as u]))
(def ^:const special-types
"Possible values for `Field.special_type`."
......@@ -114,7 +115,7 @@
(let [dest-id (sel :one :field [ForeignKey :destination_id] :origin_id id)]
(Field dest-id))))
(extend (class Field)
(u/strict-extend (class Field)
i/IEntity (merge i/IEntityDefaults
{:hydration-keys (constantly [:destination :field :origin])
:types (constantly {:base_type :keyword, :field_type :keyword, :special_type :keyword, :description :clob})
......
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