2016-06-10 2 views
0

Учитывая запрос, как это:Datomic журнал аудит и перечисления

(def query '[:find ?tx ?date ?v ?op 
:in $ ?e ?a 
:where 
[?e ?a ?v ?tx ?op] 
[?tx :db/txInstant ?date]]) 

Если объект и атрибут в настоящее время пользователя при условии, что я могу сделать функцию, где у меня есть журнал аудит на поле в основе. Это хорошо работает.

Моя проблема - поля перечисления. Возвращаемый ?v - это :db/id, а не значение перечисления, и я не совсем уверен, как я должен понять, что поле, которое предоставил пользователь, было полем перечисления, и я должен рассматривать значение Long, возвращаемое как ссылка на перечисление.

Я думаю, что мне нужно сделать, чтобы запрос возвращал :db/valueType для рассматриваемого атрибута, а затем, если это тип ref, найдите объект, на который он указывает. Но я не уверен, что это правильный подход или даже как это сделать.

ответ

2

Я получил эту работу. Я заметил, что есть функция (d/attribute db atto-key), доступная в datomic, которая вернет поля метаданных об атрибуте. Поэтому я могу использовать это, чтобы проверить :db/valueType равным :db/ref, а затем вызвать (d/ident db entity-id), чтобы разрешить идентификатор объекта до его значения перечисления.

+1

Вы также можете запросить атрибут непосредственно через предложение '[? A: db/valueType? Vtid] [? Vtid: db/ident? Vt]' –

+1

Атрибуты хранятся и могут запрашиваться как все остальные объекты - они aren Это действительно мета-данные. –

Смежные вопросы