我正在为我的数据库代码编写一些测试。我创建了一个交易地图:
(def tx-map
{:db/id #db/id[:db.part/user -1000235]
:some-ns/my-attr {:db/id 17592186045421}}
交易很好。我查询我新添加的实体:
(def ent
"Query result."
{:db/id 17592186045425})
测试是否一切顺利:
(= (:some-ns/my-attr tx-map) ; {:db/id 17592186045421}
(:some-ns/my-attr ent)) ; {:db/id 17592186045421}
=> false ; All is not well
原因是什么?
(type (:some-ns/my-attr tx-map)) => clojure.lang.PersistentArrayMap
(type (:some-ns/my-attr ent)) => datomic.query.EntityMap
如何正确测试clojure PersistentArrayMap和数据库EntityMap之间的相等性?
答案 0 :(得分:2)
实体是惰性地图,因此无法与地图进行比较。 http://docs.datomic.com/entities.html
但它们是关联的,我们可以获得每个属性的值。所以你可以比较id
s:
(== (:db/id (:some-ns/my-attr tx-map)) ; 17592186045421
(:db/id ent)) ; 17592186045421
注意==
,我们比较两个数字......;)
因此只会选择:db/id
。也许ent
函数应该为您提供id
。
(def ent
":db/id of query result."
17592186045425)
测试成为:
(== (:db/id (:some-ns/my-attr tx-map)) ; 17592186045421
ent) ; 17592186045421
对于迟到的回答,我很抱歉。
警告,仅根据文档,我现在没有安装可运行的datomic版本......
答案 1 :(得分:0)
Datomic EntityMaps目前不支持Associng和其他Clojure地图界面功能,但正在考虑此功能。
要将实体转换为Clojure地图,只需使用(into)。
(进入{}某个实体)
参考:https://groups.google.com/d/msg/datomic/IzRSK9e7VJo/YGejFLl3vxYJ
但这不是问题,因为如果我们意识到整个地图,它会给出整个属性。