packages feed

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

-- | Provides file tools used for outputting and converting JSON plan
-- files.
module Database.Algebra.SQL.File where

import           Control.Monad.Error.Class
import           Data.Aeson
import qualified Data.ByteString.Lazy.Char8        as BL

import           System.FilePath
import           System.Process

import qualified Database.Algebra.Dag              as D
import           Database.Algebra.Table.Render.Dot

import qualified Database.Algebra.SQL.Tile         as T

readDagFromFile :: FilePath -> IO (Either String T.TADag)
readDagFromFile filename = case takeExtension filename of
    ".plan" -> do
        -- FIXME This function is a mess, does an unchecked fromJust, which
        -- easily fails.
        Just dag <- decode <$> BL.readFile filename

        return $ return dag

    format ->
        return $ throwError $ "unkown file format '" ++ format ++ "'"

outputDot :: FilePath -> T.TADag -> IO ()
outputDot filename dag = do
    writeFile filename result
    putStrLn $ "Writing dot file to '" ++ filename ++ "'"
  where result = renderTADot (D.rootNodes dag) (D.nodeMap dag)

renderDot :: FilePath -> FilePath -> IO ()
renderDot dotPath pdfPath = do
    putStrLn $ "Rendering dot file to '" ++ pdfPath ++ "'"
    _ <- rawSystem "dot" ["-Tpdf", "-o", pdfPath, dotPath]
    return ()