在Datomic中查找最后一笔交易的实体ID?

时间:2017-02-24 15:03:55

标签: clojure datomic

我想知道如何找到Datomic中最新交易修改/创建/删除的实体的ID。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

对于这种阅读模式(基于时间),您将要使用Log API。请注意:

  1. 可能有多个实体受到上次交易的影响。
  2. 实际上,交易本身由为该交易创建的实体表示,您可能希望从结果中过滤掉该实体。
  3. 以下是一个示例实现:

    (defn affected-entities
      "Given a Datomic connection, returns the set of entity ids that were affected
      by the last transaction (in e position), excluding the entity representing the 
      transaction itself."
      [conn]
      (let [db (d/db conn)]
        (->>
          (d/q '[:find [?e ...] :in ?log ?t1 ?t2 :where
                 [(tx-ids ?log ?t1 ?t2) [?tx ...]] ;; binds the last tx 
                 [(tx-data ?log ?tx) [[?e]]]]
            (d/log conn) (d/basis-t db) (d/next-t db))
          ;; filtering out the transaction entity
          (remove (fn [eid]
                    (->> eid d/part (d/ident db) (= :db.part/tx))))
          set)))