如何使用 slick 3.2 在 scala 中使用 ADT 列表进行过滤

How to filter with a list of ADTs in scala with slick 3.2

我有以下案例的列表class

case class caseClass
(
  field1: Option[String],
  field2: Option[String],
  field3: Option[String]
)

这些字段对应于 mySQL table 的列,我想在其中搜索。基本上我想过滤每个案例 class 实例,其中field1,field2,field3之间是AND关系,实例之间是OR关系。在 SQL 中会是这样的:

SELECT
    field4,
    field5
FROM
    tablename
WHERE
    (field1 = ? AND field2 = ?) OR
    (field3 = ?) OR 
    (field1 = ? AND field2 = ? AND field3 = ?) OR 
    ...etc

当然,它会通过字符串连接生成,因为所有大小写 class 字段都是可选的。 我怎样才能用 slick 优雅地解决这个问题(不使用 slick 的普通 SQL 查询)?

我们根据想出了解决这个问题的方法

def queryGenerator
(
  listOfCaseClasses: List[CaseClass],
  table: TableQuery[CaseClassvTable]
) = {
  val query = table.filter { row =>
    listOfCaseClasses.map { parameter =>
      List(
        (row.field1vTable === parameter.field1, parameter.field1),
        (row.field2vTable === parameter.field2, parameter.field2),
        (row.field3vTable === parameter.field3, parameter.field3),
      ).collect{ case (x, Some(_)) => x }.reduce(_ && _)
    }.reduce(_ || _)
  }.result
  query
}

我不知道如何根据 Rep[Option[Boolean]] 表达式(元组的第一部分)进行过滤,所以我想我将列表设为元组列表,其中第二部分部分是 CaseClass 的参数。而且很容易过滤普通的 Option[_]。