एस्क्लेटो के साथ सूची-प्रकार को संभालना


144

मेरे पास डेटा प्रकार हैं:

data ComitteeView = CommitteeView { committeeId :: CommitteeId
                                  , committeeMembers :: [Person] 
                                  }

data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }

अब, जैसा कि यह खड़ा है, मेरे पास एक स्थायी मॉडल के रूप में परिभाषित किया गया है:

Person
  name  Text

Committee
  name  Text

CommitteePerson
  personId    PersonId
  committeeId CommitteeId

मैं बहुत आसानी से Esqueleto का उपयोग करके एक समिति दृश्य को पॉप्युलेट करने के लिए एक क्वेरी बना सकता हूं। यह कुछ इस तरह होगा:

getCommitteeView cid = 
  CommitteeView <$> runDB $ 
    select $
      from (person `InnerJoin` pxc `InnerJoin` committee) -> do
        on  (committee ^. CommitteeId ==. pxc ^. CommitteePersonCommitteeId)
        on  (person ^. PersonId       ==. pxc ^. CommitteePersonPersonId)
        where_ (committee ^. CommitteePersonCommitteeId ==. val cid)
        return person

अब, आबादी की समस्या पर विचार करें CommitteesView। सिद्धांत रूप में, हमें उपरोक्त क्वेरी में उपकुंजी चलाकर पॉप्युलेट करने के लिए पर्याप्त डेटा मिलता है। ठीक है, काफी उचित है। अब मैं group bySQL में "Haskell-list" समूह का उपयोग कैसे कर सकता हूं ? मैं पंक्तियों को कैसे मोड़ सकता हूं ताकि मैं लोगों की सूची की सूची के साथ समाप्त हो सकूं?

मुझे लगता है कि esqueletoइस तरह के मामले को संभाल नहीं सकते हैं (यानी, यह एक combinator कि यह करना होगा नहीं है)। और मेरा अंतर्निहित डेटाबेस स्पष्ट रूप से एक स्तंभ के रूप में हास्केल सूचियों का समर्थन नहीं करता है। लेकिन, निश्चित रूप से, मैं इस मुद्दे का सामना करने वाला एकमात्र व्यक्ति नहीं हो सकता। एक प्रभावी रणनीति क्या है? एक n- सूची में n की सूची को तह करना? या चल रहे n+1प्रश्न? क्या कोई अन्य विकल्प भी हैं?


2
क्या आपने देखा Data.List.groupBy?
cdk

@ LCDk: हाँ, यह वही है जो मैं जा रहा हूँ। यह आश्चर्यजनक रूप से बालों वाली हो जाती है, हालांकि।
नोम

जवाबों:


2

Esqueleto है नहीं अभी तक बॉक्स से बाहर उप-सूचियों के हत्थे सूची (बहुआयामी सूची) के लिए होती! Data.List.groupByआपको सलाह दी गई है कि आप केवल खुद को सूचीबद्ध कर सकते हैं, लेकिन वह नहीं जो आप पूछ रहे थे।

आपके मामले के लिए मैं आपसे एक क्लासिक एसक्यूएल प्रश्नों का उपयोग करने की सलाह दूंगा। आप n + 1 क्वेरी चला सकते हैं, लेकिन ऐसा तभी करें जब यह दुर्लभ हो और अक्सर उपयोग करने योग्य कार्य न हो, उदाहरण के लिए कैश्ड डेटा तैयार करता है (आपके चर नामों के आधार पर मुझे लगता है कि यह भारी उपयोग नहीं हो सकता है और यह एक कोशिश के लायक है)। भारी उपयोग के लिए आपको बिना किसी संदेह के क्लासिक एसक्यूएल का उपयोग करने पर विचार करना चाहिए।

यदि आप https://github.com/prowdsponsor/esqueleto पर जाएंगे, तो आप पाएंगे कि:

सभी SQL सुविधाएँ उपलब्ध नहीं हैं, लेकिन उनमें से अधिकांश को आसानी से जोड़ा जा सकता है (विशेषकर फ़ंक्शंस)।

तो आप एक नई सुविधा के लिए पूछने की कोशिश कर सकते हैं। सौभाग्य!


क्या आपके पास इस पर एक स्रोत का लिंक है? मुझे इनाम देने में खुशी होगी अगर कोई यह सत्यापित कर सकता है कि यह सही उत्तर है या आप किसी प्रकार के दस्तावेज प्रदान कर सकते हैं।
टेक सावंत

@ NotrorPet0 यदि आप haskell वेबसाइट पर जाते हैं, तो आपको उदाहरणों और उपयोग के मामलों की पूरी सूची मिलेगी और उनमें से कोई भी बहुआयामी सूची, यहां तक ​​कि "इनर जॉइन" का उपयोग नहीं करता है। यदि आप वहां "समूह" के लिए खोज करते हैं, तो आप पाएंगे कि इसका उपयोग एक स्तंभ में कई स्तंभों को घेरने या अतिरिक्त एग्रीगेट फ़ंक्शन द्वारा सॉर्ट करने के लिए किया जा सकता है। यह भी कहते हैं कि डेवलपर्स किसी भी प्रश्न का समर्थन करने के लिए एस्क्लेटो को अधिक लचीला बनाने की कोशिश करते हैं, इसलिए आप यहां अतिरिक्त विस्तार के लिए पूछ सकते हैं ।
केनेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.