2016-06-10 1 views
0

Étant donné une requête comme ceci:journal d'audit Datomic et énumérations

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

Lorsque l'entité et l'attribut sont utilisateur fourni, je peux faire une fonction où j'ai un journal d'audit sur une base par domaine. Cela fonctionne bien.

Mon problème concerne les champs enum. Le ?v qui revient est un :db/id, pas la valeur enum lui-même, et je ne suis pas vraiment sûr de la façon dont je suis supposé comprendre que le champ fourni par l'utilisateur était un champ enum et je devrais traiter la valeur Long retournée comme référence à une énumération.

Je pense que ce que je dois faire est de rendre la requête retourner le :db/valueType pour l'attribut en question, puis si c'est un type ref rechercher l'entité vers laquelle il pointe. Mais je ne suis pas sûr si c'est la bonne approche, ou même comment le faire.

Répondre

2

J'ai commencé à travailler. J'ai remarqué qu'il existe une fonction (d/attribute db atto-key) disponible dans datomic, qui retournera les champs de métadonnées sur l'attribut. Donc, je peux utiliser cela pour vérifier :db/valueType étant égal à :db/ref, puis appelez (d/ident db entity-id) pour résoudre l'id de l'entité à sa valeur enum.

+1

Vous pouvez également interroger l'attribut directement via une clause '[? A: db/valueType? Vtid] [? Vtid: db/ident? Vt]' –

+1

Les attributs sont stockés et peuvent être interrogés comme toutes les autres entités - Ils sont Pas vraiment de méta-données. –