2012-06-14 7 views
12

Estoy siguiendo el tutorial, http://www.datomic.com/company/resources/tutorial, pero creo que me falta una simple pieza del rompecabezas de cómo acceder al modelo de tiempo de Datomic.En Datomic, ¿cómo obtengo una vista de línea de tiempo de los cambios realizados en los valores de una entidad en particular?

Si hago una serie de adiciones y retrae

;; DO a series of transactions 
;; (transact conn [:db/add entity-id attribute value0]) 

(use 'datomic.api) 
(dir datomic.api) 
(def conn (connect "datomic:dev://localhost:4334/demo")) 

(transact conn '[:db/add 2000 :db/doc "Hello There"]) 
(q '[:find ?e ?n :where [?e :db/doc ?n] [(= 2000 ?e)]] (db conn)) 
; => <HashSet [[2000 "Hello There"]]> 

(transact conn '[:db/add 2000 :db/doc "Hello There 1"]) 
(q '[:find ?e ?n :where [?e :db/doc ?n] [(= 2000 ?e)]] (db conn)) 
; => <HashSet [[2000 "Hello There 1"]]> 

(transact conn '[:db/add 2000 :db/doc "Hello There 2"]) 
(q '[:find ?e ?n :where [?e :db/doc ?n] [(= 2000 ?e)]] (db conn)) 
; => <HashSet [[2000 "Hello There 2"]]> 

(transact conn '[:db/add 2000 :db/doc "Hello There 3"]) 
(q '[:find ?e ?n :where [?e :db/doc ?n] [(= 2000 ?e)]] (db conn)) 
; => <HashSet [[2000 "Hello There 3"]]> 

¿Cómo es posible obtener una serie de cambios en el valor (2.000 entidad atributo: db/doc)?

quiero conseguir algo en el formato de

[ [Transaction Number, Time, Value] .... [Transaction Number, Time, Value]] 

Por ejemplo:

[ [T1, "2012-March-16-9:30:12", "Hello There"] 
    .... 
    .... 
    .... 
    [T27, "2012-June-14-9:54:38", "Hello There 3"] ] 

No puede ser tan difícil, pero hay un montón de: db parámetros internos que no estoy familiarizado con

Respuesta

9

Tome un vistazo a la función (history db)in the reference.

Devuelve una base de datos especial que contiene todas las afirmaciones y retracciones a través del tiempo. Esta base de datos especial se puede usar para llamadas y consultas de rango de índice , pero no para entidades o con llamadas. Los límites desde y desde también son compatibles. Tenga en cuenta que consultas obtendrán todas las adiciones y retracciones, que pueden ser distinguen por el quinto campo datom: añadido (válido para añadir/aserción) [EAV tx añadido]

Usando history se puede hacer algo como este para obtener los datos que quería:

datomic-test.core> (q '[:find ?tx ?tx-time ?v 
         :in $ ?e ?a 
         :where [?e ?a ?v ?tx _] 
           [?tx :db/txInstant ?tx-time]] 
         (d/history (db conn)) 
         2000 
         :db/doc) 
#<HashSet [[13194139534315 #inst "2012-09-09T00:45:49.086-00:00" "Hello There"] [...]]> 

también se fijan en (tempid :db.part/user) para obtener identificaciones en lugar de utilizar números codificados duro como 2000.

+0

genial ... tendrá un juego con esto =) – zcaudate

Cuestiones relacionadas