   "Get attribute in entity with given id."
   ([db-snap id attr]
    (when-let [id (resolve-id db-snap id)]
-     (log-read [:entity-attr id] fnil-conj-set [id attr])
+     (log-read [:ea_ id] fnil-conj-set [id attr])
      (get-in* db-snap [:eav id attr])))
   ([db-snap id attr not-found]
    (when-let [id (resolve-id db-snap id)]
-     (log-read [:entity-attr id] fnil-conj-set [id attr])
+     (log-read [:ea_ id] fnil-conj-set [id attr])
      (get-in* db-snap [:eav id attr] not-found))))
 
 (defn get-in
   "Get-in the entity with given id."
   ([db-snap id ks]
    (when-let [id (resolve-id db-snap id)]
-     (log-read [:entity-attr id] fnil-conj-set [id (first ks)])
+     (log-read [:ea_ id] fnil-conj-set [id (first ks)])
      (-> (get-in* db-snap [:eav id])
          (get-in* ks))))
   ([db-snap id ks not-found]
    (when-let [id (resolve-id db-snap id)]
-     (log-read [:entity-attr id] fnil-conj-set [id (first ks)])
+     (log-read [:ea_ id] fnil-conj-set [id (first ks)])
      (-> (get-in* db-snap [:eav id])
          (get-in* ks not-found)))))
 

        (swap! seen-ids conj (datom 0))

        ;; entity-attr listeners
        (doseq [f (get-in* listeners [:entity-attr id a])]
          (f datom))

        ;; attr-val listeners
        (doseq [v (cond-> (or v prev-v)
                          (not (many? a)) (list))]
          (doseq [f (get-in* listeners [:attr-val a v])]
            (f datom)))

        ;; attr listeners
        (doseq [f (get-in* listeners [:attr a])]
          (f datom)))

      (doseq [id @seen-ids]
        (doseq [f (get-in* listeners [:entity id])]
          (f id)))

      ;; tx-log listeners

  (str (uuid-utils/make-random-uuid)))

(def blank-access-log
  {:e__ #{}
   :_a_ #{}
   :_av #{}
   :ea_ {}})

(defn access-log-patterns
  "Returns vector of access log patterns, pruning overlapping patterns"
  [{ids :e__ attr-vals :_av entity-attrs :ea_ attrs :_a_}]
  (apply set/union
         ids
         attr-vals
