packages feed

dsh-sql-0.2.0.0: src/Database/DSH/Backend/Sql/Opt/OptimizeTA.hs

module Database.DSH.Backend.Sql.Opt.OptimizeTA where

import qualified Data.IntMap as M

import qualified Database.Algebra.Dag                              as Dag
import           Database.Algebra.Table.Lang

import           Database.DSH.Backend.Sql.Opt.Rewrite.Basic
import           Database.DSH.Backend.Sql.Vector
import           Database.DSH.Common.QueryPlan

import           Database.DSH.Common.Opt

type RewriteClass = Rewrite TableAlgebra (Shape TADVec) Bool

defaultPipeline :: [RewriteClass]
defaultPipeline = [cleanup]

runPipeline :: Dag.AlgebraDag TableAlgebra
            -> (Shape TADVec)
            -> [RewriteClass]
            -> Bool
            -> (Dag.AlgebraDag TableAlgebra, Log, Shape TADVec)
runPipeline d sh pipeline debug = (d', rewriteLog, sh')
  where (d', sh', _, rewriteLog) = runRewrite (sequence_ pipeline) d sh debug

optimizeTA :: QueryPlan TableAlgebra TADVec -> QueryPlan TableAlgebra TADVec
optimizeTA plan =
#ifdef DEBUGGRAPH
  let (d, _rewriteLog, shape) = runPipeline (queryDag plan) (queryShape plan) defaultPipeline True
#else
  let (d, _rewriteLog, shape) = runPipeline (queryDag plan) (queryShape plan) defaultPipeline False
#endif
  in QueryPlan { queryDag = d, queryShape = shape, queryTags = M.empty }