{-# language MonoLocalBinds #-}

module Rel8.Statement.Where
  ( ppWhere
  )
where

-- base
import Prelude

-- opaleye
import qualified Opaleye.Internal.HaskellDB.Sql.Print as Opaleye
import qualified Opaleye.Internal.Sql as Opaleye

-- pretty
import Text.PrettyPrint ( Doc, (<+>), text )

-- rel8
import Rel8.Expr ( Expr )
import Rel8.Expr.Opaleye ( toPrimExpr )
import Rel8.Schema.Name ( Selects )
import Rel8.Schema.Table ( TableSchema )
import Rel8.Table.Opaleye ( attributes )


ppWhere :: Selects names exprs
  => TableSchema names -> (exprs -> Expr Bool) -> Doc
ppWhere :: TableSchema names -> (exprs -> Expr Bool) -> Doc
ppWhere TableSchema names
schema exprs -> Expr Bool
where_ = String -> Doc
text String
"WHERE" Doc -> Doc -> Doc
<+> Expr Bool -> Doc
forall a. Expr a -> Doc
ppExpr Expr Bool
condition
  where
    ppExpr :: Expr a -> Doc
ppExpr = SqlExpr -> Doc
Opaleye.ppSqlExpr (SqlExpr -> Doc) -> (Expr a -> SqlExpr) -> Expr a -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimExpr -> SqlExpr
Opaleye.sqlExpr (PrimExpr -> SqlExpr) -> (Expr a -> PrimExpr) -> Expr a -> SqlExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr
    condition :: Expr Bool
condition = exprs -> Expr Bool
where_ (TableSchema names -> exprs
forall names exprs.
Selects names exprs =>
TableSchema names -> exprs
attributes TableSchema names
schema)