PostgreSQLのLateral Joinで作るeDSL

· databases · Source ↗

要点

  • Lateral joinを使うと、RustやHaskellでパラメータ化されたサブクエリを関数のように再利用できる、型安全なSQLクエリeDSLが構築できる。

ポイント

  • CROSS JOIN LATERALを使うと、サブクエリがFROM句の前の列を参照でき、デカルト積の爆発を招かずに関数的なクエリ合成が可能になる。
  • HaskellのRel8ライブラリはこれをQueryモナドとして表現し、doブロックの各行がCROSS JOIN LATERALを生成するため、joinが純粋なデータ操作のように見える。
  • 著者はRustのポート(rust-rel8)を作成し、コンパイル時に式のスコープを強制するライフタイムパラメータ付きのExpr<'scope, T>を使ってRel8のAPIを再現している。
  • .many()Query<T>Query<ListTable<T>>に集約して(User, Vec<Post>)形式の結果を返し、.optional()MaybeTable<T>として左外部結合のセマンティクスを提供する。
  • Mode::T<'scope, U> ADTはコンテキストに応じてフィールド型をUExpr<U>Stringに切り替えることで、同じ構造体をDBの行とクエリビルダーのハンドル両方として使えるようにする。

Hacker Newsコメントレビュー

  • 現時点では実質的なHN上の議論はなし。

元記事 | HNで議論する


英語版: Postgres’s lateral joins allow for quite the good eDSL · Original source