我是Scala,Play和Anorm的新手,所以我想知道我该怎么做。
我有一个查询我的数据库,该数据库返回一个日期,格式为DD/MM HH:OO
,Long
为总数。
我想显示每小时总图表,因此我创建了一个byhour
解析器:
val byhour = {
get[Option[String]]("date") ~ get[Long]("total") map {
case date ~ total => (date, total)
}
当然,这只会返回我有数据的日期。我想用日期和总共0来填补日期空白,但我不知道该怎么做。
提前致谢!
编辑:我知道可以在MySQL中执行此操作,但我更喜欢在Scala中执行此操作以保持查询清洁。
答案 0 :(得分:0)
我不认为这与Anorm直接相关,这将允许您在之后的解析结果中填补空白。
第一个选项是List[(String, Long)]
使用.as(byhour.*)
得到无序结果,按日期排序,然后在缺少日期时填零。
SQL"...".as(byhour.*).sortBy(_._1).
foldLeft(List.empty[(String, Long)]) {
case (p :: l, (d, t)) =>
(d, t) :: prefill(p, d, l)
case (l, (d, t)) =>
(d, t) :: l // assert l == Nil
}.reverse
/**
* @param p Previous/last tuple
* @param d Current/new date
* @param l List except `p`
* @return List based on `l` with `p` prepended and eventually before with some filler tuple prepended.
*/
def prefill(p: (String, Long), d: String, l: List[(String, Long)]): List[(String, Long)] = ???
否则,如果您查询按日期排序的返回结果,您可以使用Anorm流API并在发现后立即填补空白。
// Anorm 2.3
import anorm.Success
SQL"... ORDER BY date ASC".apply().
foldLeft(List.empty[(String, Long)]) {
case (l, row) =>
byhour(row) match {
case Success((d, t)) =>
l match {
case p :: ts =>
(d, t) :: prefill(p, d, l)
case _ => (d, t) :: l
}
case _ => ??? // parse error
}
}.reverse