2014-07-14 57 views
0

我有一組動態生成的參數在地圖上像科爾馬:OR符號動態生成的where子句

(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函數替換wherehavingor語句。所以我寫了下面的輔助函數,需要一個地圖參數

(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)))