added optimization to push down selection when sub-expression has union, intersection or subtraction

git-svn-id: http://galileo.dmi.unict.it/svn/relational/trunk@142 014f5005-505e-4b48-8d0a-63407b615a7c
master
LtWorf 2009-04-30 17:39:07 +07:00
parent b694fdd99d
commit 723c63641d
2 changed files with 47 additions and 3 deletions

@ -43,4 +43,48 @@ def duplicated_select(n):
changes+=duplicated_select(n.left)
return changes
general_optimizations=[duplicated_select]
def down_to_unions_subtractions_intersections(n):
'''This funcion locates things like σ i==2 (c d), where the union
can be a subtraction and an intersection and replaces them with
σ i==2 (c) σ i==2(d).
If the operator is not Union and the right expression is a relation,
the resulting expression will be: σ i==2 (c) - d.
'''
changes=0
_o=('','-','')
if n.name=='σ' and n.child.name in _o:
left=optimizer.node()
left.prop=n.prop
left.name=n.name
left.child=n.child.left
left.kind=optimizer.UNARY
if n.child.name=='' or n.child.right.kind!=optimizer.RELATION:
right=optimizer.node()
right.prop=n.prop
right.name=n.name
right.child=n.child.right
right.kind=optimizer.UNARY
else:
right=n.child.right
n.name=n.child.name
n.left=left
n.right=right
n.child=None
n.prop=None
n.kind=optimizer.BINARY
changes+=1
#recoursive scan
if n.kind==optimizer.UNARY:
changes+=down_to_unions_subtractions_intersections(n.child)
elif n.kind==optimizer.BINARY:
changes+=down_to_unions_subtractions_intersections(n.right)
changes+=down_to_unions_subtractions_intersections(n.left)
return changes
general_optimizations=[duplicated_select,down_to_unions_subtractions_intersections]

@ -34,7 +34,7 @@ class node (object):
'''This class is a node of a relational expression. Leaves are relations and internal nodes are operations.'''
kind=None
def __init__(self,expression):
def __init__(self,expression=None):
if expression==None or len(expression)==0:
return
'''Generates the tree from the tokenized expression'''
@ -179,7 +179,7 @@ if __name__=="__main__":
#a= tokenize("(a - (a b) * π a,b (a-b)) - ρ 123 (a)")
#a= tokenize(u"π a,b (a*b)")
#a=tokenize("(a-b*c)*(b-c)")
a=general_optimize("σ i==2 (c d- b)")
a=general_optimize("σ i==2 (c d - (aᑎb))")
#a=general_optimize("σ i==2 (σ b>5 (d))")
print a
#print node(a)