- Fixed optimization involving selection and parenthesis in the expression

- Added more clear documentation in recoursive_scan



git-svn-id: http://galileo.dmi.unict.it/svn/relational/trunk@260 014f5005-505e-4b48-8d0a-63407b615a7c
master
LtWorf 2010-10-11 10:49:55 +07:00
parent 41de96997d
commit 6fdd572faa
2 changed files with 23 additions and 3 deletions

@ -7,6 +7,7 @@
- Rename will mark the resulting relation as readonly and subsequent updates, insert, updates or deletes will actually copy the content
- Added testsuite
- Fixed python expression tokenization, now uses native tokenizer
- Fixed optimization involving selection and parenthesis in the expression (Rev 260)
0.11
- Font is set only on windows (Rev 206)
@ -18,7 +19,7 @@
- Added .desktop file on svn (Rev 216)
- Automatically fills some fields in the survey (Rev 217)
- When a query fails, shows the message of the exception (Rev220)
- Improved tokenizer for select in optimizations, now can accept operators in identifiers (Rev220)
- Improved tokenizer for select in optimizations, now can accept operators in identifiers (Rev 220)
- Uses getopt to handle the command line in a more standard way
- Organized code so the ui can be either qt or command line
- Does not depend on QT anymore

@ -52,7 +52,17 @@ def replace_node(replace,replacement):
replace.left=replacement.left
def recoursive_scan(function,node,rels=None):
'''Does a recoursive optimization on the tree'''
'''Does a recoursive optimization on the tree.
This function will recoursively execute the function given
as "function" parameter starting from node to all the tree.
if rels is provided it will be passed as argument to the function.
Otherwise the function will be called just on the node.
Result value: function is supposed to return the amount of changes
it has performed on the tree.
The various result will be added up and this final value will be the
returned value.'''
changes=0
#recoursive scan
if node.kind==optimizer.UNARY:
@ -72,11 +82,20 @@ def recoursive_scan(function,node,rels=None):
def duplicated_select(n):
'''This function locates and deletes things like
σ a ( σ a(C)) and the ones like σ a ( σ b(C))'''
σ a ( σ a(C)) and the ones like σ a ( σ b(C))
replacing the 1st one with a single select and
the 2nd one with a single select with both conditions
in and
'''
changes=0
if n.name=='σ' and n.child.name=='σ':
if n.prop != n.child.prop: #Nested but different, joining them
n.prop = n.prop + " and " + n.child.prop
#This adds parenthesis if they are needed
if n.child.prop.startswith('(') or n.prop.startswith('('):
n.prop= '(%s)' % n.prop
n.child=n.child.child
changes=1
changes+=duplicated_select(n)