2017-04-23 1 views
2

두 개의 왼쪽 조인 (결국 Rep[Option[...]]이 됨) 및 열 맵이있는 Slick 쿼리가 있습니다. 결과에 대해 필터링 (like 사용)해야합니다. 세 열 중 하나가 like 기준과 일치하면 행을 결과에 포함해야하므로 표를 사전 필터링 할 수 없습니다. 결과 조인을 필터링해야합니다 (Rep[Option]).Slick 3.1, 왼쪽 조인 및 필터

Rep[Option[String]] 열을 필터링하는 방법을 생각할 수 없습니다. 아래의 코드는 "symbol ||을 해결할 수 없습니다"때문에 컴파일되지 않습니다. - 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

나를 위해 작동하는 것 같다 :

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]) 
    })