0

次のようなマップの形式で動的に生成されたパラメーターのセットがあります

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

ステートメントで論理和を取りたいwhereので、Korma クエリと同等になる必要があります。

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

マップのリストを生成するのはとても簡単です:

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

しかし、がその値にバインドされる(or前に、マクロ展開時に処理されるため、それに適用されたステートメントを使用することはできません。clauses

そのような場合、どのステートメントを使用する必要がありますか?

4

1 に答える 1

0

Korma のソース コードに慣れてきた後、とのステートメントkorma.sql.fns/pred-orを置き換える関数を見つけました。そこで、マップ引数を取る次のヘルパー関数を書きましたorwherehaving

(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)))
于 2014-07-14T18:56:19.600 に答える