2016-07-27 11 views
0

Das Szenario ähnelt der Frage bei How to better parse the same table twice with Anorm?, aber die beschriebenen Lösungen zu dieser Frage können nicht mehr verwendet werden.In Anorm ist es möglich, mehrere ColumnAliaser auf die gleiche Anfrage anzuwenden

In dem Szenario, in dem eine Nachricht 2 Benutzer hat, muss ich die from_user und to_user mit SQL-Joins analysieren.

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

Bitte genau die Frage: Ich denke, die Frage ist nicht, ob eine 'ColumnAliaser' Instanz wiederverwendet werden kann (wie es kann offensichtlich als unveränderlich), aber ist es möglich, mehr' ColumnAliaser' auf die gleiche Abfrage anwenden – cchantep

Antwort

2

Wenn ich richtig denke Sie mehrere ColumnAliaser mit verschiedenen Alias-Richtlinien auf die gleiche Abfrage anwenden möchten, ist es wichtig zu verstehen, dass ColumnAliaser ist „nur“ ein specific implementation of Function[(Int, ColumnName), Option[String]], so dass er wie jeder definiert werden kann/zusammengesetzt Function, und ist durch die Factory-Funktionen in seiner companion object vereinfacht.

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)) 
}