- Implemented select_union_intersect_subtract general optimization
- Added tests for the new optimization git-svn-id: http://galileo.dmi.unict.it/svn/relational/trunk@268 014f5005-505e-4b48-8d0a-63407b615a7c
This commit is contained in:
parent
7ab6ed8ed7
commit
71697bb2e8
@ -11,6 +11,7 @@
|
||||
- Fixed futile_union_intersection_subtraction optimization that didn't work when selection operator was in the left subtree (Rev 261)
|
||||
- Module parallel does something, can execute queries in parallel
|
||||
- Set hash method for the classes
|
||||
- Implemented select_union_intersect_subtract general optimization
|
||||
|
||||
0.11
|
||||
- Font is set only on windows (Rev 206)
|
||||
|
@ -449,6 +449,27 @@ def swap_rename_select(n):
|
||||
|
||||
return changes+recoursive_scan(swap_rename_select,n)
|
||||
|
||||
def select_union_intersect_subtract(n):
|
||||
'''This function locates things like σ i(a) ᑌ σ q(a)
|
||||
and replaces them with σ (i OR q) (a)
|
||||
Removing a O² operation like the union'''
|
||||
changes=0
|
||||
if n.name in ('ᑌ', 'ᑎ', '-') and n.left.name=='σ' and n.right.name=='σ' and n.left.child==n.right.child:
|
||||
cahnges=1
|
||||
|
||||
d={'ᑌ':'or', 'ᑎ':'and', '-':'and not'}
|
||||
op=d[n.name]
|
||||
|
||||
newnode=parser.node()
|
||||
|
||||
newnode.prop='((%s) %s (%s))' % (n.left.prop,op,n.right.prop)
|
||||
newnode.name='σ'
|
||||
newnode.child=n.left.child
|
||||
newnode.kind=parser.UNARY
|
||||
replace_node(n,newnode)
|
||||
|
||||
return changes+recoursive_scan(select_union_intersect_subtract,n)
|
||||
|
||||
def selection_and_product(n,rels):
|
||||
'''This function locates things like σ k (R*Q) and converts them into
|
||||
σ l (σ j (R) * σ i (Q)). Where j contains only attributes belonging to R,
|
||||
@ -549,7 +570,7 @@ def selection_and_product(n,rels):
|
||||
|
||||
return changes+recoursive_scan(selection_and_product,n,rels)
|
||||
|
||||
general_optimizations=[duplicated_select,down_to_unions_subtractions_intersections,duplicated_projection,selection_inside_projection,subsequent_renames,swap_rename_select,futile_union_intersection_subtraction,swap_union_renames,swap_rename_projection]
|
||||
general_optimizations=[duplicated_select,down_to_unions_subtractions_intersections,duplicated_projection,selection_inside_projection,subsequent_renames,swap_rename_select,futile_union_intersection_subtraction,swap_union_renames,swap_rename_projection,select_union_intersect_subtract]
|
||||
specific_optimizations=[selection_and_product]
|
||||
|
||||
if __name__=="__main__":
|
||||
|
@ -132,7 +132,7 @@ class node (object):
|
||||
|
||||
return '\n'+r
|
||||
def get_left_leaf(self):
|
||||
'''This function returns the most left leaf in the tree. It is needed by some optimizations.'''
|
||||
'''This function returns the leftmost leaf in the tree. It is needed by some optimizations.'''
|
||||
if self.kind==RELATION:
|
||||
return self
|
||||
elif self.kind==UNARY:
|
||||
|
1
test/union_and_select.query
Normal file
1
test/union_and_select.query
Normal file
@ -0,0 +1 @@
|
||||
σ skill=='C'(skills) ᑎ σ id%2==0 (skills)
|
4
test/union_and_select.result
Normal file
4
test/union_and_select.result
Normal file
@ -0,0 +1,4 @@
|
||||
id,skill
|
||||
0,C
|
||||
2,C
|
||||
4,C
|
1
test/union_not_select.query
Normal file
1
test/union_not_select.query
Normal file
@ -0,0 +1 @@
|
||||
σ skill=='C' (skills) - σ id%2==0(skills)
|
3
test/union_not_select.result
Normal file
3
test/union_not_select.result
Normal file
@ -0,0 +1,3 @@
|
||||
id,skill
|
||||
5,C
|
||||
7,C
|
1
test/union_or_select.query
Normal file
1
test/union_or_select.query
Normal file
@ -0,0 +1 @@
|
||||
σ age<21 (people) ᑌ σage >30(people)
|
3
test/union_or_select.result
Normal file
3
test/union_or_select.result
Normal file
@ -0,0 +1,3 @@
|
||||
id,name,chief,age
|
||||
3,dean,1,33
|
||||
1,carl,0,20
|
Loading…
x
Reference in New Issue
Block a user