2016-09-29 14 views
16

के रूप में कॉलम का सबसेट पुनर्प्राप्त करना मैं Slick 3.1.1 के साथ काम कर रहा हूं और समस्या यह है कि कुछ मामलों में मैं कुछ कॉलम छोड़ना चाहता हूं जो काफी भारी हैं और अभी भी कॉलम के सबसेट को भौतिक रूप से पूरा करते हैं केस क्लासSlick 3.1 - केस क्लास

class AuditResultTable(tag: Tag) extends Table[AuditResult](tag, AuditResultTableName) { 
    def auditResultId: Rep[Long] = column[Long]("AuditResultId", O.PrimaryKey, O.AutoInc) 
    def processorId: Rep[Long] = column[Long]("ProcessorId") 
    def dispatchedTimestamp: Rep[Timestamp] = column[Timestamp]("DispatchedTimestamp", O.SqlType("timestamp(2)")) 
    def SystemAOutput: Rep[Array[Byte]] = column[Array[Byte]]("SystemAOutput", O.SqlType("LONGBLOB")) 
    def SystemBOutput: Rep[Array[Byte]] = column[Array[Byte]]("SystemBOutput", O.SqlType("LONGBLOB")) 
    def isSuccessful: Rep[Boolean] = column[Boolean]("IsSuccessful") 


def * : ProvenShape[AuditResult] = (processorId, dispatchedTimestamp, systemAOutput, systemBOutput, isSuccessful, auditResultId) <> 
    (AuditResult.tupled, AuditResult.unapply) 

} 

val auditResults = TableQuery[AuditResultTable] 

इसी मामले वर्ग:

case class AuditResult (
    ProcessorId: Long, 
    DispatchedTimestamp: Timestamp, 
    SystemAOutput: Array[Byte], 
    SystemBOutput: Array[Byte], 
    IsSuccessful: Boolean, 
    AuditResultId: Long = 0L 
) 

और अंत में डेटा का उपयोग क्वेरी:

निम्न तालिका परिभाषा पर विचार करें

def getRecentFailedAuditsQuery(): Query[AuditResultTable, AuditResult, Seq] = { 
    auditResults.filterNot(r => r.isSuccessful) 
} 

मैं माना जाता है और में देखा विकल्प in this (outdated) answer और अन्य प्रस्तुत किए गए:

  • डिफ़ॉल्ट प्रक्षेपण से भिन्न प्रक्षेपण होने के कारण जो "AuditResult के हल्के संस्करण" के लिए मानचित्र करता है, उदा। AuditResultLight जो उन कॉलम को छोड़ देता है - मेरे सर्वोत्तम प्रयास के बावजूद मैं यह काम नहीं कर सका - मुझे लगता है कि यह सही दृष्टिकोण हो सकता है - एक बार जब मेरे पास "काम करने" प्रक्षेपण था, तब भी मुझे एक स्लिक् त्रुटि मिली "कोई मिलान आकार नहीं मिला। Slick को नहीं पता कि दिए गए प्रकारों को कैसे मैप करना है "
  • एक वर्ग पदानुक्रम का निर्माण एक सार AuditResultTableBase वर्ग और उससे प्राप्त होने वाले दो वर्गों में से एक - जो" भारी "कॉलम और उनके बिना एक जोड़ता है, दोनों अपने संबंधित डिफ़ॉल्ट प्रक्षेपण के साथ और केस कक्षाएं। यह अच्छी तरह से काम करता है, लेकिन दृष्टिकोण गलत लगता है और इस तरह की एक आसान चीज़ के लिए अपेक्षाकृत बड़े कोड परिवर्तन की आवश्यकता है।
  • केस कक्षाओं के बजाए ट्यूपल्स को मूर्तिकला बनाना - यह निश्चित रूप से काम करेगा, लेकिन मैं चाहता हूं कि मेरी डेटा एक्सेस परत दृढ़ता से टाइप की जाए।

