From 5c2e25abd706bbe6ec9f06bf694f63bc1375ca12 Mon Sep 17 00:00:00 2001 From: Justin Kramer Date: Thu, 12 Jul 2012 22:39:01 -0400 Subject: [PATCH] fix joins; modifiers --- src/honeysql/format.clj | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/honeysql/format.clj b/src/honeysql/format.clj index 76bfd49..b867836 100644 --- a/src/honeysql/format.clj +++ b/src/honeysql/format.clj @@ -118,7 +118,7 @@ clojure.lang.IPersistentMap (-to-sql [x] (let [clause-ops (filter #(contains? x %) clause-order)] (paren-wrap - (space-join (map (comp format-clause #(find x %)) + (space-join (map (comp #(format-clause % x) #(find x %)) clause-ops))))) nil (-to-sql [x] "NULL")) @@ -150,37 +150,37 @@ (defmulti format-clause "Takes a map entry representing a clause and returns an SQL string" - key) + (fn [clause _] (key clause))) -(defmethod format-clause :select [[_ fields]] - (str "SELECT " (comma-join (map to-sql fields)))) +(defmethod format-clause :select [[_ fields] sql-map] + (str "SELECT " + (space-join (map (comp string/upper-case name) + (:modifiers sql-map))) + " " + (comma-join (map to-sql fields)))) -(defmethod format-clause :from [[_ tables]] +(defmethod format-clause :from [[_ tables] _] (str "FROM " (comma-join (map to-sql tables)))) -(defmethod format-clause :where [[_ pred]] +(defmethod format-clause :where [[_ pred] _] (str "WHERE " (format-predicate pred))) -(defn format-join - [table pred & [type]] +(defn format-join [table pred & [type]] (str (when type (str (string/upper-case (name type)) " ")) "JOIN " (to-sql table) " ON " (format-predicate pred))) -(defmethod format-clause :join [[_ [table pred type]]] - (format-join table pred type)) +(defmethod format-clause :join [[_ join-groups] _] + (space-join (map #(apply format-join %) join-groups))) -(defmethod format-clause :joins [[_ join-groups]] - (space-join (map format-clause join-groups))) - -(defmethod format-clause :group-by [[_ fields]] +(defmethod format-clause :group-by [[_ fields] _] (str "GROUP BY " (comma-join (map to-sql fields)))) -(defmethod format-clause :having [[_ pred]] +(defmethod format-clause :having [[_ pred] _] (str "HAVING " (format-predicate pred))) -(defmethod format-clause :order-by [[_ fields]] +(defmethod format-clause :order-by [[_ fields] _] (str "ORDER BY " (comma-join (for [field fields] (if (sequential? field) @@ -189,9 +189,8 @@ "DESC" "ASC"))) (to-sql field)))))) -(defmethod format-clause :limit [[_ limit]] +(defmethod format-clause :limit [[_ limit] _] (str "LIMIT " (to-sql limit))) -(defmethod format-clause :offset [[_ offset]] - (str "OFFSET " (to-sql offset))) - +(defmethod format-clause :offset [[_ offset] _] + (str "OFFSET " (to-sql offset))) \ No newline at end of file