2012-10-02 16 views
6

के साथ playframework 2.0 में एक एनोर्म पार्सर का पुन: उपयोग कैसे करें I computer-database sample पर एक नज़र डाली है और मैंने देखा है कि कंप्यूटर पार्सर का पुन: उपयोग करने के लिए, सूची विधि कंप्यूटर का उपयोग करती है। साथ कॉम्पैनी पार्सर, जो एक ट्यूपल देता है की (कम्प्यूटर, कंपनी)स्काला

मामले मैं संभाल करने के लिए है में, इस

मामले वर्ग कंप्यूटर (आईडी की तरह कंप्यूटर मैं एक कंप्यूटर वस्तु करना चाहते हैं की आईडी के लिए एक संदर्भ के बजाय: पी [ लंबा] = NotAssigned, नाम: स्ट्रिंग, पेश किया गया: विकल्प [दिनांक], बंद: विकल्प [तिथि], कंपनी: कंपनी)

तो मुझे लगता था कैसे ing मैं निम्नलिखित की तरह कुछ (यह seudocode, निश्चित रूप से)

val simple = { 
    get[Pk[Long]]("computer.id") ~ 
    get[String]("computer.name") ~ 
    get[Option[Date]]("computer.introduced") ~ 
    get[Option[Date]]("computer.discontinued") ~ 
    get[Company]("company.*") map { 
    case id~name~introduced~discontinued~company => Computer(id, name, introduced, discontinued, company) 
    } 
} 

जाहिर है हासिल कर सकते हैं, मुश्किल हिस्सा getCompany

किसी भी विचार को हल करने के लिए कैसे होगा ???

उत्तर

5

मैं एक आइडिया इकाई और एक IdeaType इकाई (यह, कंप्यूटर और कंपनी की तरह है कंप्यूटर डेटाबेस उदाहरण में)

case class IdeaTest(
    val id: Pk[Long]   = NotAssigned, 
    val name: String   = "unknown idea", 
    val description: String = "no description", 
    val kind: IdeaType  = IdeaType() 
) 

case class IdeaType (
    val id: Pk[Long] = NotAssigned, 
    val name: String = "unknown idea type", 
    val description: String = "no description" 
) 

मैं एक TypeParser

val typeParser: RowParser[IdeaType] = { 
    get[Pk[Long]]("idea_type.id") ~ 
    get[String]("idea_type.name") ~ 
    get[String]("idea_type.description") map { 
    case id~name~description => IdeaType(
     id, name, description 
    ) 
    } 
} 

और पहली बात मैं परिभाषित है कोशिश की गई थी:

val ideaParser: RowParser[IdeaTest] = { 
    get[Pk[Long]]("idea.id") ~ 
    get[String]("idea.name") ~ 
    get[String]("idea.description") ~ 
    typeParser map { 
    case id~name~description~ideaType => IdeaTest(
     id, name, description, ideaType 
    ) 
    } 
} 

भले ही यह संकलित हो जाए, फिर भी इसे लोड करने में परेशानी होती है विचार टाइप करें।

अंत में, मैं कोई ideaType के साथ एक ideaParser को परिभाषित करने और एक typeParser साथ यह रचना करने के लिए किया था:

val typeParser: RowParser[IdeaType] = { 
    get[Pk[Long]]("idea_type.id") ~ 
    get[String]("idea_type.name") ~ 
    get[String]("idea_type.description") map { 
    case id~name~description => IdeaType(
     id, name, description 
    ) 
    } 
} 

val ideaWithTypeParser = ideaParser ~ typeParser map { 
    case idea~kind => (idea.copy(kind=kind)) 
} 

और इस का उपयोग कर कोड है:

def ideaById(id: Long): Option[IdeaTest] = { 
    DB.withConnection { implicit connection => 
    SQL(""" 
     select * from 
     idea inner join idea_type 
     on idea.idea_type_id = idea_type.id 
     where idea.id = {id}"""). 
     on('id -> id). 
     as(ideaParser.singleOpt) 
    } 
} 

केवल मुसीबत मैं देखें, क्या मुझे आइडियाटेस्ट ऑब्जेक्ट को एक असंगत स्थिति में बनाना है (बिना विचार के टाइप करें) और फिर इसे सही आइडिया टाइप के साथ किसी अन्य इंस्टेंस में कॉपी करें।

+1

यह उत्तर वास्तव में उपयोगी था और पार्सर्स लिखने की मेरी समझ को मजबूत करने में मदद मिली, धन्यवाद! – EdgeCaseBerg