From 6f2ef8f6c3d3d538f8a30337aedd4eeafac75ef4 Mon Sep 17 00:00:00 2001 From: alice Date: Fri, 6 Sep 2013 23:18:05 +0900 Subject: [PATCH 1/3] add support for insert, update and delete queries --- src/honeysql/core.clj | 7 ++++++- src/honeysql/format.clj | 24 ++++++++++++++++++++++-- src/honeysql/helpers.clj | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 3 deletions(-) diff --git a/src/honeysql/core.clj b/src/honeysql/core.clj index afa0fd0..61bb2bc 100644 --- a/src/honeysql/core.clj +++ b/src/honeysql/core.clj @@ -42,7 +42,12 @@ :having, :merge-having :limit :offset - :modifiers, :merge-modifiers" + :modifiers, :merge-modifiers + :insert-into + :values + :update + :set + :delete-from" [& clauses] (let [[base clauses] (if (map? (first clauses)) [(first clauses) (rest clauses)] diff --git a/src/honeysql/format.clj b/src/honeysql/format.clj index c1fd554..1977e0e 100644 --- a/src/honeysql/format.clj +++ b/src/honeysql/format.clj @@ -147,8 +147,8 @@ (def clause-order "Determines the order that clauses will be placed within generated SQL" - [:select :from :join :left-join :right-join :where :group-by :having - :order-by :limit :offset]) + [:select :insert-into :update :delete-from :set :from :join :left-join :right-join :where :group-by :having + :order-by :limit :offset :values]) (def known-clauses (set clause-order)) @@ -329,3 +329,23 @@ (defmethod format-clause :offset [[_ offset] _] (str "OFFSET " (to-sql offset))) + +(defmethod format-clause :insert-into [[_ table] _] + (str "INSERT INTO " (to-sql table))) + +(defmethod format-clause :values [[_ values] _] + (if (sequential? values) + (str "VALUES (" (comma-join (map to-sql values)) ")") + (str + "(" (comma-join (map to-sql (keys values))) ") VALUES (" + (comma-join (map to-sql (vals values))) ")"))) + +(defmethod format-clause :update [[_ table] _] + (str "UPDATE " (to-sql table))) + +(defmethod format-clause :set [[_ values] _] + (str "SET " (comma-join (for [[k v] values] + (str (to-sql k) " = " (to-sql v)))))) + +(defmethod format-clause :delete-from [[_ table] _] + (str "DELETE FROM " (to-sql table))) diff --git a/src/honeysql/helpers.clj b/src/honeysql/helpers.clj index a5294bb..96b8995 100644 --- a/src/honeysql/helpers.clj +++ b/src/honeysql/helpers.clj @@ -154,3 +154,38 @@ m (update-in m [:modifiers] concat (collify ms)))) +(defmethod build-clause :insert-into [_ m table] + (assoc m :insert-into table)) + +(defn insert-into + ([table] (insert-into nil table)) + ([m table] (build-clause :insert-into m table))) + +(defmethod build-clause :values [_ m values] + (assoc m :values values)) + +(defn values + ([vs] (values nil vs)) + ([m vs] (build-clause :values m vs))) + +(defmethod build-clause :update [_ m table] + (assoc m :update table)) + +(defn update + ([table] (update nil table)) + ([m table] (build-clause :update m table))) + +(defmethod build-clause :set [_ m values] + (assoc m :set values)) + +;; short for sql set, to avoid name collision with clojure.core/set +(defn sset + ([vs] (values nil vs)) + ([m vs] (build-clause :set m vs))) + +(defmethod build-clause :delete-from [_ m table] + (assoc m :delete-from table)) + +(defn delete-from + ([table] (delete-from nil table)) + ([m table] (build-clause :delete-from m table))) From 806b9bafd62893ebc1ff59469921e3ba761326ea Mon Sep 17 00:00:00 2001 From: alice Date: Sat, 7 Sep 2013 01:19:13 +0900 Subject: [PATCH 2/3] fix values clause to take multiple sets of values --- src/honeysql/core.clj | 2 +- src/honeysql/format.clj | 10 ++++++---- src/honeysql/helpers.clj | 7 +++++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/honeysql/core.clj b/src/honeysql/core.clj index 61bb2bc..c299c50 100644 --- a/src/honeysql/core.clj +++ b/src/honeysql/core.clj @@ -44,7 +44,7 @@ :offset :modifiers, :merge-modifiers :insert-into - :values + :values, :merge-values :update :set :delete-from" diff --git a/src/honeysql/format.clj b/src/honeysql/format.clj index 1977e0e..e6c25f6 100644 --- a/src/honeysql/format.clj +++ b/src/honeysql/format.clj @@ -334,11 +334,13 @@ (str "INSERT INTO " (to-sql table))) (defmethod format-clause :values [[_ values] _] - (if (sequential? values) - (str "VALUES (" (comma-join (map to-sql values)) ")") + (if (sequential? (first values)) + (str "VALUES " (comma-join (for [x values] + (str "(" (comma-join (map to-sql x)) ")")))) (str - "(" (comma-join (map to-sql (keys values))) ") VALUES (" - (comma-join (map to-sql (vals values))) ")"))) + "(" (comma-join (map to-sql (keys (first values)))) ") VALUES " + (comma-join (for [x values] + (str "(" (comma-join (map to-sql (vals x))) ")")))))) (defmethod format-clause :update [[_ table] _] (str "UPDATE " (to-sql table))) diff --git a/src/honeysql/helpers.clj b/src/honeysql/helpers.clj index 96b8995..57967d3 100644 --- a/src/honeysql/helpers.clj +++ b/src/honeysql/helpers.clj @@ -168,6 +168,13 @@ ([vs] (values nil vs)) ([m vs] (build-clause :values m vs))) +(defmethod build-clause :merge-values [_ m values] + (update-in m [:values] concat values)) + +(defn merge-values + ([vs] (merge-values nil vs)) + ([m vs] (build-clause :merge-values m vs))) + (defmethod build-clause :update [_ m table] (assoc m :update table)) From e7fefe86a622aef57e4628b39495738c1640537f Mon Sep 17 00:00:00 2001 From: alice Date: Thu, 12 Dec 2013 11:35:38 +0900 Subject: [PATCH 3/3] add columns, merge-columns and query-values clauses --- src/honeysql/core.clj | 2 ++ src/honeysql/format.clj | 11 +++++++++-- src/honeysql/helpers.clj | 21 +++++++++++++++++---- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/honeysql/core.clj b/src/honeysql/core.clj index c299c50..51999ea 100644 --- a/src/honeysql/core.clj +++ b/src/honeysql/core.clj @@ -44,7 +44,9 @@ :offset :modifiers, :merge-modifiers :insert-into + :columns, :merge-columns :values, :merge-values + :query-values :update :set :delete-from" diff --git a/src/honeysql/format.clj b/src/honeysql/format.clj index e6c25f6..d0a816f 100644 --- a/src/honeysql/format.clj +++ b/src/honeysql/format.clj @@ -147,8 +147,9 @@ (def clause-order "Determines the order that clauses will be placed within generated SQL" - [:select :insert-into :update :delete-from :set :from :join :left-join :right-join :where :group-by :having - :order-by :limit :offset :values]) + [:select :insert-into :update :delete-from :columns :set :from :join + :left-join :right-join :where :group-by :having :order-by :limit :offset + :values :query-values]) (def known-clauses (set clause-order)) @@ -333,6 +334,9 @@ (defmethod format-clause :insert-into [[_ table] _] (str "INSERT INTO " (to-sql table))) +(defmethod format-clause :columns [[_ fields] _] + (str "(" (comma-join (map to-sql fields)) ")")) + (defmethod format-clause :values [[_ values] _] (if (sequential? (first values)) (str "VALUES " (comma-join (for [x values] @@ -342,6 +346,9 @@ (comma-join (for [x values] (str "(" (comma-join (map to-sql (vals x))) ")")))))) +(defmethod format-clause :query-values [[_ query-values] _] + (to-sql query-values)) + (defmethod format-clause :update [[_ table] _] (str "UPDATE " (to-sql table))) diff --git a/src/honeysql/helpers.clj b/src/honeysql/helpers.clj index 57967d3..91c1ca2 100644 --- a/src/honeysql/helpers.clj +++ b/src/honeysql/helpers.clj @@ -161,20 +161,33 @@ ([table] (insert-into nil table)) ([m table] (build-clause :insert-into m table))) -(defmethod build-clause :values [_ m values] - (assoc m :values values)) +(defhelper columns [m fields] + (assoc m :columns (collify fields))) + +(defhelper merge-columns [m fields] + (update-in m [:columns] concat (collify fields))) + +(defmethod build-clause :values [_ m vs] + (assoc m :values vs)) (defn values ([vs] (values nil vs)) ([m vs] (build-clause :values m vs))) -(defmethod build-clause :merge-values [_ m values] - (update-in m [:values] concat values)) +(defmethod build-clause :merge-values [_ m vs] + (update-in m [:values] concat vs)) (defn merge-values ([vs] (merge-values nil vs)) ([m vs] (build-clause :merge-values m vs))) +(defmethod build-clause :query-values [_ m vs] + (assoc m :query-values vs)) + +(defn query-values + ([vs] (values nil vs)) + ([m vs] (build-clause :query-values m vs))) + (defmethod build-clause :update [_ m table] (assoc m :update table))