diff options
author | Carlo Zancanaro <carlo@clearboxsystems.com.au> | 2013-05-23 18:26:46 +1000 |
---|---|---|
committer | Carlo Zancanaro <carlo@clearboxsystems.com.au> | 2013-05-23 18:26:46 +1000 |
commit | 5ccaca496f4babb4fef2d34e272b8772e077fa25 (patch) | |
tree | 39503109047318559e806372668bdfc092dbb1a6 /src/clojure_sql/dsl.clj | |
parent | 626ab0234ad2e578992d128ced35c2003902e90f (diff) |
Simplify the compiler, better subquery support
The compiler's been simplified a bit by breaking out the `writer` stuff into
its own namespace and by generally making the monadic stuff better. It's all
hidden behind a nice, simple, `clojure-sql.compiler/compile` function now. Call
that and you'll get back what you need. (Internally it's a writer monad which
is really modelled as a state monad with the only operation able to be
performed on the state being `tell`.)
Subqueries are now handled by the DSL in such a way as to not blow up
everything. Subqueries have no support for referencing values in the
superquery, though, so their utility is quite limited at present. Thinking
about how to do subqueries properly may be difficult.
Diffstat (limited to 'src/clojure_sql/dsl.clj')
-rw-r--r-- | src/clojure_sql/dsl.clj | 49 |
1 files changed, 14 insertions, 35 deletions
diff --git a/src/clojure_sql/dsl.clj b/src/clojure_sql/dsl.clj index 006e637..996b55c 100644 --- a/src/clojure_sql/dsl.clj +++ b/src/clojure_sql/dsl.clj @@ -37,17 +37,24 @@ {:field field :query query}))) +(defn ^:private resolve-field [table aliases field] + (let [field-alias-lookup (u/flip-map aliases)] + (or (field-alias-lookup field) + (if table + [table field] + (ambiguous-error field))))) + +(defn ^:private resolve-fields [table aliases expression] + (cond (list? expression) (map (partial table aliases) expression) + (vector? expression) (mapv (partial table aliases) expression) + (keyword? expression) (resolve-field table aliases expression) + :else expression)) + (defn project [query fields] (let [table (if-not (:joins query) (-> query :table first val)) alias-lookup (u/flip-map (:fields query)) - original-name (fn [field] - (if (vector? field) - field - (or (get alias-lookup field nil) - (if table - [table field] - (ambiguous-error field query)))))] + original-name #(resolve-fields table (:fields query) %)] (assoc query :fields (->> (for [[key val] (if (map? fields) fields @@ -77,20 +84,6 @@ [(original-name key) val]) (into %))))) -(defn ^:private resolve-field [table aliases field] - (let [field-alias-lookup (u/flip-map aliases)] - (or (field-alias-lookup field) - (if table - [table field] - (ambiguous-error field))))) - -(defn ^:private resolve-fields [table aliases expression] - (clojure.walk/postwalk (fn [expr] - (cond - (keyword? expr) (resolve-field table aliases expr) - :else expr)) - expression)) - (defn ^:private combine-wheres [& wheres] (reduce (fn [acc where] (cond (nil? acc) where @@ -153,17 +146,3 @@ (if (vector? field) (resolve-field table-name (:fields query) field) [(resolve-field table-name (:fields query) field) :asc]))))) - - -(defn insert! [query & records] - {:pre [(empty? (:joins query))]} - ;; some code here - ) - -(defn update! [query & partial-records] - ;; some code here - ) - -(defn delete! [query] - ;; some code here - ) |