fixed error that caused an infinite loop

git-svn-id: http://galileo.dmi.unict.it/svn/relational/trunk@166 014f5005-505e-4b48-8d0a-63407b615a7c
This commit is contained in:
LtWorf 2009-05-12 13:49:43 +00:00
parent bc60be3ace
commit e5e7dcddd2
2 changed files with 35 additions and 11 deletions

View File

@ -258,8 +258,6 @@ def selection_and_product(n,rels):
changes=0 changes=0
if n.name=='σ' and n.child.name=='*': if n.name=='σ' and n.child.name=='*':
changes=1
l_attr=n.child.left.result_format(rels) l_attr=n.child.left.result_format(rels)
r_attr=n.child.right.result_format(rels) r_attr=n.child.right.result_format(rels)
@ -282,9 +280,6 @@ def selection_and_product(n,rels):
right=[] right=[]
both=[] both=[]
print "Attributi R",r_attr, "Attributi L",l_attr
print "Gruppi",groups
for i in groups: for i in groups:
l_fields=False #has fields in left? l_fields=False #has fields in left?
r_fields=False #has fields in left? r_fields=False #has fields in left?
@ -304,10 +299,9 @@ def selection_and_product(n,rels):
else:#Unknown.. adding in both else:#Unknown.. adding in both
both.append(i) both.append(i)
print "left", left, "right",right,"both",both
#Preparing left selection #Preparing left selection
if len(left)>0: if len(left)>0:
changes=1
l_node=optimizer.node() l_node=optimizer.node()
l_node.name='σ' l_node.name='σ'
l_node.kind=optimizer.UNARY l_node.kind=optimizer.UNARY
@ -323,6 +317,7 @@ def selection_and_product(n,rels):
#Preparing right selection #Preparing right selection
if len(right)>0: if len(right)>0:
changes=1
r_node=optimizer.node() r_node=optimizer.node()
r_node.name='σ' r_node.name='σ'
r_node.prop='' r_node.prop=''

View File

@ -220,6 +220,33 @@ def tree(expression):
the root node using the Node class defined in this module.''' the root node using the Node class defined in this module.'''
return node(tokenize(expression)) return node(tokenize(expression))
def optimize_all(expression,rels):
'''This function performs all the available optimizations'''
n=tree(expression) #Gets the tree
total=1
while total!=0:
total=0
for i in optimizations.specific_optimizations:
total+=i(n,rels) #Performs the optimization
print n
for i in optimizations.general_optimizations:
total+=i(n) #Performs the optimization
print n
return n.__str__()
def specific_optimize(expression,rels):
'''This function performs specific optimizations. Means that it will need to
know the fields used by the relations'''
n=tree(expression) #Gets the tree
total=1
while total!=0:
total=0
for i in optimizations.specific_optimizations:
total+=i(n,rels) #Performs the optimization
return n.__str__()
def general_optimize(expression): def general_optimize(expression):
'''This function performs general optimizations. Means that it will not need to '''This function performs general optimizations. Means that it will not need to
know the fields used by the relations''' know the fields used by the relations'''
@ -251,11 +278,13 @@ if __name__=="__main__":
rels["S1"]= relation.relation("/home/salvo/dev/relational/trunk/samples/skillo.csv") rels["S1"]= relation.relation("/home/salvo/dev/relational/trunk/samples/skillo.csv")
print rels print rels
#n=tree("π indice,qq,name (ρ age➡qq,id➡indice (P1-P2))") #n=tree("π indice,qq,name (ρ age➡qq,id➡indice (P1-P2))")
n=tree("σ id==3 and id==indice and indice==2 and name==5 or name<2(P1 * S1)") #n=tree("σ id==3 and indice==2 and name==5 or name<2(P1 * S1)")
print optimizations.selection_and_product(n,rels) #print optimizations.selection_and_product(n,rels)
print n print specific_optimize("σ id==3 and indice==2 and name==5 or name<2(P1 * S1)",rels)
print n.result_format(rels)
#print n
#print n.result_format(rels)
#a=general_optimize("σ age==3 and qq<=2 or nome!='ciccio d\\'urso'(ρ ciccio➡age,nome➡nom(R-Q))") #a=general_optimize("σ age==3 and qq<=2 or nome!='ciccio d\\'urso'(ρ ciccio➡age,nome➡nom(R-Q))")
#a=general_optimize("σ i==2 (σ b>5 (d))") #a=general_optimize("σ i==2 (σ b>5 (d))")