2017-04-23 12 views
2

私は2つの左の結合(これはRep[Option[...]]となります)と列マップを持つSlickクエリを持っています。私は結果に(likeを使用して)フィルタリングする必要があります。 3つの列のいずれかがlikeの条件と一致する場合は、結果に行を含める必要があります。したがって、テーブルを事前にフィルタリングできません。結果の結合をフィルタリングする必要があります。Rep[Option]とすべて。Slick 3.1、Left Joins and Filters

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

次は私のために働くようだ:

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