光滑3.1,左连接和过滤器

时间:2017-04-23 14:47:09

标签: scala slick slick-3.0

我有一个带有两个左连接(最终为Rep[Option[...]])和列映射的Slick查询。我需要对结果进行过滤(使用like)。如果三列中的任何一列符合like条件,则必须在结果中包含一行,因此我无法对表进行预过滤 - 我必须过滤生成的连接,Rep[Option]和所有

我无法计算如何过滤Rep[Option[String]]列。由于“无法解析符号||”,下面的代码无法编译 - 如果我删除Rep[Option]列时编译完好。

val joinedTable = Sites.map(s=>(s.id, s.gisId))
                       .joinLeft(SiteText.filter(_.lang==="jp").map(l=>(l.name, l.siteId))).on{ case(s,t)=>s._1===t._2 }
                       .joinLeft(SiteText.filter(_.lang==="en").map(l=>(l.name, l.siteId))).on{ case(st,t)=>st._1._1===t._2 }

val searchedTable = joinedTable.filter { row =>
  List(
    searchStr.map( t => row._1._1._2 like t ),
    searchStr.map( t => row._1._2.map(_._1 like t) ),
    searchStr.map( t => row._2.map(_._1 like t) )
  ).collect({case Some(criteria)  => criteria}).reduceLeftOption(_ || _).getOrElse(true: Rep[Boolean])
}

1 个答案:

答案 0 :(得分:1)

以下似乎对我有用:

joinedTable
  .filter({ case ((a, b), c) => List(
      searchStr.map(t => (a._2 like t)),
      searchStr.map(t => b.filter(_._1 like t).isDefined),
      searchStr.map(t => c.filter(_._1 like t).isDefined)
    )
    .flatten
    .reduceLeftOption(_ || _)
    .getOrElse(false: Rep[Boolean])
  })