Я хочу присоединиться к списку фильтров произвольной длины с 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
)
Обновление:
как я написал, было бы легко, если бы scalaquery filter
был стандартным. к сожалению, scalaquery разрешает выполнение этих фильтров только механизмом sql.
поэтому мой конкретный вопрос будет:
если у меня есть набор строковых кортежей:
val tms = Set( ("A","a"), ("B", "b"), ... )
и запрос с двумя столбцами «t» и «m»,
как мне сгенерировать фильтр, который представляет следующий SQL:
... WHERE/AND ( (t="A" and m="a") or (t="B" and m="b") or ... )
… или можно ли использовать операторы sql in
с такими кортежами, как этот?
... WHERE (t,m) IN (("A","a"), ("B","b"), ...)
и если да, то как это сделать в скалярном запросе
Hack:
В настоящее время я делаю следующее:
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 { _||_ }
}