diff options
Diffstat (limited to 'src/clojure_sql/compiler.clj')
-rw-r--r-- | src/clojure_sql/compiler.clj | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/src/clojure_sql/compiler.clj b/src/clojure_sql/compiler.clj index 6b3ec4a..d0b1206 100644 --- a/src/clojure_sql/compiler.clj +++ b/src/clojure_sql/compiler.clj @@ -223,24 +223,28 @@ (if drop (str " OFFSET " drop))))) +(def ^:private set-operations {:union "UNION", :intersect "INTERSECT"}) + (defmulti compile-query (fn [db _] db) :default :postgres) -(defmethod compile-query :postgres [db {:keys [tables fields joins where sort group having union take drop]}] - (if union - (->> union - (map (partial compile-query db)) - (apply sequence) - ((p-lift string/join " UNION "))) - ($str (return "SELECT ") - (compile-fields db fields) - (if tables - ($str (return " FROM ") - (compile-tables db joins tables)) - ($str "")) - (compile-where db where) - (compile-group db group) - (compile-having db having) - (compile-sort db sort) - (compile-limit db take drop)))) +(defmethod compile-query :postgres [db {:keys [tables fields joins where sort group having take drop set-operation queries]}] + (or (if set-operation + (let [op-str (str ") " (get set-operations set-operation) " (")] + (->> queries + (map (partial compile-query db)) + (apply sequence) + ((p-lift string/join op-str)) + $add-parentheses))) + ($str (return "SELECT ") + (compile-fields db fields) + (if tables + ($str (return " FROM ") + (compile-tables db joins tables)) + ($str "")) + (compile-where db where) + (compile-group db group) + (compile-having db having) + (compile-sort db sort) + (compile-limit db take drop)))) |