@@ -3,6 +3,7 @@ import RelationType
3import RelationExpr
3import RelationExpr
4import Relation
4import Relation
5import RelationalError
5import RelationalError
6+import RelationTupleSet
6import Control.Monad.State hiding (join)
7import Control.Monad.State hiding (join)
7import Data.Either (rights, lefts)
8import Data.Either (rights, lefts)
@@ -75,11 +76,16 @@ applyStaticRelationalOptimization (Restrict predicate expr) = do
75 Left err -> return $ Left err
76 Left err -> return $ Left err
76 Right optimizedPredicate -> if optimizedPredicate == TruePredicate then
77 Right optimizedPredicate -> if optimizedPredicate == TruePredicate then
77 applyStaticRelationalOptimization expr
78 applyStaticRelationalOptimization expr
78− else do
79+ else if optimizedPredicate == NotPredicate TruePredicate then do
79− optimizedSubExpression <- applyStaticRelationalOptimization expr
80+ attributesRel <- typeForRelationalExpr expr
80− case optimizedSubExpression of
81+ case attributesRel of
81 Left err -> return $ Left err
82 Left err -> return $ Left err
83+ Right attributesRelA -> return $ Right $ MakeStaticRelation (attributes attributesRelA) emptyTupleSet
85+ optimizedSubExpression <- applyStaticRelationalOptimization expr
86+ case optimizedSubExpression of
87+ Left err -> return $ Left err
82− Right optSubExpr -> return $ Right $ Restrict optimizedPredicate optSubExpr
88+ Right optSubExpr -> return $ Right $ Restrict optimizedPredicate optSubExpr
84applyStaticRelationalOptimization (Equals exprA exprB) = do
90applyStaticRelationalOptimization (Equals exprA exprB) = do
85 return $ Right $ Equals exprA exprB
91 return $ Right $ Equals exprA exprB