Я использую Datomic и хотел бы извлекать целые объекты из любого количества моментов времени на основе моего запроса. В документах Datomic есть несколько достойных примеров того, как я могу выполнять запросы из двух разных экземпляров базы данных, если я знаю эти экземпляры до выполнения запроса. Однако я хотел бы, чтобы мой запрос определял количество экземпляров базы данных типа "как есть", которые мне нужны, а затем использовал эти экземпляры при извлечении объектов. Вот что у меня есть до сих пор:
(defn pull-entities-at-change-points [entity-id]
(->>
(d/q
'[:find ?tx (pull ?dbs ?client [*])
:in $ [?dbs ...] ?client
:where
[?client ?attr-id ?value ?tx true]
[(datomic.api/ident $ ?attr-id) ?attr]
[(contains? #{:client/attr1 :client/attr2 :client/attr3} ?attr)]
[(datomic.api/tx->t ?tx) ?t]
[?tx :db/txInstant ?inst]]
(d/history (d/db db/conn))
(map #(d/as-of (d/db db/conn) %) [1009 1018])
entity-id)
(sort-by first)))
Я пытаюсь найти все транзакции, в которых изменились определенные атрибуты объекта :client
, а затем извлекаю объект в том виде, в каком он существовал в те моменты времени. Строка: (map #(d/as-of (d/db db/conn) %) [1009 1018])
— это моя попытка создать последовательность экземпляров базы данных в двух конкретных транзакциях, когда я знаю, что атрибуты клиента изменились. В идеале я хотел бы сделать все это в одном запросе, но я не уверен, что это возможно.
Надеюсь, это имеет смысл, но дайте мне знать, если вам нужна дополнительная информация.