У меня есть типы данных, определенные как:
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
Теперь, поскольку это так, у меня есть Persistent model, определяемая как:
Person
name Text
Committee
name Text
CommitteePerson
personId PersonId
committeeId CommitteeId
Я могу довольно легко создать запрос для заполнения КомитетаView, используя 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
. В принципе, мы получаем достаточно данных для заполнения, выполнив подзапрос в указанном выше запросе. Хорошо, справедливо. Теперь, как я могу использовать "группу по Haskell-списку", например group by
в SQL? Как я могу свернуть строки, чтобы я мог составить список списков людей?
У меня создается впечатление, что esqueleto
не может обрабатывать этот случай как таковой (т.е. он не имеет комбинатора, который бы это сделал). И моя базовая база данных, очевидно, не поддерживает списки Haskell в качестве столбца. Но, конечно, я не могу быть единственным человеком, который столкнулся бы с этой проблемой. Какова эффективная стратегия? Складывание n-списка списков в n-список? Или запустить n+1
запросы? Есть ли другие варианты?