2016-07-27 10 views
0

시나리오는 How to better parse the same table twice with Anorm?의 질문과 유사하지만 더 이상이 질문에 대한 설명 된 솔루션을 사용할 수 없습니다.In Anorm에서 여러 개의 ColumnAliaser를 동일한 쿼리에 적용 할 수 있습니다.

Message에 2 명의 사용자가있는 시나리오에서 SQL 조인을 사용하여 from_user 및 to_user를 구문 분석해야합니다. 그것은 어떤으로 구성/정의 할 수 있도록

case class User(id: Long, name: String) 

case class Message(id: Long, body: String, to: User, from: User) 

def userParser(alias: String): RowParser[User] = { 
    get[Long](alias + "_id") ~ get[String](alias + "_name") map { 
     case id~name => User(id, name) 
    } 
} 

val parser: RowParser[Message] = { 
    userParser("from_user") ~ 
    userParser("to_user") ~ 
    get[Long]("messages.id") ~ 
    get[String]("messages.name") map { 
     case from~to~id~body => Message(id, body, to, from) 
    } 
} 

// More alias here possible ? 
val aliaser: ColumnAliaser = ColumnAliaser.withPattern((0 to 2).toSet, "from_user.") 

SQL""" 
SELECT from_user.* , to_user.*, message.* FROM MESSAGE 
JOIN USER from_user on from_user.id = message_from_user_id 
JOIN USER to_user on to_user.id = message.to_user 
""" 
.asTry(parser, aliaser) 
+0

하십시오 정확한 질문 : 나는 (그것을 분명히 할 수있는 불변으로)하지만이 가능 동일한 쿼리에'여러 ColumnAliaser'을 적용 할 질문은 'ColumnAliaser' 인스턴스를 재사용 할 수 있는지없는 것 같다 – cchantep

답변

2

내가 바로 당신이 동일한 쿼리에 다른 앨리어싱 정책을 여러 ColumnAliaser을 적용 할 생각하고 있다면, 그것은, ColumnAliaser는 "단지"는 specific implementation of Function[(Int, ColumnName), Option[String]] 것을 이해하는 것이 중요합니다 Function이며 공장 기능에 의해 companion object으로 단순화됩니다.

import anorm.{ ColumnAliaser, ColumnName } 

val aliaser = new ColumnAliaser { 
    def as1 = ColumnAliaser.withPattern((0 to 2).toSet, "from_user.") 
    def as2 = ColumnAliaser.withPattern((2 to 4).toSet, "to_user.") 

    def apply(column: (Int, ColumnName)): Option[String] = 
    as1(column).orElse(as2(column)) 
}