summaryrefslogtreecommitdiff
path: root/src/clojure_sql/dsl.clj
diff options
context:
space:
mode:
Diffstat (limited to 'src/clojure_sql/dsl.clj')
-rw-r--r--src/clojure_sql/dsl.clj18
1 files changed, 14 insertions, 4 deletions
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))})))