Проверить равенство между clojure PersistentArrayMap и datomic EntityMap?

Я пишу несколько тестов на своем коде 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?


person deadghost    schedule 14.02.2015    source источник
comment
Есть некоторые ошибки. В тесте и проверке типа (:some-ns/my-attr ent) вернет ноль, так как ent равно {:db/id 17592186045425}.   -  person Ivan Pierre    schedule 17.02.2015
comment
И результаты типа обмениваются.   -  person Ivan Pierre    schedule 17.02.2015
comment
Что-то я не понимаю в этом коде, вы должны указать именно то, что вы получаете с вашим запросом... ;)   -  person Ivan Pierre    schedule 17.02.2015
comment
tx-map - это запрос, почему вы сравниваете запрос и...? результат запроса? нет, это жестко запрограммировано... где результат запроса?   -  person Ivan Pierre    schedule 17.02.2015
comment
В общем, вы не должны предполагать, что можете проверить равенство при сравнении объектов Clojure с объектами Java. Подробнее см. dev.clojure.org/jira/browse/CLJ-1036. подробности.   -  person Daniel Compton    schedule 18.02.2015
comment
Мне не совсем понятно, какой вы ожидаете от семантики равенства? Точно такой же id подойдет? Если да, то у вас уже есть удовлетворительный (и довольно простой) ответ (:db/id). Если нет, хотите ли вы, чтобы объекты с другим базисом были равными/неравными по сути или условно (например, только по атрибуту, значение изменяется)?   -  person Ben Kamphaus    schedule 18.02.2015


Ответы (2)


Сущности — это ленивые карты, поэтому их нельзя сравнивать с картами. 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...

person Ivan Pierre    schedule 17.02.2015

Ассоциирование и другие возможности интерфейса карты Clojure в настоящее время не поддерживаются в Datomic EntityMaps, но эта функция находится на рассмотрении.

Чтобы преобразовать сущность в карту Clojure, просто используйте (into).

(в {} некоторую сущность)

Ссылка: https://groups.google.com/d/msg/datomic/IzRSK9e7VJo/YGejFLl3vxYJ

Но здесь проблема не в этом, так как это дает полные атрибуты, которые будут возвращены, если мы реализуем всю карту.

person Ivan Pierre    schedule 14.02.2015
comment
К сожалению, если я использую into для {:db/id 17592186045421}, EID расширяется до полной карты attr/val этого объекта. - person deadghost; 14.02.2015