フィルタの任意の長さのリストを で結合したいor
。リストが固定長の場合、次のようになります。
query.filter(filters(0) || filters(1) || … || filter(n))
フィルターを結合するのand
は簡単です:
for (filter ← filters)
query = query.filter(filter)
Boolean
s と評価されるものを結合するのor
も簡単です:
val any = evaluateToBools.foldLeft(true)(
(left: Boolean, right: Eval2Bool) =>
left || right.evaluate
)
アップデート:
filter
私が書いたように、scalaqueryが標準的なものであれば簡単です。残念ながら、scalaquery では、SQL エンジンによるこれらのフィルターの実行しか許可されていません。
だから私の具体的な質問は次のようになります: 文字列タプルのセットがある場合:
val tms = Set( ("A","a"), ("B", "b"), ... )
2 つの列「t」と「m」を含むクエリ、
次の SQL を表すフィルターを生成するにはどうすればよいですか?
... WHERE/AND ( (t="A" and m="a") or (t="B" and m="b") or ... )
in
…または、このようなタプルでSQL 演算子を使用できますか?
... WHERE (t,m) IN (("A","a"), ("B","b"), ...)
もしそうなら、scalaqueryでそれを行う方法
ハック:
現在、私は次のことを行います:
val tms = markers map { tm ⇒ tm._1 +"||"+ tm._2 }
query.filter(d ⇒ d._4 ++"||"++ d._5 inSet tms)
…しかし、それは耐え難いハックです。
解決
私はステファンのソリューションを次のように実装しました:
rq = rq filter { d ⇒
markers map { tm ⇒
(d._4 is tm._1) && (d._5 is tm._2)
} reduceLeft { _||_ }
}