Esqueletoでリスト型を処理する


144

次のように定義されたデータ型があります。

data ComitteeView = CommitteeView { committeeId :: CommitteeId
                                  , committeeMembers :: [Person] 
                                  }

data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }

さて、現状では、次のように定義された永続モデルがあります。

Person
  name  Text

Committee
  name  Text

CommitteePerson
  personId    PersonId
  committeeId CommitteeId

Esqueletoを使用すると、CommitteetViewにデータを入力するクエリを簡単に作成できます。それはこのようなものになるでしょう:

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 bySQLのように「Group by Haskell-list」をどのように使用できますか?行を折り畳んで、人のリストのリストを作成するにはどうすればよいですか?

esqueletoそのようにケースを処理できないという印象を受けます(つまり、それを行うコンビネーターがありません)。そして、基礎となるデータベースは明らかに列としてのHaskellリストをサポートしていません。しかし、確かに、この問題に直面するのは私だけではありません。効果的な戦略とは何ですか?リストのnリストをnリストに折りたたみますか?またはn+1クエリを実行していますか?他のオプションはありますか?


2
見たData.List.groupBy
cdk

@cdk:ええ、それは私がやってきたことです。でも驚くほど毛深いです。
nomen

回答:


2

Esqueletoは、箱から出してすぐにサブリストのリスト(多次元リスト)を処理するためのものではありません!Data.List.groupBy「cdk」があなたに忠告したのは、リスト自体だけで、あなたが求めていたものはグループ化できないということです。

あなたの場合、私はしつこく古典的なSQLクエリを使用することをお勧めします。n + 1クエリを実行することはできますが、それが実行されるのはまれであり、頻繁に使用できる機能ではない場合のみです。たとえば、キャッシュされたデータを準備します(変数名に基づいて、頻繁に使用されることはなく、試してみる価値があると思います)。頻繁に使用する場合は、疑いなくクラシックSQLの使用を検討してください。

あなたがに行く場合https://github.com/prowdsponsor/esqueletoあなたはそれを見つけます:

すべてのSQL機能を使用できるわけではありませんが、それらのほとんど(特に関数)は簡単に追加できます。

新しい機能をリクエストしてみてください。幸運を!


これに関する情報源へのリンクはありますか?これが正しい答えであることを誰かが確認できた場合、または何らかのドキュメントを提供できた場合、賞金を授与させていただきます。
Tech Savant 2015

@ NotoriousPet0 haskellのWebサイトにアクセスすると、例とユースケースの完全なリストが見つかり、どれも「内部結合」であっても、多次元リストを使用しません。そこで「group by」を検索すると、複数の列をタプルで囲んだり、追加の集計関数で並べ替えたりするために使用できることがわかります。また、開発者はEsqueletoをあらゆるクエリをサポートするためにできるだけ柔軟にしようとするので、ここで追加の拡張を要求できます
カイナックス2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.