1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-Eva

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Основные файлы, не являющиеся исходными

  • core/resources

Кодовая база dev, используемая при разработке, но не выпущенная

  1. dev/src — исходные файлы Clojure.
  2. dev/java-src — исходные файлы Java.
  3. dev/test — исходные тестовые файлы.
  4. dev/resources — не являющиеся исходными файлами.
  5. dev/test-resources — не являющиеся исходными файлы, используемые для поддержки интеграционного тестирования.

Задачи разработки

Выполнение набора тестов

lein test

Конфигурация

Eva предоставляет ряд свойств конфигурации, которые можно настроить с помощью системных свойств Java. Некоторые специфические свойства конфигурации также можно настроить с использованием переменных среды.

Пространство имён eva.config, связанное здесь, содержит описания и значения по умолчанию для переменных конфигурации.

О модели данных Eva

Сущность-атрибут-значение (EAV)

Данные сущности EAV состоят из:

  1. отдельного идентификатора сущности;
  2. 1 или более пар атрибут-значение, связанных с одним идентификатором сущности.

Данные EAV могут быть представлены в следующих эквивалентных формах:

  1. В виде объекта или карты:

    {:db/id 12345,
     :attribute1 "value1",
     :attribute2 "value2"}
  2. В виде списка кортежей 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

Входящий в комплект файл docker compose можно использовать для запуска полностью интегрированной среды Eva. Это включает:

  • transactor;
  • eva-catalog;
  • activemq;
  • образ maria-db.

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

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]}

Дополнительные ресурсы

FAQ

Является ли этот проект или Workiva каким-либо образом связанным с Cognitect?

Нет. Eva — это собственный проект, который мы создали с нуля. API и высокоуровневая архитектура во многом совместимы с Datomic, но база данных, вплоть до некоторого кода EPL, была полностью создана внутри компании. У нас есть список наиболее заметных различий в API здесь.

Стоит ли мне использовать Eva вместо Datomic?

Если вы ищете простую систему для быстрого перехода в продакшн, почти наверняка нет. Eva гораздо менее зрелая и видела гораздо меньше времени в бою. Datomic Cloud — удивительный (и поддерживаемый) продукт, который гораздо проще развернуть и запустить с уверенностью. Eva предоставляется как есть.

В чём основные различия между Eva и Datomic?

Существует несколько небольших различий в 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
EPL-1.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mirrors-Eva.git
git@api.gitlife.ru:oschina-mirror/mirrors-Eva.git
oschina-mirror
mirrors-Eva
mirrors-Eva
master