Учитывая, что Datomic does not support pagination я задаюсь вопросом, как эффективно поддерживать такой запрос:Эффективного Datomic запроса выполнить фильтрацию страничных наборов
Возьмите первые 30 объектов на
:history/body
, найти лицо, чьих:history/body
матчей некоторых регулярное выражение.
Вот как я хотел бы сделать сопоставление регулярных выражений в одиночку:
{:find [?e]
:where [[?e :history/body ?body]
[(re-find #"foo.*bar$" ?body)]]}
Наблюдения:
- я мог тогда
(take ...)
от тех, но это не такой же, как соответствие против первых 30 объектов. - я мог бы получить все сущности,
take 30
затем вручную фильтр сre-find
, но если у меня есть 30M сущности, получая все они простоtake 30
кажется дико неэффективным. Кроме того: что, если я захочу взять 20M из своих 30M-объектов и фильтровать их черезre-find
?
Datomic документы говорят о том, как выполняются запросы локально, но я пытался делать в памяти преобразования на множестве 52913 лиц (предоставленных, они полностью touch
ред), и это занимает ~ 5 секунд. Представьте себе, насколько это плохо было бы в миллионах или десятках миллионов.
Спасибо. Я проработаю это, когда у меня будет шанс, похоже, хорошее начало. – devth