Можно ли передать подстановочный знак журнала данных `_` в параметризованный запрос?

Можно ли передать подстановочный знак _ в параметризованный запрос? Что-то вроде этого:

(d/q [:find ?e
      :in $ ?type
      :where [?e :type ?type]] db _)

Когда я попробовал это, как написано выше, это выдало ошибку. Есть ли способ сделать это?

Я знаю, что могу получить все с помощью запроса, который выглядит так:

(d/q [:find ?e :where [?e :type]] db)

Но моя цель — избежать необходимости создавать отдельные запросы, когда я не хочу фильтровать результаты по :type. Вариант использования, например, и конечная точка API, которая может или не может фильтровать результаты.


person fraxture    schedule 31.05.2017    source источник
comment
Можете ли вы добавить пример того, что вы пытаетесь сделать?   -  person Alan Thompson    schedule 31.05.2017


Ответы (1)


Если я вас правильно понял, вы должны ввести:

(d/q [:find ?e
      :in $
      :where [?e :type]] db )

В Datomic любые неуказанные значения считаются подстановочными знаками. Приведенный выше запрос вернет список всех сущностей, имеющих атрибут :type, независимо от значения.

Обновлять

Запрос Datomic предназначен для приема простого значения, такого как 5 или :awesome, для подстановки в переменную ?type. Такой символ, как _ (или цитируемая версия '_), не соответствует шаблону, ожидаемому Datomic.

Ради интереса я попробовал несколько вариантов и не смог заставить Datomic принимать символ '_ для переменной ?type так, как вы предложили. Я думаю, вам придется написать отдельный запрос для случая с подстановочными знаками.

По сути, подстановочный знак _ — это специальный символ (также известный как «зарезервированное слово») в синтаксисе запроса Datomic, как и $. Datomic также требует, чтобы переменные запроса начинались с ?, например ?e или ?type. Эти требования являются частью Datomic DSL, которую вы не можете изменить.

Единственным обходным решением, помимо написания отдельных запросов вручную, было бы динамическое составление вектора запроса из базовой части и дополнительных частей. Будет ли это проще или сложнее, чем написание различных запросов от руки, зависит от вашей конкретной ситуации.

person Alan Thompson    schedule 31.05.2017
comment
Я должен был предоставить больше контекста. Это для конечной точки API, которая извлекает результаты с применением фильтра или без него. Чего я пытаюсь избежать, так это необходимости создавать другую структуру запроса, когда нет фильтра по конкретному :type, потому что построение отдельных запросов создает беспорядок в коде, тогда как возможность указать подстановочный знак будет более кратким. - person fraxture; 31.05.2017