首页 文章

如何使用光滑的3.2过滤scala中的ADT列表

提问于
浏览
1

我有一个以下案例类的列表

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

这些字段对应于我想要搜索的mySQL表的列 . 基本上我想过滤每个case类实例,其中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

当然,它将使用字符串连接生成,因为所有case类字段都是可选的 . 如何优雅地解决这个问题(不使用光滑的纯SQL查询)?

1 回答

  • 0

    我们想出了如何基于this answer来解决这个问题

    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 [_] .

相关问题