Revert copy on write optimization

In case of multiple renames, all of the resulting relations will point
to the same data, so writing on one and marking its only known copy
as writable would be incorrect.

For this to work, all the references should be kown to all the other
instances.

It is probably not worth to implement it.

Implemented test for the update
master
Salvo 'LtWorf' Tomaselli 2015-11-18 12:12:42 +07:00
parent 5073567757
commit a8c1b2a463
2 changed files with 16 additions and 5 deletions

@ -54,7 +54,6 @@ class Relation (object):
def __init__(self, filename=""): def __init__(self, filename=""):
self._readonly = False self._readonly = False
self._copy = None
self.content = set() self.content = set()
if len(filename) == 0: # Empty relation if len(filename) == 0: # Empty relation
@ -71,8 +70,6 @@ class Relation (object):
self._readonly = True self._readonly = True
copy._readonly = True copy._readonly = True
copy._copy = self
self._copy = copy
def _make_writable(self, copy_content=True): def _make_writable(self, copy_content=True):
'''If this relation is marked as readonly, this '''If this relation is marked as readonly, this
@ -83,8 +80,6 @@ class Relation (object):
if self._readonly: if self._readonly:
self._readonly = False self._readonly = False
self._copy._readonly = False
self._copy = None
if copy_content: if copy_content:
self.content = set(self.content) self.content = set(self.content)

@ -0,0 +1,16 @@
p1=people
p2=p1.rename({'id':'i'})
p2=p2.rename({'i':'id'})
assert p1==p2
assert p1._readonly
assert p2._readonly
# It is VERY important to not change the original relations
# or other tests might fail randomly, since the relations are
# only loaded once
p2.update('age==20', {'age':50})
assert p2._readonly == False
assert p1!=p2
p3 = p2.selection('age!=50')
p4 = p1.selection('age!=20')
assert p3==p4