Mam typy danych zdefiniowane jako:
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
Teraz, w obecnej formie, mam model Trwały zdefiniowany jako:
Person
name Text
Committee
name Text
CommitteePerson
personId PersonId
committeeId CommitteeId
Mogę łatwo utworzyć zapytanie w celu wypełnienia CommitteeView, używając Esqueleto. To wyglądałoby mniej więcej tak:
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
Rozważmy teraz problem zaludnienia CommitteesView
. Zasadniczo uzyskujemy wystarczającą ilość danych do wypełnienia, uruchamiając podzapytanie w powyższym zapytaniu. Dobra, w porządku. Jak mogę teraz używać „group by Haskell-list”, tak jak group by
w SQL? Jak mogę złożyć wiersze, aby otrzymać listę osób?
Mam wrażenie, że esqueleto
nie poradzi sobie ze sprawą jako taką (tj. Nie ma kombinatora, który by to zrobił). A moja bazowa baza danych oczywiście nie obsługuje list Haskella jako kolumny. Ale z pewnością nie mogę być jedyną osobą, która ma do czynienia z tym problemem. Co to jest skuteczna strategia? Złożyć n-listę list do n-listy? Albo uruchamiasz n+1
zapytania? Czy są jakieś inne opcje?
Data.List.groupBy
?