diff --git a/src/honeysql/core.clj b/src/honeysql/core.clj index da99666..d25415c 100644 --- a/src/honeysql/core.clj +++ b/src/honeysql/core.clj @@ -42,7 +42,14 @@ :having, :merge-having :limit :offset - :modifiers, :merge-modifiers" + :modifiers, :merge-modifiers + :insert-into + :columns, :merge-columns + :values, :merge-values + :query-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 88377ac..82d7445 100644 --- a/src/honeysql/format.clj +++ b/src/honeysql/format.clj @@ -152,8 +152,9 @@ (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 :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)) @@ -342,3 +343,31 @@ (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 :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] + (str "(" (comma-join (map to-sql x)) ")")))) + (str + "(" (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 :query-values [[_ query-values] _] + (to-sql query-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..91c1ca2 100644 --- a/src/honeysql/helpers.clj +++ b/src/honeysql/helpers.clj @@ -154,3 +154,58 @@ 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))) + +(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 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)) + +(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)))