Транзакционный API для Datomic - PullRequest
0 голосов
/ 04 ноября 2018

Конечно, глупый вопрос, но, надеюсь, все прояснится.

Я следую по https://docs.datomic.com/on-prem/getting-started/transact-schema.html,, и в этом уроке для операции по схеме используется

user=> (d/transact conn {:tx-data movie-schema})

Однако, когда я пытаюсь это сделать, я получаю

ClassCastException clojure.lang.PersistentArrayMap cannot be cast to java.util.List  datomic.api/transact 

Вместо этого, когда я просто делаю

(d/transact conn schema)

это работает для меня. Учебник пропускает некоторую тонкость здесь? Я что-то пропустил? (единственное отличие состоит в том, что я использую бесплатную версию вместо версии Starter Pro).

Редактировать: в первоначальной версии этого поста упоминалась схема, но в целом это справедливо только для добавления новых фактов (т. Е. Использование {:tx-data foo} не работает, но использование foo делает ).

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Я думаю, что причиной вашей проблемы здесь является несоответствие между Peer API (в котором transact принимает список) и Client API (в котором transact принимает карту, содержащую клавишу :tx-data). Я подозреваю, что вы пытались запустить свои команды REPL в REPL процесса Peer, тогда как учебник , который вы связали с , ожидает, что вы запустите команды в REPL процесса клиента.

Почему несоответствие между сверстниками и клиентами? Не будучи частью команды Datomic, я могу только догадываться:

  1. Одноранговый API исторически разрабатывался до клиентского API, тогда было достаточно формата «запросы транзакций в виде списков»
  2. Когда был разработан клиентский API, из-за более дорогой природы вызова d/transact (я полагаю, что это требует дополнительного приема-передачи ввода-вывода от клиента к серверу), авторы оставили место для дополнительных данных в запросах транзакций (например, для шаблонов), следовательно, более расширяемый формат на основе карт.
0 голосов
/ 04 ноября 2018

Рабочее демо можно посмотреть здесь: https://github.com/cloojure/tupelo-datomic

Просто клонируйте репо и запустите тесты:

~/tupelo-datomic > lein test

lein test tst.tupelo-datomic._bootstrap

----------------------------------
   Clojure 1.9.0    Java 10.0.1
----------------------------------

lein test tst.tupelo-datomic.bond

lein test tst.tupelo-datomic.bond-query

lein test tst.tupelo-datomic.core

lein test tst.tupelo-datomic.find

lein test tst.tupelo-datomic.functionality

lein test tst.tupelo-datomic.quick-start
:using-local

Ran 17 tests containing 110 assertions.
0 failures, 0 errors.
~/tupelo-datomic > 

Что касается вашего конкретного вопроса, я использовал :tx-data только как поле из выходных данных операций с атомами. Я никогда не использовал его как поле из input data. Возможно, документы, на которые вы ссылаетесь, неверны или устарели.

Вот пример (обратите внимание на скобки вместо фигурных скобок):

https://github.com/cloojure/tupelo-datomic/blob/master/src/tupelo_datomic/core.clj#L540


Более подробно, вы можете увидеть вызов нативной функции Datomic как вывод функции-оболочки new-attribute в модульных тестах: https://github.com/cloojure/tupelo-datomic/blob/master/test/tst/tupelo_datomic/core.clj#L46

  (let [result (td/new-attribute
                 :weapon/type :db.type/keyword
                 :db.unique/value :db.unique/identity :db.cardinality/one :db.cardinality/many
                 :db/index :db/fulltext :db/isComponent :db/noHistory)]
    (is (s/validate datomic.db.DbId (:db/id result)))
    (is (wild-match? {:db/id          :* 
                      :db/ident       :weapon/type
                      :db/index       true 
                      :db/unique      :db.unique/identity
                      :db/noHistory   true
                      :db/cardinality :db.cardinality/many
                      :db/isComponent true
                      :db.install/_attribute :db.part/db
                      :db/fulltext    true 
                      :db/valueType   :db.type/keyword}
          result)))
...