                                query-string))))
 
 (defn select-items
-  ([domain-name query-string]
-     (select-items domain-name query-string nil))
-  ([domain-name query-string next-token]
+  "Perform a Select operation on the domain.  Returns a map from item
+  identifiers to the maps of their attributes."
+  ([domain-name select-string]
+     (select-items domain-name select-string nil))
+  ([domain-name select-string next-token]
      (reduce (fn [m [k v]] (assoc m k (parse-attr-list v)))
              {} (.getItems (.selectItems (get-domain domain-name)
-                                         query-string next-token)))))
+                                         select-string next-token)))))
 
-(defn delete-where [domain-name query-string]
+(defn delete-where
+  "Deletes items from the domain matching the Query string."
+  [domain-name query-string]
   (doseq [item (list-items domain-name query-string)]
     (delete-item domain-name (.getIdentifier item))))

        (.add attrs (ItemAttribute. (keystr k) (keystr v) true))))
    attrs))

(defn- parse-attr-list [attrs]
  (reduce (fn [m attr]
            (let [k (.getName attr), v (.getValue attr)]
              (assoc m k

(defn- keystr [x]
  (if (keyword? x) (name x) (str x)))

(defn- make-attr-list
  "Given a map of key=>value or key=>[values], return a List of
  ItemAttribute objects."
  [keyvals]
  (let [attrs (ArrayList.)]
    (doseq [[k v] keyvals]
      (if (coll? v)
