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