Tôi có các kiểu dữ liệu được định nghĩa là:
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
Bây giờ, khi nó đứng, tôi có một mô hình liên tục được định nghĩa là:
Person
name Text
Committee
name Text
CommitteePerson
personId PersonId
committeeId CommitteeId
Tôi có thể dễ dàng tạo một truy vấn để điền vào một BoardView, sử dụng Esqueleto. Nó sẽ đi một cái gì đó như thế này:
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
Bây giờ, hãy xem xét vấn đề dân cư CommitteesView
. Về nguyên tắc, chúng tôi có đủ dữ liệu để cư trú bằng cách chạy truy vấn con trong truy vấn trên. Được rồi, đủ công bằng. Bây giờ làm thế nào tôi có thể sử dụng "nhóm theo Haskell-list" như group by
trong SQL? Làm thế nào tôi có thể gấp các hàng để tôi có thể kết thúc với một danh sách các danh sách người?
Tôi có ấn tượng rằng esqueleto
không thể xử lý trường hợp như vậy (nghĩa là, nó không có một tổ hợp sẽ làm điều đó). Và cơ sở dữ liệu cơ bản của tôi rõ ràng không hỗ trợ danh sách Haskell dưới dạng cột. Nhưng, chắc chắn, tôi không thể là người duy nhất phải đối mặt với vấn đề này. Một chiến lược hiệu quả là gì? Gấp một danh sách n của danh sách vào danh sách n? Hoặc chạy n+1
truy vấn? Có sự lựa chọn nào khác không?
Data.List.groupBy
chưa