clojuredatomic

In Datomic, querying field history with no retractions?


I'd like to get the history of values for a particular field in Datomic. My intuition is to use (d/history) like

(d/q '[:find ?entity ?field-val ?date ?tx
       :in $
       :where 
          [?entity :namespace/field ?field-val ?tx]
          [?tx :db/txInstant ?date]]
      (d/history (db/get-db)))

However, this query will duplicate most values because it lists every retraction as well as every value update (every db/add and db/retract).

I thought maybe I could query the datoms with the transaction, then check the operations. But I can't find a way to query the datoms.

I can use tx-range, but that seems unweildly.

Any better approaches?


Solution

  • I was looking in the wrong place. History queries offer an extra hidden positional value described in the history docs.

    So any where clause can include ?entity ?attribute ?value ?transaction ?operation.

    So, the query I want looks like

    (d/q '[:find ?entity ?field-val ?date ?tx
           :in $
           :where 
              [?entity :namespace/field ?field-val ?tx true] ;;ADDED TRUE
              [?tx :db/txInstant ?date]]
          (d/history (db/get-db)))