填写Anorm结果中的日期差距

时间:2014-11-06 20:07:45

标签: scala playframework anorm

我是Scala,Play和Anorm的新手,所以我想知道我该怎么做。

我有一个查询我的数据库,该数据库返回一个日期,格式为DD/MM HH:OOLong为总数。

我想显示每小时总图表,因此我创建了一个byhour解析器:

val byhour = {
get[Option[String]]("date") ~ get[Long]("total") map {
    case date ~ total => (date, total)
}

当然,这只会返回我有数据的日期。我想用日期和总共0来填补日期空白,但我不知道该怎么做。

提前致谢!

编辑:我知道可以在MySQL中执行此操作,但我更喜欢在Scala中执行此操作以保持查询清洁。

1 个答案:

答案 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