Adds :enable-values-subqueries? option to honeysql.format/format

When :enable-values-subqueries? is set to false, treat maps provided
in a :values clause as a parameter instead of as a subquery.
This commit is contained in:
Brandon Adams 2015-03-26 18:46:14 -05:00
parent a48ea1c4d2
commit 8a12215e3d

View file

@ -38,6 +38,11 @@
(def ^:dynamic *subquery?* false) (def ^:dynamic *subquery?* false)
(def ^:dynamic *handling-values* false)
(def ^:dynamic *enable-values-subqueries?*
"When False, subqueries are not computed for IPersistentMap values"
true)
(def ^:private quote-fns (def ^:private quote-fns
{:ansi #(str \" % \") {:ansi #(str \" % \")
:mysql #(str \` % \`) :mysql #(str \` % \`)
@ -226,7 +231,11 @@
*param-names* (atom []) *param-names* (atom [])
*input-params* (atom params) *input-params* (atom params)
*quote-identifier-fn* (quote-fns (:quoting opts)) *quote-identifier-fn* (quote-fns (:quoting opts))
*parameterizer* (parameterizers (or (:parameterizer opts) :jdbc))] *parameterizer* (parameterizers (or (:parameterizer opts) :jdbc))
*enable-values-subqueries?* (if-some
[?enable-values-subqueries (:enable-values-subqueries? opts)]
?enable-values-subqueries
*enable-values-subqueries?*)]
(let [sql-str (to-sql sql-map)] (let [sql-str (to-sql sql-map)]
(if (seq @*params*) (if (seq @*params*)
(if (:return-param-names opts) (if (:return-param-names opts)
@ -292,15 +301,21 @@
(-to-sql [x] (.s x)) (-to-sql [x] (.s x))
clojure.lang.IPersistentMap clojure.lang.IPersistentMap
(-to-sql [x] (-to-sql [x]
(let [clause-ops (sort-clauses (keys x)) (if (and *handling-values*
sql-str (binding [*subquery?* true (not *enable-values-subqueries?*))
*fn-context?* false] (let [pname (keyword (str "_" (swap! *param-counter* inc)))]
(space-join (swap! *param-names* conj pname)
(map (comp #(-format-clause % x) #(find x %)) (swap! *params* conj x)
clause-ops)))] (*parameterizer*))
(if *subquery?* (let [clause-ops (sort-clauses (keys x))
(paren-wrap sql-str) sql-str (binding [*subquery?* true
sql-str))) *fn-context?* false]
(space-join
(map (comp #(-format-clause % x) #(find x %))
clause-ops)))]
(if *subquery?*
(paren-wrap sql-str)
sql-str))))
nil nil
(-to-sql [x] "NULL") (-to-sql [x] "NULL")
Object Object
@ -425,8 +440,9 @@
(str "(" (comma-join (map to-sql x)) ")")))) (str "(" (comma-join (map to-sql x)) ")"))))
(str (str
"(" (comma-join (map to-sql (keys (first values)))) ") VALUES " "(" (comma-join (map to-sql (keys (first values)))) ") VALUES "
(comma-join (for [x values] (binding [*handling-values* true]
(str "(" (comma-join (map to-sql (vals x))) ")")))))) (comma-join (for [x values]
(str "(" (comma-join (map to-sql (vals x))) ")")))))))
(defmethod format-clause :query-values [[_ query-values] _] (defmethod format-clause :query-values [[_ query-values] _]
(to-sql query-values)) (to-sql query-values))