on master help sign in
add static optimization for false predicate
807fb07AgentM
RelationStaticOptimizer.hs+10−4
@@ -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)
8
9
@@ -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
84+ else do
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
83
89
84applyStaticRelationalOptimization (Equals exprA exprB) = do
90applyStaticRelationalOptimization (Equals exprA exprB) = do
85 return $ Right $ Equals exprA exprB
91 return $ Right $ Equals exprA exprB
RelationStaticOptimizerTest.hs+3−1
@@ -1,6 +1,7 @@
1import RelationType
1import RelationType
2import Relation
2import Relation
3import RelationExpr
3import RelationExpr
4+import RelationTupleSet
4import RelationStaticOptimizer
5import RelationStaticOptimizer
5import System.Exit
6import System.Exit
6import Control.Monad.State
7import Control.Monad.State
@@ -17,7 +18,8 @@ main = do
17 ("StaticProject", Right $ RelationVariable "S", Project (attributeNames s) (RelationVariable "S")),
18 ("StaticProject", Right $ RelationVariable "S", Project (attributeNames s) (RelationVariable "S")),
18 ("StaticUnion", Right $ RelationVariable "S", Union (RelationVariable "S") (RelationVariable "S")),
19 ("StaticUnion", Right $ RelationVariable "S", Union (RelationVariable "S") (RelationVariable "S")),
19 ("StaticJoin", Right $ RelationVariable "S", Join (RelationVariable "S") (RelationVariable "S")),
20 ("StaticJoin", Right $ RelationVariable "S", Join (RelationVariable "S") (RelationVariable "S")),
20− ("StaticRestrict", Right $ RelationVariable "S", Restrict TruePredicate (RelationVariable "S"))
21+ ("StaticRestrictTrue", Right $ RelationVariable "S", Restrict TruePredicate (RelationVariable "S")),
22+ ("StaticRestrictFalse", Right $ MakeStaticRelation (attributes s) emptyTupleSet, Restrict (NotPredicate TruePredicate) (RelationVariable "S"))
21 ]
23 ]
22 databaseOptTests = optTest applyStaticDatabaseOptimization [
24 databaseOptTests = optTest applyStaticDatabaseOptimization [
23 ("StaticAssign",
25 ("StaticAssign",