Optimization for rearrangements

git-svn-id: http://galileo.dmi.unict.it/svn/relational/trunk@145 014f5005-505e-4b48-8d0a-63407b615a7c
master
LtWorf 2009-05-01 13:47:54 +07:00
parent 444d3f9987
commit 52907e67e7
2 changed files with 17 additions and 6 deletions

@ -69,6 +69,14 @@ Notation
allowed. So after extracting the wanted elements, it has to check if
the new tuple was already added to the new relation. And this brings
the complexity to O(|n|²).
But the projection can also be used to "rearrange" fields, which
makes no sense in pure relational algebra, but can be usefull to make
two relations match (in fact it is used internally to make relations
match if they have the same fields in different order). In this case
there is no need to check if the tuple already exists, because it is
assumed that the relation was correct. This gives a complexity of
O(|n|) in the best case.
2. BINARY OPERATORS
@ -123,4 +131,5 @@ Notation
2.9 Join
Same as above.
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

@ -143,7 +143,7 @@ class relation (object):
Will delete duplicate items
If an empty list or no parameters are provided, returns None'''
#Parameters are supplied in a list, instead with multiple parameters
if attributes[0].__class__ == list().__class__:
if isinstance(attributes[0],list):
attributes=attributes[0]
#Avoiding duplicated attributes
@ -153,6 +153,10 @@ class relation (object):
attributes1.append(i)
attributes=attributes1
#If source and dest has the same number of attributes, we are just rearranging
#so we won't need to check for duplicated entries
attributes_same_count=len(attributes)==len(self.header.attributes)
ids=self.header.getAttributesId(attributes)
if len(ids)==0:
@ -169,11 +173,9 @@ class relation (object):
row=[]
for j in ids:
row.append(i[j])
if row not in newt.content:#Avoids duplicated items
newt.content.append(row)
if attributes_same_count or row not in newt.content:
newt.content.append(row)
return newt
def rename(self,params):
'''Operation rename. Takes a dictionary