From d86e2c996ab86ea65c36105fb6c77831a772786d Mon Sep 17 00:00:00 2001 From: Carlo Zancanaro Date: Mon, 24 Jun 2013 17:54:19 +1000 Subject: 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. --- src/clojure_sql/jdbc.clj | 16 ++++++++++++++-- 1 file 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))) -- cgit v1.2.3