packages feed

algebra-sql-0.3.0.0: src/Database/Algebra/SQL/Render/Tile.hs

module Database.Algebra.SQL.Render.Tile
    ( renderTransformResult
    ) where


import Prelude hiding               ( (<$>) )
import Text.PrettyPrint.ANSI.Leijen ( (<$>)
                                    , (<+>)
                                    , (<>)
                                    , Doc
                                    , align
                                    , black
                                    , bold
                                    , empty
                                    , indent
                                    , int
                                    , linebreak
                                    , ondullblue
                                    , onwhite
                                    , punctuate
                                    , text
                                    , vcat
                                    , vsep
                                    )
import qualified Data.DList as DL
    ( toList
    )

import qualified Database.Algebra.SQL.Render.Query as RQ
import qualified Database.Algebra.SQL.Query as Q
import Database.Algebra.SQL.Tile
import Database.Algebra.SQL.Compatibility

intRef :: InternalReference -> Doc
intRef = ondullblue . int

extRef :: ExternalReference -> Doc
extRef = onwhite . black . bold . int

type_ :: String -> Doc
type_ = bold . text

renderTileTreeNode :: CompatMode -> Q.SelectStmt ->  [(Int, TileTree)] -> Doc
renderTileTreeNode compat body children =
    type_ "tile"
    <$> RQ.renderSelectStmt compat body
    <> if null children
       then empty
       else linebreak <> bold (text "children") <+> align (vsep rC)
  where rC         = map f children
        f (vId, t) = intRef vId <+> align (renderTileTree compat t)


renderTileTree :: CompatMode -> TileTree -> Doc
renderTileTree _ (ReferenceLeaf n _)                = type_ "references"
                                                    <+> extRef n
renderTileTree compat (TileNode features body children) =
    type_ ( show features
          )
    <+> renderTileTreeNode compat body children

renderTransformResult :: CompatMode -> ([TileTree], DependencyList) -> Doc
renderTransformResult compat (ts, dl) =
    type_ "queries"
    <$> indent 4 (vcat (punctuate linebreak (map (renderTileTree compat) ts)))
    <> if null depList
       then empty
       else ( linebreak
              <> type_ "dependencies"
              <$> indent 4 deps
            )
  where deps        = vsep $ map f depList
        f (r, tree) = extRef r
                      <+> bold (text "as")
                      <+> align (renderTileTree compat tree)
        depList     = DL.toList dl