2012-06-27 41 views
1

我有一個查詢,我有條件地增強依賴計數和偏移參數的存在或缺失。有條件地增強ScalaQuery查詢

val retrieveCustomer: (Option[String], Option[Int], Option[Int]) => List[Customer] = { (customerId : Option[String], count : Option[Int], offset : Option[Int]) => 
    val initialQ: Query[CustomerTable.type, Customer] = customerId.map(c => CustomerTable.where(_.id === c)).getOrElse(CustomerTable.map { c => c }) 
    val qPlusOffset = offset.map (offset => initialQ.drop(offset)).getOrElse(initialQ) 
    val qoPlusLimit = count.map(count => qPlusOffset.take(count)).getOrElse(qPlusOffset) 

    DBGlobal.db.withTransaction { qoPlusLimit.list } 

}

我很好奇,如果有寫此相比,這種方法更簡潔的方式。

祈禱告訴。

回答

0

這是一個班輪。

val qFinal = initialQ.drop(offset.getOrElse(0)).take(count.getOrElse(Int.MaxValue)) 
2

寫這個的意義何在?

val retrieveCustomer: (Option[String], Option[Int], Option[Int]) => List[Customer] = { (customerId : Option[String], count : Option[Int], offset : Option[Int]) 

當你可以寫這樣的事情:

def getCustomer(id: String, count: Option[Int], offset: Option[Int]): List[Customer] 

這顯然更簡潔,雖然可能有無關,與你之後的簡潔。我傾向於在{...}區塊的每個操作中使用Either Right預測,「失敗」左邊的結果執行基本或非完全查詢,並且成功的Right結果執行完全下降+執行精化。

def getCustomer(id: String, count: Option[Int], offset: Option[Int]): List[Customer] = { 
    val base = Customers.createFinder(_.id) 
    val q = for{ 
     cust <- base(id) toRight(List[Customer]()) 
     dropped <- cust.drop(offset) toRight(cust) 
     taken <- dropped.take(count) toRight(dropped) 
    } yield taken 
    DBGlobal.db.withTransaction { q.list map { _.fold(_,_) } } 
} 

不太可能,這編譯;-),但總的原則是通過左/右查詢線程成果,這兩個回報客戶的名單。

注意:我傾向於以case class的複數形式命名mapper伴侶對象,因此在這種情況下,我使用Customers來代替CustomerTable。此外,Customers.createFinder(_.id) desugars到:

for{ 
    id <- Parameters[String] 
    c <- Customers if c.id is id 
} yield c 

該懶惰地生成用於底層DBMS的高效製備語句。

你有什麼作品當然,看起來很好的一次性案件。就個人而言,我正在挖掘{} +正確的預測,可以有你的蛋糕,也可以吃它 - 即得到兩個失敗點左的結果和成功的正確結果,而不是{...}通過選項,這隻會產生一個成功的事件,根本不會提供關於哪一步實際出錯的信息。