2012-06-27 2 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] 

분명히 더 간결하다. {...} 블록의 각 작업에 대해 오른쪽 투영을 사용하고 싶습니다. "실패"기본 또는 완전하게 정제되지 않은 쿼리를 실행하는 왼쪽 결과 및 성공 전체 결과를 실행하는 올바른 결과 + 상세 검색 . 이 ;-) 컴파일하지만 일반적인 원칙은 왼쪽/오른쪽 쿼리를 통해 스레드하는 것입니다

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(_,_) } } 
} 

말도 모두가 고객의 목록을 반환하는 것이 성과.

참고 : mapper companion 개체를 사례 클래스의 복수형으로 이름 지정하는 경향이 있으므로이 경우 CustomerTable 대신 Customers를 사용했습니다. 또한, Customers.createFinder(_.id) desugars에 : 느리게 DBMS를 기본위한 효율적인 준비가 문을 생성

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

.

일하는 것은 물론 일회용 케이스가 괜찮은 것 같습니다. 개인적으로, 나는 {} +를 파헤 치고 있습니다. 올바른 계획을 세우거나, 케이크를 먹고 먹을 수도 있습니다. 즉, 실패의 두 지점을 모두 얻습니다. 왼쪽의 결과와 성공적인 오른쪽의 결과. , 어떤 단계가 실제로 잘못되었는지 전혀 알려주지 않고 성공적인 이벤트 만 생성합니다.