Как вернуть запрашиваемый подэкземпляр TableQuery? - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь создать функцию, которая принимает необязательный атрибут 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.

Было бы замечательно, если бы кто-то мог указать мне правильное направление.

Заранее спасибо!

...