parent
9c40ff4879
commit
e70e3713fc
4 changed files with 47 additions and 2 deletions
|
|
@ -51,6 +51,7 @@
|
||||||
:create-extension
|
:create-extension
|
||||||
:drop-table :drop-view :drop-materialized-view :drop-extension
|
:drop-table :drop-view :drop-materialized-view :drop-extension
|
||||||
:refresh-materialized-view
|
:refresh-materialized-view
|
||||||
|
:create-index
|
||||||
;; then SQL clauses in priority order:
|
;; then SQL clauses in priority order:
|
||||||
:raw :nest :with :with-recursive :intersect :union :union-all :except :except-all
|
:raw :nest :with :with-recursive :intersect :union :union-all :except :except-all
|
||||||
:table
|
:table
|
||||||
|
|
@ -1255,6 +1256,17 @@
|
||||||
(into more)
|
(into more)
|
||||||
(conj (when as (sql-kw as))))))]))
|
(conj (when as (sql-kw as))))))]))
|
||||||
|
|
||||||
|
(defn- format-create-index [k clauses]
|
||||||
|
(let [[index-spec [table & exprs]] clauses
|
||||||
|
[pre entity ine & more] (destructure-ddl-item index-spec (str (sql-kw k) " options"))
|
||||||
|
[sqls params] (format-expr-list exprs)]
|
||||||
|
(into [(str/join " " (remove empty?
|
||||||
|
(-> ["CREATE" pre "INDEX" ine entity
|
||||||
|
"ON" (format-entity table)
|
||||||
|
(str "(" (str/join ", " sqls) ")")]
|
||||||
|
(into more))))]
|
||||||
|
params)))
|
||||||
|
|
||||||
(defn- format-with-data [_ data]
|
(defn- format-with-data [_ data]
|
||||||
(let [data (if (sequential? data) (first data) data)]
|
(let [data (if (sequential? data) (first data) data)]
|
||||||
[(str/join " " (remove nil?
|
[(str/join " " (remove nil?
|
||||||
|
|
@ -1433,6 +1445,7 @@
|
||||||
:drop-view #'format-drop-items
|
:drop-view #'format-drop-items
|
||||||
:drop-materialized-view #'format-drop-items
|
:drop-materialized-view #'format-drop-items
|
||||||
:refresh-materialized-view (fn [_ x] (format-create :refresh :materialized-view x nil))
|
:refresh-materialized-view (fn [_ x] (format-create :refresh :materialized-view x nil))
|
||||||
|
:create-index #'format-create-index
|
||||||
:raw (fn [_ x] (raw-render x))
|
:raw (fn [_ x] (raw-render x))
|
||||||
:nest (fn [_ x]
|
:nest (fn [_ x]
|
||||||
(let [[sql & params] (format-dsl x {:nested true})]
|
(let [[sql & params] (format-dsl x {:nested true})]
|
||||||
|
|
|
||||||
|
|
@ -375,6 +375,20 @@
|
||||||
[& views]
|
[& views]
|
||||||
(generic :refresh-materialized-view views))
|
(generic :refresh-materialized-view views))
|
||||||
|
|
||||||
|
(defn create-index
|
||||||
|
"Accepts an index spexification and a column specification. The column
|
||||||
|
specification consists of table name and one or more columns.
|
||||||
|
|
||||||
|
(create-index :name-of-idx [:table :col])
|
||||||
|
(create-index :name-of-idx [:table :col1 :col2])
|
||||||
|
(create-index [:unique :name-of-idx] [:table :col])
|
||||||
|
|
||||||
|
PostgreSQL also supports :if-not-exists and expressions instead of columns.
|
||||||
|
|
||||||
|
(create-index [:name-of-idx :if-not-exists] [:table :%lower.col])"
|
||||||
|
[& args]
|
||||||
|
(generic :create-index args))
|
||||||
|
|
||||||
(defn with
|
(defn with
|
||||||
"Accepts one or more CTE definitions.
|
"Accepts one or more CTE definitions.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
[honey.sql.helpers :as h
|
[honey.sql.helpers :as h
|
||||||
:refer [add-column add-index alter-table columns create-table create-table-as create-view
|
:refer [add-column add-index alter-table columns create-table create-table-as create-view
|
||||||
create-materialized-view drop-view drop-materialized-view
|
create-materialized-view drop-view drop-materialized-view
|
||||||
|
create-index
|
||||||
bulk-collect-into
|
bulk-collect-into
|
||||||
cross-join do-update-set drop-column drop-index drop-table
|
cross-join do-update-set drop-column drop-index drop-table
|
||||||
filter from full-join
|
filter from full-join
|
||||||
|
|
@ -962,3 +963,21 @@
|
||||||
(is (= '{}
|
(is (= '{}
|
||||||
(-> '{}
|
(-> '{}
|
||||||
(where))))))
|
(where))))))
|
||||||
|
|
||||||
|
(deftest test-create-index
|
||||||
|
(testing "create index, commonly supported features"
|
||||||
|
(is (= ["CREATE INDEX my_column_idx ON my_table (my_column)"]
|
||||||
|
(sql/format {:create-index [:my-column-idx [:my-table :my-column]]})))
|
||||||
|
(is (= ["CREATE INDEX my_column_idx ON my_table (my_column)"]
|
||||||
|
(sql/format (create-index :my-column-idx [:my-table :my-column]))))
|
||||||
|
(is (= ["CREATE UNIQUE INDEX my_column_idx ON my_table (my_column)"]
|
||||||
|
(sql/format (create-index [:unique :my-column-idx] [:my-table :my-column]))))
|
||||||
|
(is (= ["CREATE INDEX my_column_idx ON my_table (my_column, my_other_column)"]
|
||||||
|
(sql/format (create-index :my-column-idx [:my-table :my-column :my-other-column])))))
|
||||||
|
(testing "PostgreSQL extensions (IF NOT EXISTS and expressions)"
|
||||||
|
(is (= ["CREATE INDEX IF NOT EXISTS my_column_idx ON my_table (my_column)"]
|
||||||
|
(sql/format (create-index [:my-column-idx :if-not-exists] [:my-table :my-column]))))
|
||||||
|
(is (= ["CREATE UNIQUE INDEX IF NOT EXISTS my_column_idx ON my_table (my_column)"]
|
||||||
|
(sql/format (create-index [:unique :my-column-idx :if-not-exists] [:my-table :my-column]))))
|
||||||
|
(is (= ["CREATE INDEX my_column_idx ON my_table (LOWER(my_column))"]
|
||||||
|
(sql/format (create-index :my-column-idx [:my-table :%lower.my-column]))))))
|
||||||
|
|
|
||||||
|
|
@ -1311,5 +1311,4 @@ ORDER BY id = ? DESC
|
||||||
|
|
||||||
(comment
|
(comment
|
||||||
;; partial workaround for #407:
|
;; partial workaround for #407:
|
||||||
(sut/format {:select :f.* :from [[:foo [:f :for :system-time]]] :where [:= :f.id 1]})
|
(sut/format {:select :f.* :from [[:foo [:f :for :system-time]]] :where [:= :f.id 1]}))
|
||||||
)
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue