Я пытаюсь создать функцию, которая принимает необязательный атрибут sort или filter для запроса и применяет их к TableQuery, если атрибут существует, если нет, возвращает что-то запрашиваемое, к которому я могу затем применить другие фильтры.
То, что я хочу закончить, примерно так:
MyTableInstance.applySearchTerm(termOption).applySorting(sortOption).filter(do other stuff here)
Что я придумал до сих пор, так это:
private implicit def applySearchTerm[U <: Query[IssueDao#IssueTable, Issue, Seq]](table: U)(
term: Option[String]): U =
term match {
case Some(term) => table.filter(_.title === term)
case None => table
}
private def applyFilters(filters: Filters) =
IssueTable.applySearchTerm(filters.term)
Насколько я понимаю, TableQuery
расширяет класс Query
, в то время как вызов filter
или других методов запроса возвращает Query[T, T#TableElementType,Seq]
, поэтому я попытался определить верхнюю границу типа и вернуть ее, но это дает мне
[error] found : slick.lifted.Query[dao.IssueDao#IssueTable,models.Issue,Seq]
[error] required: U
[error] case Some(term) => table.filter(_.title === term)
Я не совсем уверен, в чем здесь ошибка. Компилятор жалуется, потому что возвращаемое значение не ограничено верхним типом, а точным типом?
Я видел решение, предлагающее реализацию пользовательской черты, которая, кажется, решает эту проблему, но я не уверен, что это лучший способ, и я пытаюсь понять, как эти ограничения типов применяются в Scala.
Было бы замечательно, если бы кто-то мог указать мне правильное направление.
Заранее спасибо!