Поиск даты самой старой и самой новой сущности с определенным атрибутом в Datomic?

Скажем, у нас есть схема Datomic, подобная этой:

{:db/id                 #db/id[:db.part/db]
  :db/ident              :app/createdAt
  :db/doc                "The date and time when the entity was created (not necessarily the same as tx time)"
  :db/valueType          :db.type/instant
  :db/cardinality        :db.cardinality/one
  :db.install/_attribute :db.part/db}
  {:db/id                 #db/id[:db.part/db]
  :db/ident              :app/type
  :db/doc                "The type of the entity"
  :db/valueType          :db.type/string
  :db/cardinality        :db.cardinality/one
  :db.install/_attribute :db.part/db}    

И несколько таких сущностей создаются за время жизни приложения. Мне интересно найти момент/дату :app/createdAt для самой старой и самой новой сущности определенного типа (:app/type), скажем, "type1". Как такой запрос будет выглядеть в Datomic?


person Johan    schedule 27.08.2016    source источник


Ответы (1)


Простой способ — использовать запрос Datalog:

[:find (min ?c) (max ?c) :in $ ?type :where
 [?e :app/type ?type]
 [?e :app/createdAt ?c]]

Соображения производительности

Начиная с Datomic 0.9.5385, модуль Datalog будет выполнять полное сканирование объектов, соответствующих предложению [?e :app/type ?type]; если таких сущностей много, это может привести к большому количеству сетевых обращений к хранилищу, высокому потреблению ресурсов на узле и значительной задержке.

К счастью, вы можете использовать Оптимизацию предикатов диапазона Datomic, чтобы datoms, отсканированные запросом. Например, чтобы вычислить максимальную дату создания, если вы знаете, что по крайней мере один такой объект был создан после августа 2016 года, вы можете вызвать:

(d/q '[:find (max ?c) . :in $ ?type ?lower-bound :where
       [?e :app/createdAt ?c]
       [(>= ?c ?lower-bound)]
       [?e :app/type ?type]]
  db #inst "2016-08")

Обратите внимание, что порядок предложений Datalog имеет значение.

Отказ от ответственности: я ничего не знаю об исходном коде Datomic и делаю выводы из приведенных выше утверждений только из личных экспериментов.

person Valentin Waeselynck    schedule 27.08.2016
comment
Вы знаете что-нибудь о производительности такого запроса? Что делать, если у вас есть несколько тысяч этих сущностей? В основном беспокоит производительность max? - person Johan; 28.08.2016