    (if (and (or (= bound '*)
                 (and (not= path bound)
                      (< (count path) (count bound))))
-            (some join? focus)
+            (some util/join? focus)
             (== 1 (count focus)))
-     (let [[k focus'] (join-entry (first focus))
-           k (if (ident? k) (first k) k)
-           focus'     (if (recursion? focus')
+     (let [[k focus'] (util/join-entry (first focus))
+           k (if (util/ident? k) (first k) k)
+           focus'     (if (util/recursion? focus')
                         focus
                         focus')]
        (recur focus' bound (conj path k)))

                  v       (get data k)]
              (cond
                ;; graph loop: db->tree leaves ident in place
                (and recursive? (ident? v)) (recur (next q) ret)
                ;; normalize one
                (map? v)
                (let [x (normalize* sel v refs union-entry)]


(defn- merge-idents [tree config refs query]
  (let [{:keys [merge-ident indexer]} config
        ident-joins (into {} (filter #(and (util/join? %)
                                           (util/ident? (util/join-key %)))
                               query))]
    (letfn [(step [tree' [ident props]]
              (if (:normalize config)
