我想加入一个任意长度的过滤器列表or
。如果列表是固定长度的,它将如下所示:
query.filter(filters(0) || filters(1) || … || filter(n))
加入过滤器and
很容易:
for (filter ← filters)
query = query.filter(filter)
Boolean
将评估为s 的事物与 s 相连接or
也很容易:
val any = evaluateToBools.foldLeft(true)(
(left: Boolean, right: Eval2Bool) =>
left || right.evaluate
)
更新:
正如我写的那样,如果 scalaqueryfilter
是标准的,那将很容易。不幸的是,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 ... )
…或者可以将 sqlin
运算符与这样的元组一起使用吗?
... 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)
……但这太骇人听闻了。
解决方案
我这样实现了 Stefan 的解决方案:
rq = rq filter { d ⇒
markers map { tm ⇒
(d._4 is tm._1) && (d._5 is tm._2)
} reduceLeft { _||_ }
}