format-predicate

This commit is contained in:
Justin Kramer 2012-07-13 18:45:25 -04:00
parent cef05d4ef5
commit 2145cded0e
2 changed files with 15 additions and 7 deletions

View file

@ -7,6 +7,7 @@
(defalias call types/call) (defalias call types/call)
(defalias raw types/raw) (defalias raw types/raw)
(defalias format format/format) (defalias format format/format)
(defalias format-predicate format/format-predicate)
(defn select [& fields] (defn select [& fields]
(let [[m fields] (if (map? (first fields)) (let [[m fields] (if (map? (first fields))

View file

@ -44,7 +44,7 @@
"Determines the order that clauses will be placed within generated SQL" "Determines the order that clauses will be placed within generated SQL"
[:select :from :join :where :group-by :having :order-by :limit :offset]) [:select :from :join :where :group-by :having :order-by :limit :offset])
(declare to-sql) (declare to-sql format-predicate*)
(defn format [sql-map] (defn format [sql-map]
(binding [*params* (atom [])] (binding [*params* (atom [])]
@ -53,6 +53,13 @@
(into [sql-str] @*params*) (into [sql-str] @*params*)
[sql-str])))) [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 (defprotocol ToSql
(-to-sql [x])) (-to-sql [x]))
@ -112,17 +119,17 @@
;;;; ;;;;
(defn format-predicate [pred] (defn format-predicate* [pred]
(if-not (sequential? pred) (if-not (sequential? pred)
(to-sql pred) (to-sql pred)
(let [[op & args] pred (let [[op & args] pred
op-name (name op)] op-name (name op)]
(if (= "not" op-name) (if (= "not" op-name)
(str "NOT " (format-predicate (first args))) (str "NOT " (format-predicate* (first args)))
(if (#{"and" "or" "xor"} op-name) (if (#{"and" "or" "xor"} op-name)
(paren-wrap (paren-wrap
(string/join (str " " (string/upper-case op-name) " ") (string/join (str " " (string/upper-case op-name) " ")
(map format-predicate args))) (map format-predicate* args)))
(to-sql (apply call pred))))))) (to-sql (apply call pred)))))))
(defmulti format-clause (defmulti format-clause
@ -141,13 +148,13 @@
(str "FROM " (comma-join (map to-sql tables)))) (str "FROM " (comma-join (map to-sql tables))))
(defmethod format-clause :where [[_ pred] _] (defmethod format-clause :where [[_ pred] _]
(str "WHERE " (format-predicate pred))) (str "WHERE " (format-predicate* pred)))
(defn format-join [table pred & [type]] (defn format-join [table pred & [type]]
(str (when type (str (when type
(str (string/upper-case (name type)) " ")) (str (string/upper-case (name type)) " "))
"JOIN " (to-sql table) "JOIN " (to-sql table)
" ON " (format-predicate pred))) " ON " (format-predicate* pred)))
(defmethod format-clause :join [[_ join-groups] _] (defmethod format-clause :join [[_ join-groups] _]
(space-join (map #(apply format-join %) join-groups))) (space-join (map #(apply format-join %) join-groups)))
@ -156,7 +163,7 @@
(str "GROUP BY " (comma-join (map to-sql 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))) (str "HAVING " (format-predicate* pred)))
(defmethod format-clause :order-by [[_ fields] _] (defmethod format-clause :order-by [[_ fields] _]
(str "ORDER BY " (str "ORDER BY "