Основные файлы, не являющиеся исходными
Кодовая база dev, используемая при разработке, но не выпущенная
lein test
Eva предоставляет ряд свойств конфигурации, которые можно настроить с помощью системных свойств Java. Некоторые специфические свойства конфигурации также можно настроить с использованием переменных среды.
Пространство имён eva.config
, связанное здесь, содержит описания и значения по умолчанию для переменных конфигурации.
Данные сущности EAV состоят из:
Данные EAV могут быть представлены в следующих эквивалентных формах:
В виде объекта или карты:
{:db/id 12345,
:attribute1 "value1",
:attribute2 "value2"}
В виде списка кортежей EAV:
[
[12345, :attribute1, "value1"],
[12345, :attribute2, "value2"]
]
Чтобы сделать модель данных EAV учитывающей время, мы расширяем кортеж EAV до кортежа EAVT, содержащего идентификатор транзакции (T), которая представила этот кортеж:
[
;; E A V T
[12345, :attribute1, "value1", 500],
[12345, :attribute2, "value2", 500]
]
Чтобы сделать накопительную модель данных EAVT, мы расширяем кортеж EAVT с конечным флагом, который указывает, была ли информация EAV добавлена или удалена в транзакции (T).
[
;; E A V T added?
[12345, :attribute1, "value1", 500, true],
[12345, :attribute2, "value2", 500, true]
]
В этой модели общие операции с данными (создание, обновление, удаление) представлены следующим образом:
added? == true
[[12345, :attribute1, «создать сущность 12345 с полем :attribute1 в транзакции 500», 500, true]]
added? == false
[[12345, :attribute1, «создать сущность 12345 с полем :attribute1 в транзакции 501», 501, false]]
[
;; В транзакции 502
;; аннулировать старую запись для :attribute2
[12345, :attribute2, «старое значение», 502, false]
;; добавить новую запись для :attribute2
[12345, :attribute2, «новое значение», 502, true]
]
Полная история базы данных представляет собой совокупный список этих кортежей.
Обновления данных отправляются как транзакции, которые обрабатываются атомарно. Это означает, что когда вы отправляете транзакцию, либо все изменения в транзакции применяются, либо ни одно из изменений не применяется.
Транзакции отправляются в виде списка команд модификации данных.
Самые простые команды модификации данных (:db/add
, :db/retract
) соответствуют описанным выше накопительным кортежам:
[
[:db/retract 12345 :attribute2 «старое значение»]
[:db/add 12345 :attribute2 «новое значение»]
]
Когда эта транзакция будет зафиксирована, она создаст следующие кортежи в истории базы данных
(где <next-tx>
— следующий номер транзакции):
[
[12345, :attribute2, «старое значение», <next-tx>, false]
[12345, :attribute2, «новое значение», <next-tx>, true]
]
Помимо формы команды, вы также можете создавать/обновлять данные, используя форму объекта/карты сущности:
[
{:db/id 12345
:attribute1 «value1»
:attribute2 «value2»}
]
Эта форма эквивалентна форме команды:
[
[:db/add 12345 :attribute1 «value1»]
[:db/add 12345 :attribute2 «value2»]
]
Поскольку все сохранённые данные сводятся к кортежам EAVT, схемы определяются для каждого Атрибута, а не для каждой Сущности.
Определения схем: Сущности со специальными schema-атрибутами
:attribute1
:[
{:db/id #db/id[:db.part/db]
:db/ident :attribute1
:db/doc "Определение схемы для attribute1"
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db.install/_attribute :db.part/db}
]
Разберём каждую пару ключ-значение примера:
:db/id #db/id[:db.part/db]
: объявляет новый entity-id в id-разделе :db.part/db
.:db/ident :attribute1
: объявляет, что :attribute1
является псевдонимом для entity-id.:db/doc "Definition of attribute1"
: строка с документацией о назначении :attribute1
.:db/valueType :db.type/string
: объявляет, что для :attribute1
допустимы только строковые значения.:db/cardinality :db.cardinality/one
: объявляет, что сущность может иметь не более одного :attribute1
. Это означает, что для данного entity-id будет существовать только один кортеж [<entit-id> :attribute1 <value>]
. Добавление нового кортежа с этим атрибутом приведёт к удалению существующего.:db.install/_attribute :db.part/db
: объявляет, что этот :attribute1
зарегистрирован в базе данных как установленный атрибут.Входящий в комплект файл docker compose можно использовать для запуска полностью интегрированной среды Eva. Это включает:
Чтобы запустить эту среду, выполните следующие команды:
make gen-docker-no-tests # для сборки Eva с последними изменениями
make run-docker
Для остановки среды используйте следующую команду:
make stop-docker
Чтобы открыть контейнер repl, который может взаимодействовать со средой, используйте:
make repl
И запустите следующее, чтобы изначально настроить среду repl:
(require '[eva.catalog.client.alpha.client :as catalog-client])
(def config (catalog-client/request-flat-config "http://eva-catalog:3000" "workiva" "eva-test-1" "test-db-1"))
(def conn (eva/connect config))
Наконец, проверьте, всё ли работает, с помощью пустой транзакции:
(deref (eva/transact conn []))
Ожидается аналогичный результат:
{:tempids {}, :tx-data (#datom[4398046511105 15 #inst "2018-06-06T17:35:07.516-00:00" 4398046511105 true]), :db-before #DB[0], :db-after #DB[1]}
Нет. Eva — это собственный проект, который мы создали с нуля. API и высокоуровневая архитектура во многом совместимы с Datomic, но база данных, вплоть до некоторого кода EPL, была полностью создана внутри компании. У нас есть список наиболее заметных различий в API здесь.
Если вы ищете простую систему для быстрого перехода в продакшн, почти наверняка нет. Eva гораздо менее зрелая и видела гораздо меньше времени в бою. Datomic Cloud — удивительный (и поддерживаемый) продукт, который гораздо проще развернуть и запустить с уверенностью. Eva предоставляется как есть.
Существует несколько небольших различий в API Peer, тогда как клиенты довольно разные. Например, соединение в Eva строится с использованием причудливой карты конфигурации, а не строки. С операционной точки зрения Datomic гораздо более удобен. Также, вероятно, существуют некоторые низкоуровневые архитектурные различия между системами, которые заставят их демонстрировать разное время выполнения. Почему Workiva создала Eva?
Бизнес-модель Workiva требует детализированного и масштабируемого мультитенантного подхода с определённой степенью контроля и гибкости, которые соответствуют нашим собственным развивающимся и уникальным требованиям соответствия. Кроме того, разработка Eva началась до выпуска многих мощных функций Datomic, включая Datomic Cloud и Datomic Client.
Почему Workiva открывает исходный код Eva?
Проект в целом почти полностью функционален, и мы считаем, что он технически надёжен. Workiva решила прекратить закрытое развитие Eva, но видит большой потенциал в открытии кодовой базы для сообщества OSS. Мы надеемся, что сообщество найдёт ценность в проекте в целом.
Какими будут дальнейшие вклады Workiva в Eva?
Eva, вероятно, всё ещё будет поддерживаться и развиваться в свободное время на 10% и предыдущими участниками в их личное время.
— Эрик Петерсен erik.petersen@workiva.com
Перечислены в стиле журнала транзакций в порядке добавления к проекту:
— Райан Хаймбух rheimbuch@gmail.com;
— Хьюстон Кинг houston.king@workiva.com;
— Тимоти Дин galdre@gmail.com;
— Росс Хендриксон ross.hendrickson@gmail.com;
— Эрик Петерсен erik.petersen@workiva.com;
— Брэндон Сент-Джулс brandon.stjules@workiva.com;
— Тайлер Уилдинг tyler.wilding@workiva.com;
— Дэниел Харасимью daniel.harasymiw@workiva.com;
— Мартин Крейбе martin.kreibe@workiva.com;
— Алекс Алегри alex.alegre@workiva.com;
— Александр Фурманов aleksandr.furmanov@workiva.com.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )