{-# language OverloadedStrings #-}

module Rel8.Statement.Using
  ( ppFrom
  , ppUsing
  )
where

-- base
import Prelude

-- opaleye
import qualified Opaleye.Internal.Tag as Opaleye

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

-- rel8
import Rel8.Query ( Query )
import Rel8.Schema.Table ( TableSchema(..), ppTable )
import Rel8.Statement.Select ( Optimized(..), ppPrimSelect )

-- transformers
import Control.Monad.Trans.State.Strict (State)


ppFrom :: Query a -> State Opaleye.Tag (Maybe (Doc, a))
ppFrom :: forall a. Query a -> State Tag (Maybe (Doc, a))
ppFrom = String -> Query a -> State Tag (Maybe (Doc, a))
forall a. String -> Query a -> State Tag (Maybe (Doc, a))
ppJoin String
"FROM"


ppUsing :: Query a -> State Opaleye.Tag (Maybe (Doc, a))
ppUsing :: forall a. Query a -> State Tag (Maybe (Doc, a))
ppUsing = String -> Query a -> State Tag (Maybe (Doc, a))
forall a. String -> Query a -> State Tag (Maybe (Doc, a))
ppJoin String
"USING"


ppJoin :: String -> Query a -> State Opaleye.Tag (Maybe (Doc, a))
ppJoin :: forall a. String -> Query a -> State Tag (Maybe (Doc, a))
ppJoin String
clause Query a
join = do
  (Optimized Doc
ofrom, a
a) <- Query a -> State Tag (Optimized Doc, a)
forall a. Query a -> State Tag (Optimized Doc, a)
ppPrimSelect Query a
join
  Maybe (Doc, a) -> State Tag (Maybe (Doc, a))
forall a. a -> StateT Tag Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe (Doc, a) -> State Tag (Maybe (Doc, a)))
-> Maybe (Doc, a) -> State Tag (Maybe (Doc, a))
forall a b. (a -> b) -> a -> b
$ do
    Doc
doc <- case Optimized Doc
ofrom of
      Optimized Doc
Empty -> Maybe Doc
forall a. Maybe a
Nothing
      Optimized Doc
Unit -> Doc -> Maybe Doc
forall a. a -> Maybe a
Just Doc
forall a. Monoid a => a
mempty
      Optimized Doc
doc -> Doc -> Maybe Doc
forall a. a -> Maybe a
Just (Doc -> Maybe Doc) -> Doc -> Maybe Doc
forall a b. (a -> b) -> a -> b
$ String -> Doc
text String
clause Doc -> Doc -> Doc
<+> Doc -> Doc
parens Doc
doc Doc -> Doc -> Doc
<+> TableSchema () -> Doc
forall a. TableSchema a -> Doc
ppTable TableSchema ()
alias
    (Doc, a) -> Maybe (Doc, a)
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Doc
doc, a
a)
  where
    alias :: TableSchema ()
alias = TableSchema {$sel:name:TableSchema :: QualifiedName
name = QualifiedName
"T1", $sel:columns:TableSchema :: ()
columns = ()}