      (fail ~message ~val)))
 
 (def- query-types
-  #{:insert :select :count :update :delete :explain :list-collections
-    :create-index :drop-index :list-indexes :multi-read :multi-write
-    :checked-write})
+  #{"insert" "select" "count" "update" "delete" "explain" "list-collections"
+    "create-index" "drop-index" "list-indexes" "multi-read" "multi-write"
+    "checked-write"})
 
 (defn- lint-coll [coll]
-  (lint keyword? coll "collection not a keyword"))
+  (lint string? coll "collection not a string"))
+
+(def- attr? string?)
 
 (defn- lint-attr [attr]
-  (lint keyword? attr "attr not a keyword?"))
+  (lint attr? attr "attr not a string"))
 
 (defn val? [v]
   (or (boolean? v) (nil? v)
-      (string? v) (keyword? v) (number? v)))
+      (string? v)  (number? v)))
 
 (defn- lint-val [val]
   (lint val? val "value not of a recognized type"))

  (lint-val val))

(defn- lint-dir [dir]
  (lint #{:asc :desc} dir "unrecognized direction"))

(defn- lint-record [r]
  (lint map? r "record not a map")


(defn- lint-order [order]
  (lint vector? order "order not a vector")
  (if (attr? (first order))
    (lint-order-comp order)
    (domap lint-order-comp order)))

(def- sing-ops #{"=" "!=" "<" "<=" ">" ">="})
(def- doub-ops #{"><" ">=<" "><=" ">=<="})
(def- conj-ops #{"and" "or"})

(defn- lint-where [where]
  (lint vector? where "where not a vector")
