次のように定義されたデータ型があります。
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
さて、現状では、次のように定義された永続モデルがあります。
Person
name Text
Committee
name Text
CommitteePerson
personId PersonId
committeeId CommitteeId
Esqueleto を使用して、CommitteeView に入力するクエリを簡単に作成できます。次のようになります。
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
。原則として、上記のクエリでサブクエリを実行することにより、入力するのに十分なデータを取得します。わかりました、十分に公平です。group by
SQLのように「Haskell-listによるグループ」を使用するにはどうすればよいですか? 人のリストのリストになるように行を折りたたむにはどうすればよいですか?
esqueleto
そのようなケースを処理できない (つまり、それを行うコンビネータがない)という印象を受けます。そして、私の基盤となるデータベースは明らかに Haskell リストを列としてサポートしていません。しかし、確かに、この問題に直面しているのは私だけではありません。効果的な戦略とは?リストのnリストをnリストに折りたたむ? またはn+1
クエリを実行していますか?他のオプションはありますか?