PostgreSQLのLateral Joinで作るeDSL
要点
- 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はコンテキストに応じてフィールド型をU、Expr<U>、Stringに切り替えることで、同じ構造体をDBの行とクエリビルダーのハンドル両方として使えるようにする。
Hacker Newsコメントレビュー
- 現時点では実質的なHN上の議論はなし。
英語版: Postgres’s lateral joins allow for quite the good eDSL · Original source