format-predicate
This commit is contained in:
parent
cef05d4ef5
commit
2145cded0e
2 changed files with 15 additions and 7 deletions
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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 "
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue