2017-02-24 1 views
3

Ich möchte wissen, wie ich die ID der Entität finden kann, die durch die letzte Transaktion in Datomic geändert/erstellt/gelöscht wurde. Wie kann ich das machen?Finden Sie die Entity-ID der letzten Transaktion in Datomic?

+0

Sie können [ 'datomic.api/history'] (http://docs.datomic.com/clojure/index.html#datomic.api/ Geschichte) dafür. –

Antwort

2

Für diese Art von Lesemustern (temporal) sollten Sie die Log API verwenden. Beachten Sie Folgendes:

  1. Es kann mehr als eine Entität geben, die von der letzten Transaktion betroffen war.
  2. tatsächlich wird die Transaktion selbst durch eine Entität dargestellt, die für diese Transaktion erstellt wird, die Sie möglicherweise aus Ihrem Ergebnis filtern möchten.

Hier ist eine Beispielimplementierung:

(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))) 
Verwandte Themen