2014-11-06 83 views
2

我是新來的Scala,Play和Anorm,所以我想知道我該怎麼做。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

您使用的數據庫是? – 2014-11-06 20:10:11

+0

我正在使用MySQL – 2014-11-06 20:11:18

+0

可能的重複[生成日期範圍內的日期](http://stackoverflow.com/questions/2157282/generate-days-from-date-range) – 2014-11-06 20:26:23

回答

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 streaming 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