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