测试clojure PersistentArrayMap和数据库EntityMap之间的相等性?

时间:2015-02-14 04:57:34

标签: clojure datomic

我正在为我的数据库代码编写一些测试。我创建了一个交易地图:

(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之间的相等性?

2 个答案:

答案 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

但这不是问题,因为如果我们意识到整个地图,它会给出整个属性。