Ho tipi di dati definiti come:
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
Ora, così com'è, ho un modello persistente definito come:
Person
name Text
Committee
name Text
CommitteePerson
personId PersonId
committeeId CommitteeId
Posso facilmente creare una query per popolare un Committee View, usando Esqueleto. Andrebbe qualcosa del genere:
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
Ora, considera il problema di popolare CommitteesView
. In linea di principio, otteniamo dati sufficienti per popolare eseguendo la query secondaria nella query sopra. Va bene, abbastanza giusto. Ora come posso usare "raggruppa per elenco Haskell" come group by
in SQL? Come posso piegare le righe in modo da poter finire con un elenco di elenchi di persone?
Ho l'impressione che esqueleto
non possa gestire il caso in quanto tale (cioè, non ha un combinatore che lo farebbe). E il mio database sottostante ovviamente non supporta gli elenchi Haskell come una colonna. Ma, sicuramente, non posso essere l'unica persona ad affrontare questo problema. Che cos'è una strategia efficace? Piegare una n-list di liste in una n-list? O eseguendo n+1
query? Ci sono altre opzioni?
Data.List.groupBy
?