Слик динамически фильтровать по списку столбцов и значений - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь создать запрос в пятно с динамической фильтрацией. У меня есть Seq[(String, String)], где первый элемент кортежа - это имя столбца, а второй - значение, против которого делают фильтр.

В псевдокоде я хочу сделать что-то вроде этого:

val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable) {
    case(query, (column, value)) => query.filter(select(column) === value)
}

У меня уже есть функция def select(name: String): Rep[_], которая возвращает столбец Rep, начиная с его имени, который работает хорошо, но я не знаю, как получить все последствия, необходимые для выполнения функции === (или других функций сравнения ) работа.

Есть ли способ сделать такую ​​динамическую фильтрацию в пятно?

1 Ответ

0 голосов
/ 09 ноября 2018

Да, есть!

Я использую этот метод

private def applyOperator[T](left: Rep[T], right: Rep[T], operator: String)(implicit om: OptionMapper2[T, T, Boolean, T, T, Boolean]): Rep[Boolean] = {
    operator match {
      case "==" => new BaseColumnExtensionMethods(left) === right
      case "!=" => new BaseColumnExtensionMethods(left) =!= right
      case "like" => new StringColumnExtensionMethods(left.asInstanceOf[Rep[String]]) like right.asInstanceOf[Rep[String]] //Breaks if T is not String
    }
  }

Тогда вы можете написать что-то вроде

val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable) {
    case(query, (column, value)) => query.filter(applyOperator(yourFunctionForColumnFromName(column),value, "=="))
}
...