packages feed

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

{-# LANGUAGE TemplateHaskell #-}

module Database.DSH.Backend.Sql.Opt.Properties.Empty where

import           Database.Algebra.Table.Lang

import           Database.DSH.Backend.Sql.Opt.Properties.Types

inferEmptyNullOp :: NullOp -> Empty
inferEmptyNullOp op =
    case op of
        LitTable (vs, _)   -> null vs
        TableRef (_, _, _) -> False

inferEmptyUnOp :: Empty -> UnOp -> Empty
inferEmptyUnOp childEmpty op =
    case op of
        WinFun _         -> childEmpty
        RowNum (_, _, _) -> childEmpty
        RowRank (_, _)   -> childEmpty
        Rank (_, _)      -> childEmpty
        Project _        -> childEmpty
        Select _         -> childEmpty
        Distinct _       -> childEmpty
        Aggr (_, _)      -> childEmpty
        Serialize    _   -> childEmpty

inferEmptyBinOp :: Empty -> Empty -> BinOp -> Empty
inferEmptyBinOp leftEmpty rightEmpty op =
    case op of
        Cross _         -> leftEmpty || rightEmpty
        EqJoin _        -> leftEmpty || rightEmpty
        ThetaJoin _     -> leftEmpty || rightEmpty
        LeftOuterJoin _ -> leftEmpty || rightEmpty
        SemiJoin _      -> leftEmpty
        AntiJoin _      -> False
        DisjUnion _     -> False
        Difference _    -> False