J'ai des types de données définis comme:
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
Maintenant, dans l'état actuel des choses, j'ai un modèle persistant défini comme:
Person
name Text
Committee
name Text
CommitteePerson
personId PersonId
committeeId CommitteeId
Je peux assez facilement créer une requête pour remplir un CommitteeView, en utilisant Esqueleto. Cela donnerait quelque chose comme ceci:
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
Maintenant, considérons le problème du peuplement CommitteesView
. En principe, nous obtenons suffisamment de données à remplir en exécutant une sous-requête dans la requête ci-dessus. D'accord, très bien. Maintenant, comment puis-je utiliser "group by Haskell-list" comme group by
dans SQL? Comment puis-je plier des lignes pour obtenir une liste de listes de personnes?
J'ai l'impression que je esqueleto
ne peux pas gérer le cas en tant que tel (c'est-à-dire qu'il n'a pas de combinateur qui le ferait). Et ma base de données sous-jacente ne prend évidemment pas en charge les listes Haskell en tant que colonne. Mais, sûrement, je ne peux pas être la seule personne à faire face à ce problème. Qu'est-ce qu'une stratégie efficace? Plier une n-liste de listes en une n-liste? Ou exécuter des n+1
requêtes? Il y a-t-il des alternatives?
Data.List.groupBy
?