2012-06-27 38 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的高效制备语句。

你有什么作品当然,看起来很好的一次性案件。就个人而言,我正在挖掘{} +正确的预测,可以有你的蛋糕,也可以吃它 - 即得到两个失败点左的结果和成功的正确结果,而不是{...}通过选项,这只会产生一个成功的事件,根本不会提供关于哪一步实际出错的信息。