From fe513564989d9151a79d5494f2958ae190c20d02 Mon Sep 17 00:00:00 2001 From: Carlo Zancanaro Date: Tue, 12 Nov 2013 16:58:44 +1100 Subject: Change the query executor model: now it's query local and the interface is managed by a protocol. --- src/clojure_sql/dsl.clj | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'src/clojure_sql/dsl.clj') diff --git a/src/clojure_sql/dsl.clj b/src/clojure_sql/dsl.clj index 413b9c0..2a22eea 100644 --- a/src/clojure_sql/dsl.clj +++ b/src/clojure_sql/dsl.clj @@ -85,14 +85,21 @@ (keyword? expression) (resolve-field tables aliases expression) :else expression)) +(def ^:dynamic *default-executor* nil) +(defn set-default-query-executor! [executor] + (alter-var-root #'*default-executor* (constantly executor))) +(defmacro with-default-query-executor [executor & body] + `(binding [*default-executor* ~executor] ~@body)) + (defn table "Create a query on a database table. If `table` is itself a query it will be wrapped, otherwise `table` will be used as the table name." - [table] + [table & [executor]] (q/map->Query (let [table-name (if (u/named? table) (name table) "table") table-keyword (keyword (gensym table-name))] {:tables {table-keyword table} - :joins [table-keyword]}))) + :joins [table-keyword] + :executor (or executor *default-executor*)}))) (defn ^:private into-map-duplicate-error [coll error-fn] (reduce (fn [acc [k v]] @@ -229,6 +236,7 @@ outer join is considered a LEFT outer join. To achieve a right outer join reverse the query arguments." [left right & {:keys [on type]}] + (assert (= (:executor left) (:executor right)) "Cannot join queries with different executors.") (let [left (make-join-subquery left) right (rename-all-tables (make-join-subquery right)) merged-tables (merge (:tables left) (:tables right)) @@ -387,7 +395,8 @@ (defn ^:private union-compatible? [& queries] (and (every? (comp seq keys :fields) queries) - (apply = (map (comp set keys :fields) queries)))) + (apply = (map (comp set keys :fields) queries)) + (apply = (map :executor queries)))) (defn union "Combine the results of two queries. @@ -407,4 +416,5 @@ {:pre [(apply union-compatible? queries)]} (convert-to-subquery (q/map->Query {:set-operation :intersect :queries queries - :fields (zipmap (keys (:fields (first queries))) (repeat nil))}))) + :fields (zipmap (keys (:fields (first queries))) (repeat nil)) + :executor (:executor (first queries))}))) -- cgit v1.2.3