2016-10-25 3 views
0

Slick 3.1.0에서 다음 모델을 모델링하려고합니다.매끄러운 일대일 및 그룹화

case class Review(txt: String, userId: Long, id: Long) 
case class User(name: String, id: Long) 
case class ReviewEvent(event: String, reviewId: Long) 

내가 좋아 보이는 FullReview라는 클래스를 채울 필요가; 나는 각 모델에 맞는 테이블이 가정

case class FullReview(r: Review, user: User, evts: Seq[ReviewEvent]) 

, 정말 같이하여 조인의 조합 및 그룹을 사용하여 FullReview를 가져 오기 위해 노력하고있어 :

val withUser = for { 
    (r, u) <- RTable join UTable on (_.userId === _.id) 
} 

val withUAndEvts = (for { 
    ((r, user), evts) <- withUser joinLeft ETable on { 
    case ((r, _), ev) => r.id === ev.reviewId 
    } 
} yield (r, user, events)).groupBy(_._1._id) 

이 항복하는 것 , 중첩 된 Query 유형을 볼 수 있습니다. 여기서 내가 뭘 잘못하고 있니?

+0

무엇이 오류입니까? – pamu

+0

@pamu 오류 자체는 없습니다. 'db.run' 블록 안에서 이것을 어떻게 소비할까요? 예를 들어,'user_id'에 의한 리뷰 목록을 데이터베이스에 질의하는'Seq [FullReview]'를 얻고 싶습니다. – Ashesh

+1

[this] (http://olivebh.com/scala-play-slick.html) 멋진 블로그 게시물을 참조하십시오. –

답변

0

주위를 어지럽 혀지면서 클라이언트에서 집계하는 것이 더 나을 것이라고 생각했습니다. 간접적으로 말하자면, 테이블 ETable의 100 개의 행이 RTable의 단일 행과 일치하면 클라이언트에서 여러 행을 얻게됩니다. 그런 다음 클라이언트는 ReviewEvent을 모두 그룹화하기 위해 자체 집계를 구현해야합니다 (Review).

페이지 매김과 관련하여 다음과 같은 작업을 수행 할 수 있습니다.

def withUser(page: Int, pageSize: Int) = for { 
    (r, u) <- RTable.drop(page * pageSize).take(pageSize) join UTable on (_.userId === _.id) 
} 

지금은 충분히 세련된 것 같습니다. 누군가가 더 나은 대답을하면 기꺼이 들려 줄 것입니다.

1

내가 제대로 이해하면, 당신은 예를 사용할 수 있습니다 :

val users = TableQuery[Users] 
val reviews = TableQuery[Reviews] 
val events = TableQuery[ReviewEvents] 

override def findAllReviews(): Future[Seq[FullReview]] = { 
    val query = reviews 
    .join(users).on(_.userId === _.id) 
    .joinLeft(events).on(_._1.id === _.reviewId) 

    db.run(query.result).map { a => 
    a.groupBy(_._1._1.id).map { case (_, tuples) => 
     val ((review, user), _) = tuples.head 
     val reviewEvents = tuples.flatMap(_._2) 
     FullReview(review, user, reviewEvents) 
    }.toSeq 
    } 
} 

를이 요청에 페이지 매김을 추가하려는 경우, 이미 herehere 전체 예입니다 대답했습니다.

+0

답장을 보내 주셔서 감사합니다. 그것이 바로 내가 해왔 던 것과 나의 대답이 제시 한 것입니다. 그룹화는 클라이언트에서 수행되어야합니다. 이 접근법의 문제점은 1000 개의 이벤트가있는 검토를 위해 1000 개의 행을 검색하는 것입니다. 그것이 내가 피하고 싶었던 것입니다. 누군가가 그런 상황에 대한 성능 메트릭을 실행했는지 확인하고 싶습니다. – Ashesh