From 2145cded0efeb0eb141440d26c4bac624c66d7df Mon Sep 17 00:00:00 2001 From: Justin Kramer Date: Fri, 13 Jul 2012 18:45:25 -0400 Subject: [PATCH] format-predicate --- src/honeysql/core.clj | 1 + src/honeysql/format.clj | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/honeysql/core.clj b/src/honeysql/core.clj index 2bde710..fd33fc1 100644 --- a/src/honeysql/core.clj +++ b/src/honeysql/core.clj @@ -7,6 +7,7 @@ (defalias call types/call) (defalias raw types/raw) (defalias format format/format) +(defalias format-predicate format/format-predicate) (defn select [& fields] (let [[m fields] (if (map? (first fields)) diff --git a/src/honeysql/format.clj b/src/honeysql/format.clj index a05945c..c870434 100644 --- a/src/honeysql/format.clj +++ b/src/honeysql/format.clj @@ -44,7 +44,7 @@ "Determines the order that clauses will be placed within generated SQL" [:select :from :join :where :group-by :having :order-by :limit :offset]) -(declare to-sql) +(declare to-sql format-predicate*) (defn format [sql-map] (binding [*params* (atom [])] @@ -53,6 +53,13 @@ (into [sql-str] @*params*) [sql-str])))) +(defn format-predicate [pred] + (binding [*params* (atom [])] + (let [sql-str (format-predicate* pred)] + (if (seq @*params*) + (into [sql-str] @*params*) + [sql-str])))) + (defprotocol ToSql (-to-sql [x])) @@ -112,17 +119,17 @@ ;;;; -(defn format-predicate [pred] +(defn format-predicate* [pred] (if-not (sequential? pred) (to-sql pred) (let [[op & args] pred op-name (name op)] (if (= "not" op-name) - (str "NOT " (format-predicate (first args))) + (str "NOT " (format-predicate* (first args))) (if (#{"and" "or" "xor"} op-name) (paren-wrap (string/join (str " " (string/upper-case op-name) " ") - (map format-predicate args))) + (map format-predicate* args))) (to-sql (apply call pred))))))) (defmulti format-clause @@ -141,13 +148,13 @@ (str "FROM " (comma-join (map to-sql tables)))) (defmethod format-clause :where [[_ pred] _] - (str "WHERE " (format-predicate pred))) + (str "WHERE " (format-predicate* pred))) (defn format-join [table pred & [type]] (str (when type (str (string/upper-case (name type)) " ")) "JOIN " (to-sql table) - " ON " (format-predicate pred))) + " ON " (format-predicate* pred))) (defmethod format-clause :join [[_ join-groups] _] (space-join (map #(apply format-join %) join-groups))) @@ -156,7 +163,7 @@ (str "GROUP BY " (comma-join (map to-sql fields)))) (defmethod format-clause :having [[_ pred] _] - (str "HAVING " (format-predicate pred))) + (str "HAVING " (format-predicate* pred))) (defmethod format-clause :order-by [[_ fields] _] (str "ORDER BY "