【问题标题】:Test for equality between a clojure PersistentArrayMap and a datomic EntityMap?测试 clojure PersistentArrayMap 和 datomic EntityMap 之间的相等性?
【发布时间】:2015-02-14 04:57:34
【问题描述】:

我正在对我的 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 和 datomic EntityMap 之间的相等性?

【问题讨论】:

  • 有一些错误。在测试和类型检查中,(:some-ns/my-attr ent) 将返回 nil,因为 ent{:db/id 17592186045425}
  • 并交换type结果。
  • 这段代码中有一些我不明白的地方,你应该准确地给出你的查询所得到的......;)
  • tx-map 是查询,为什么要比较查询和...?查询结果?不,它是硬编码的……查询结果在哪里?
  • 一般来说,在比较 Clojure 对象和 Java 对象时,您不应该假设您可以测试相等性。有关详细信息,请参阅dev.clojure.org/jira/browse/CLJ-1036

标签: clojure datomic


【解决方案1】:

实体是惰性映射,因此无法与映射进行比较。 http://docs.datomic.com/entities.html

但它们是关联的,我们可以获取每个属性的值。所以你可以比较ids:

(== (: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 版本...

【讨论】:

    【解决方案2】:

    Datomic EntityMaps 目前不支持关联和其他 Clojure 地图接口功能,但该功能正在考虑中。

    要将实体转换为 Clojure 映射,只需使用 (into)。

    (进入 {} 一些实体)

    参考:https://groups.google.com/d/msg/datomic/IzRSK9e7VJo/YGejFLl3vxYJ

    但这不是这里的问题,因为这给出了如果我们实现整个地图将返回的整个属性。

    【讨论】:

    • 不幸的是,如果我在 {:db/id 17592186045421} 上使用 into,EID 会扩展为该实体的完整 attr/val 映射。
    猜你喜欢
    • 1970-01-01
    • 2015-01-08
    • 2011-04-17
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2021-09-24
    相关资源
    最近更新 更多