Slick — скомпилировано с динамической sortBy

Я знаю, что касается slick 2.1. можно использовать ConstColumn для взятия и удаления предварительно скомпилированных запросов с использованием «Compiled».

private val findXXXCompiled = Compiled { 
    (someId:Column[Long], sortBy:???, drop:ConstColumn[Long], take:ConstColumn[Long]) =>
    val q = findXXX(someId) // returns a Query

    // I want to use query composition on "q" in order to further restrict my result:
    q.sortBy {
      case (_, name, state) => sortBy match {
        case ??? => name.asc
        case ??? => name.desc
        case ??? => state.asc
        case ??? => state.desc
      }
    }.drop(drop).take(take) // possible since slick 2.1. as described above using type ConstColumn
}

Приведенный выше пример кода запускается пользователем из пользовательского интерфейса с табличным макетом. Если пользователь нажимает на заголовок «имя», то таблица должна быть отсортирована по «имени» — то же самое для «состояния».

Аспект, который я не могу приступить к работе, - это объединить предварительную компиляцию с динамической сортировкой (в зависимости от щелкнутого заголовка в макете таблицы). Динамическая сортировка, конечно, работает без предварительной компиляции запроса. Но поскольку метод «findXXX» довольно сложен, мне определенно нужно выполнить предварительную компиляцию из соображений производительности. Любой намек на то, как добиться предварительной компиляции с динамической сортировкой?

См. также: https://groups.google.com/forum/#!topic/scalaquery/my4EYt51qEM


person tfh    schedule 20.11.2014    source источник
comment
Вызывающий код уже должен знать, какую сортировку необходимо выполнить (он передается в параметре sortBy), так почему бы не вызывать разные функции для каждого столбца? Если это слишком много накладных расходов, если вы переместите сопоставление на уровень выше, а затем вызовете полную функцию sortBy на основе того, с каким столбцом вы сопоставили, повлияет ли это на предварительную компиляцию?   -  person anandsun    schedule 28.07.2017
comment
(старый вопрос, но есть щедрость, так есть ли еще интерес?) Наивно я бы предложил ConstColumn[String], но думаю, это не сработает. лучше всего использовать скомпилированный запрос для сортировки и использовать карту для их поиска, что решает вашу проблему - предположим, это то, что вы использовали? думаю, трудно написать, не повторяя какой-то код, но все же он должен быть довольно компактным. как я сделать предложение?   -  person Ossip    schedule 21.10.2019


Ответы (1)


Slick не предоставляет возможности запоминать скомпилированные запросы для динамической sortBy. Я решил, что единственный способ решить эту проблему — запомнить скомпилированный запрос для каждого столбца сортировки и найти запрос на основе динамического ключа сортировки. т. е. создайте карту, где ключ — это имя столбца сортировки, а значение — скомпилированный запрос с sortBy для столбца.

Конечно, это не сработает, если в скомпилированном запросе есть объединение, и вы хотите выполнить сортировку по столбцу из объединяемой таблицы.

Если производительность не имеет значения и у вас нет других причин использовать скомпилированные запросы, просто не используйте их.

person Sudheer Aedama    schedule 25.10.2019