diff options
author | Carlo Zancanaro <carlo@clearboxsystems.com.au> | 2013-06-24 17:54:19 +1000 |
---|---|---|
committer | Carlo Zancanaro <carlo@clearboxsystems.com.au> | 2013-06-24 17:54:19 +1000 |
commit | d86e2c996ab86ea65c36105fb6c77831a772786d (patch) | |
tree | fa57e0e91e64c3725f210e7141651f9e7657a5b5 | |
parent | 68c206aab2ddac42bef6de97fd065f75edcb1a98 (diff) |
Make dotted fields result in nested maps when querying
So now something like this:
(-> (table :users)
(project {:id :user.id, :email :user.email, :person :person.id})
(join (-> (table :people)
(project {:id :person.id, :first-name :person.first-name}))))
will result in a map like this for each result:
{:user {:id 1, :email "..."}, :person {:id 1, :first-name "..."}}
Although I've just thought of an issue that will need to be detected where an
error should be thrown. I'll deal with that now and commit it soon.
-rw-r--r-- | src/clojure_sql/jdbc.clj | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/clojure_sql/jdbc.clj b/src/clojure_sql/jdbc.clj index 45b1839..5b9de12 100644 --- a/src/clojure_sql/jdbc.clj +++ b/src/clojure_sql/jdbc.clj @@ -1,13 +1,25 @@ (ns clojure-sql.jdbc (:require [clojure.java.jdbc :as jdbc] - [clojure-sql.core :refer [set-query-executor!]])) + [clojure-sql.core :refer [set-query-executor!]] + [clojure.string :as string])) + +(defn ^:private dotted-to-nested-map-one [obj] + (reduce (fn [acc [key val]] + (let [dotted (name key) + keys (string/split dotted #"\.") + keywords (map keyword keys)] + (assoc-in acc keywords val))) + {} obj)) + +(defn ^:private dotted-to-nested-maps [objs] + (mapv dotted-to-nested-map-one objs)) (defn use-jdbc! [connection-string] (set-query-executor! (fn [type query] (jdbc/with-connection connection-string (case type :select (jdbc/with-query-results results query - (vec results)) + (dotted-to-nested-maps results)) :insert (jdbc/do-prepared-return-keys (first query) (next query)) :update (jdbc/do-prepared-return-keys (first query) (next query)) :delete (first (jdbc/do-prepared (first query) (next query))) |