2014-01-13 2 views
3

Я пытаюсь написать запрос Datomic, который вызывает 2 правила с использованием обертки Scala Datomisca.Объединение правил запроса в Datomisca

Как объединить два отдельных запроса?

Мой код выглядит следующим образом:

val rule1 = Query.rules("[[(rule1 ?a) [ ... ]]]") 
val rule2 = Query.rules("[[(rule2 ?b) [ ... ]]]") 

Datomic.q(Query("""[:find ?x 
        :in $ % % 
        :where (rule1 ?a) (rule2 ?b)]"""), conn.db(), rule1, rule2) 

Это дает мне ошибку о «Не удается разрешить ключ rule1»). Я попробовал его только с одним %, но он не будет компилироваться (тип несоответствия).

Я бы предпочел не комбинировать их в одной строке в вызове Query.rules, потому что это означает, что я должен повторять их для использования разных комбинаций правил (например, один запрос с обоими, другой с только правилом 1).

С Query.rules - это макрос, я должен использовать литералы для строковых значений, иначе он не будет компилироваться.

ответ

1

Вы можете комбинировать правила, обрабатывая их как String s может их конкатенировать. Вы не получаете преимущества проверки статического типа, но я не нашел другого способа.

val rule1 = "[[(rule1 ?a) [ ... ]]]" 
val rule2 = "[[(rule2 ?b) [ ... ]]]" 

Datomic.q(Query(...), conn.db(), DString(s"[$rule1 $rule2]"), ...) 
Смежные вопросы