diff --git a/src/clj/joy/sql.clj b/src/clj/joy/sql.clj index 6eb9f1b..d0f4368 100644 --- a/src/clj/joy/sql.clj +++ b/src/clj/joy/sql.clj @@ -13,7 +13,7 @@ (comment (shuffle-expr 42) - + (shuffle-expr '(= X.a Y.b)) (shuffle-expr '(AND (< a 5) (< b ~max))) @@ -43,7 +43,7 @@ (comment (apply process-left-join-clause shuffle-expr '(Y :ON (= X.a Y.b))) - + ;;=> " LEFT JOIN Y ON (X.a = Y.b)" (let [LEFT-JOIN (partial process-left-join-clause shuffle-expr)] @@ -80,7 +80,10 @@ ;;=> "SELECT a, b, c FROM X LEFT JOIN Y ON (X.a = Y.b) WHERE ((a < 5) AND (b < ?))" ) -(declare apply-syntax) +(declare ^:dynamic *clause-map*) + +(defn apply-syntax [[op & args]] + (apply (get *clause-map* op) args)) (def ^:dynamic *clause-map* {'SELECT (partial process-select-clause apply-syntax) @@ -88,9 +91,6 @@ 'LEFT-JOIN (partial process-left-join-clause shuffle-expr) 'WHERE (partial process-where-clause shuffle-expr)}) -(defn apply-syntax [[op & args]] - (apply (get *clause-map* op) args)) - (defmacro SELECT [& args] {:query (apply-syntax (cons 'SELECT args)) :bindings (vec (for [n (tree-seq coll? seq args) @@ -105,8 +105,8 @@ (comment (query 9) - + ;;=> {:query "SELECT a, b, c FROM X LEFT JOIN Y ON (X.a = Y.b) WHERE ((a < 5) AND (b < ?))" ;; :bindings [9]} - + )