2014-07-14 4 views
0

У меня есть набор динамически формируемые параметры в виде карты, какКорм: or'ing динамически где положения

(def clauses {:apples 23 :plums 0 :bananas 7}) 

, и я хочу, чтобы он в по ИЛИ where заявления, так что должна стать эквивалентом запроса Корме:

(select fruit-shop 
    (where (or {:apples 23} 
      {:plums 0} 
      {:bananas 7}))) 

Создание списка карт довольно легко:

(map #(apply array-map %) 
    (into [] clauses)) 

Но нельзя использовать инструкцию (or, потому что она обрабатывается при увеличении макросов, прежде чем clauses привяжется к ее значению.

Какое заявление следует использовать в таком случае?

ответ

0

После ознакомления с исходным кодом Кормы, я нашел korma.sql.fns/pred-or функцию, которая заменяет or заявления в where и having. Поэтому я написал следующую вспомогательную функцию, которая принимает карты аргумент

(require '[korma.sql.fns :refer [pred-or]]) 

(defn or* 
    [m] 
    (apply pred-or 
     (map #(apply array-map %) 
       (into [] m)))) 

Учитывая, что предполагаемый запрос будет выглядеть следующим образом

(select fruit-shop 
    (where (or* clauses))) 
Смежные вопросы