ฉันมีชนิดข้อมูลที่กำหนดเป็น:
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
ตอนนี้มันมีอยู่ฉันมีรูปแบบถาวรที่กำหนดเป็น:
Person
name Text
Committee
name Text
CommitteePerson
personId PersonId
committeeId CommitteeId
ฉันสามารถสร้างแบบสอบถามได้อย่างง่ายดายเพื่อเติม CommitteeView โดยใช้ 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 by Haskell-list" เหมือนgroup by
ใน SQL ได้อย่างไร ฉันจะพับแถวเพื่อที่จะสามารถจบลงด้วยรายชื่อคนได้อย่างไร
ฉันได้รับความประทับใจที่esqueleto
ไม่สามารถจัดการกับกรณีดังกล่าวได้ (เช่นไม่มี combinator ที่จะทำ) และฐานข้อมูลพื้นฐานของฉันไม่สนับสนุนรายการ Haskell เป็นคอลัมน์ แต่แน่นอนฉันไม่สามารถเป็นคนเดียวที่จะเผชิญกับปัญหานี้ กลยุทธ์ที่มีประสิทธิภาพคืออะไร? การพับ n-list ของรายการลงใน n-list หรือไม่ หรือเรียกใช้n+1
แบบสอบถาม มีตัวเลือกอื่น ๆ อีกไหม?
Data.List.groupBy
?