У мене типи даних визначені як:
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
складається враження, що він не може вирішити справу як таку (тобто у неї немає комбінатора, який би це зробив). І моя база даних очевидно не підтримує списки Haskell як стовпчик. Але, безумовно, я не можу бути єдиною людиною, яка зіткнулася з цим питанням. Що таке ефективна стратегія? Складання n-списків списків у n-список? Або запущені n+1
запити? Чи є інші варіанти?
Data.List.groupBy
?