Ich habe Datentypen definiert als:
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
So wie es aussieht, habe ich ein beständiges Modell definiert als:
Person
name Text
Committee
name Text
CommitteePerson
personId PersonId
committeeId CommitteeId
Ich kann mit Esqueleto ziemlich einfach eine Abfrage erstellen, um eine CommitteeView zu füllen. Es würde ungefähr so aussehen:
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
Betrachten Sie nun das Problem der Besiedlung CommitteesView
. Im Prinzip erhalten wir genügend Daten zum Auffüllen, indem wir die Unterabfrage in der obigen Abfrage ausführen. Okay, fair genug. Wie kann ich nun "Gruppe nach Haskell-Liste" wie group by
in SQL verwenden? Wie kann ich Zeilen falten, um eine Liste mit Personenlisten zu erhalten?
Ich habe den Eindruck, dass esqueleto
der Fall als solcher nicht behandelt werden kann (dh es gibt keinen Kombinator, der dies tun würde). Und meine zugrunde liegende Datenbank unterstützt offensichtlich keine Haskell-Listen als Spalte. Aber ich kann sicherlich nicht die einzige Person sein, die sich diesem Problem stellt. Was ist eine effektive Strategie? Eine n-Liste von Listen in eine n-Liste falten? Oder n+1
Abfragen ausführen? Gibt es noch andere Möglichkeiten?
Data.List.groupBy
?