इस समस्या के लिए Slick 3.1 के लिए बेवकूफ/सर्वोत्तम अभ्यास क्या है? क्या मैं इसके लिए एक कस्टम प्रक्षेपण का उपयोग कर सकता हूं और यदि ऐसा है तो SystemAOutput और SystemBOutput के साथ इस विशेष उदाहरण/क्वेरी के लिए यह कैसा दिखता है, जो भारी स्तंभ हैं जिन्हें मैं छोड़ना चाहता हूं?

उत्तर

5

मुझे एक ही समस्या थी! आपको आकार को परिभाषित करना होगा! documentation की सहायता से मैंने "लाइट" केस क्लास वर्क के साथ दृष्टिकोण बनाने में कामयाब रहे।

पहले, सरल वर्ग को परिभाषित: आकार

case class AuditResultLightLifted(
    ProcessorId: Rep[Long], 
    DispatchedTimestamp: Rep[Timestamp], 
    IsSuccessful: Rep[Boolean], 
    AuditResultId: Rep[Long] 
) 

इसके अलावा, आप एक अंतर्निहित वस्तु की जरूरत है (: फिर

case class AuditResultLight(
    ProcessorId: Long, 
    DispatchedTimestamp: Timestamp, 
    IsSuccessful: Boolean, 
    AuditResultId: Long = 0L 
) 

, तो आप मामले वर्ग का एक उठा लिया संस्करण बनाने की जरूरत) एक दूसरे को मैप करने का तरीका बताएं:

implicit object AuditResultLightShape 
    extends CaseClassShape(AuditResultLightLifted.tupled, AuditResultLight.tupled) 

अब, आप एक प्रश्न है कि AuditResultLight रिटर्न परिभाषित कर सकते हैं (नहीं वास्तव में एक प्रक्षेपण है, लेकिन जहाँ तक मैं समझता हूँ कि यह इसी तरह काम करता है):

val auditResultsLight = auditResults.map(r => AuditResultLightLifted(r.ProcessorId, r.DispatchedTimestamp, r.IsSuccessful, r.AuditResultId)) 

उसके बाद, आप फ़ंक्शन है कि एक प्रकाश के रूप में आडिट में विफल रहा है परिभाषित कर सकते हैं :

def getRecentFailedAuditsQuery(): Query[AuditResultTable, AuditResultLight, Seq] = { 
    auditResultsLight.filterNot(r => r.isSuccessful) 
} 

कोड के साथ एक सार: https://gist.github.com/wjur/93712a51d392d181ab7fc2408e4ce48b

कोड संकलित करता है तथा कार्यान्वित, लेकिन मेरे मामले में, मुद्दा यह है कि मेरी आईडीई (इंटेलीजे) की रिपोर्ट auditResultsLight के लिए Query[Nothing, Nothing, scala.Seq] प्रकार है। जब भी मैं auditResultsLight का उपयोग करता हूं तो मुझे सिंटैक्स त्रुटियां मिलती हैं और एक क्वेरी में AuditResultLight का फ़ील्ड देखें। हालांकि, इसके कारण, अंत में, मैंने आपके द्वारा सुझाए गए दूसरे दृष्टिकोण का उपयोग करने का निर्णय लिया (एक सार सारणी वाला वाला)। लगभग समान मात्रा में कोड, लेकिन आईडीई समर्थन के साथ।

+0

धन्यवाद वोज्शिच - मैंने आशा की थी कि "एक" स्पष्ट रूप से सही उत्तर होगा, लेकिन ऐसा लगता है कि मुझे परेशानी होने वाला अकेला नहीं है। इस उपयोग के मामले के लिए आकार/मैपिंग को सही तरीके से कार्यान्वित करने के तरीके के बारे में अंतर्दृष्टि के लिए धन्यवाद (भले ही इंटेलिजे इसे पसंद न करे) - बक्षीस सब तुम्हारा है। – BrokenGlass

संबंधित मुद्दे