From 22784e9846a645f62b2a31b320c802a8140a2ad0 Mon Sep 17 00:00:00 2001 From: Carlo Zancanaro Date: Mon, 30 Sep 2013 10:21:00 +1000 Subject: Fix up union/intersection operations Previously the union/intersection operations didn't work when you tried to select/project/sort/drop/whatever on them. Now they just automatically introduce a subquery, which means that they can be used in other operations automatically. (There is a potential for a minor decrease in query speed, but I think it's worthwhile to maintain the abstraction.) --- README.md | 5 +++-- src/clojure_sql/dsl.clj | 22 ++++++++++++---------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 8769248..1e2e638 100644 --- a/README.md +++ b/README.md @@ -214,8 +214,9 @@ be the return value of the associated query function call (`deref`, * `sort` can now sort on expressions, not just table names -* `union` and `intersection` queries will now have their `:fields` set - correctly +* `union` and `intersection` queries will now always introduce a + subquery, but they should now compose properly (previously they + would only join correctly) * Provide `as-subobject` to help with renaming things with the dot notation diff --git a/src/clojure_sql/dsl.clj b/src/clojure_sql/dsl.clj index 015dfda..16bc2e5 100644 --- a/src/clojure_sql/dsl.clj +++ b/src/clojure_sql/dsl.clj @@ -370,19 +370,21 @@ (apply = (map (comp set keys :fields) queries)))) (defn union - "Combine the results of two queries" + "Combine the results of two queries. + + Will always introduce a subquery." [& queries] {:pre [(apply union-compatible? queries)]} - (assoc (q/->Query) - :set-operation :union - :queries queries - :fields (zipmap (keys (:fields (first queries))) (repeat nil)))) + (convert-to-subquery (q/map->Query {:set-operation :union + :queries queries + :fields (zipmap (keys (:fields (first queries))) (repeat nil))}))) (defn intersection - "Take the common rows in two queries" + "Take the common rows in two queries. + + Will always introduce a subquery." [& queries] {:pre [(apply union-compatible? queries)]} - (assoc (q/->Query) - :set-operation :intersect - :queries queries - :fields (zipmap (keys (:fields (first queries))) (repeat nil)))) + (convert-to-subquery (q/map->Query {:set-operation :intersect + :queries queries + :fields (zipmap (keys (:fields (first queries))) (repeat nil))}))) -- cgit v1.2.3