Scala + Slick - рассчитывайте на результаты GroupBy

77
6

Я пытаюсь получить счет из БД, используя groupBy в моем коде Scala + Slick.

Здесь мой неполный код:

object DBJobs extends Table[DBJob]("encoder_job") {
object Status extends Enumeration {
val local = Value("LOCAL")
val encoding = Value("ENCODING")
val done = Value("DONE")
val error = Value("ERROR")
}
implicit val StatusMapper = MappedTypeMapper.base[Status.Value, String] (
{x => x.toString},
{x => x match {case "LOCAL"=>Status(0);case "ENCODING"=>Status(1);case "DONE"=>Status(2);case "ERROR"=>Status(3)}}
)

def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def status = column[DBJobs.Status.Value]("status", O.NotNull)

def getStats()(implicit session:Session):mutable.Map[Status.Value, Int] = {
var map = mutable.Map[Column[Status.Value], Column[Int]]()
val q = (for { j <- DBJobs } yield (j)).groupBy(_.status).map{
case (s, results) =>
map = map += (s -> results.length)
}
map
}
}

Моя проблема заключается в том, как поместить данные в мою карту как [DBJobs.Status, Int] вместо [Column [Status.Value], Column [Int]].

Здесь эквивалент SQL:

SELECT COUNT( 1 ), status FROM encoder_job GROUP BY STATUS 

Версия для печати: 1.0.1

благодаря

спросил(а) 2021-01-25T16:10:15+03:00 5 месяцев назад
1
Решение
110

def getStats()(implicit session:Session):mutable.Map[Status.Value, Int] = {
Query(DBJobs).groupBy(_.status).map{
case (s, results) => (s -> results.length)
}
}

// usage
val results = getStats.run

Имейте в виду, что метод put в объекте таблицы напрямую не может быть легко перенесен на Slick 2.0. Поместите их отдельно, например, как расширения методов. Также см. Https://groups.google.com/d/msg/scalaquery/xNtPT6sexXI/zlkgxv6lZ6YJ

ответил(а) 2021-01-25T16:10:15+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема