Skip to content

Commit

Permalink
Changing Indexer.last_updated to be a slice. Also propagate all value…
Browse files Browse the repository at this point in the history
…s of last_updated during subset()
  • Loading branch information
johnsekar committed May 29, 2018
1 parent f2e12aa commit ecd57a2
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 23 deletions.
26 changes: 13 additions & 13 deletions tests/test_indexer.py
Expand Up @@ -128,42 +128,42 @@ def test_indexing(self):
self.assertTrue(1 in I.value_cache and 2 in I.value_cache)
self.assertTrue('a' in I.value_cache[1] and 'b' in I.value_cache[2])
self.assertTrue(len(I)==2 and len(I.value_cache)==2)
self.assertTrue(I.last_updated == set(['a','b']))
self.assertTrue(I.last_updated['a'] and I.last_updated['b'])
I.flush()
self.assertTrue(I.last_updated == set())
self.assertTrue(len(I.last_updated) == 0)

I.update(dict(b=1))
self.assertTrue('a' in I and 'b' in I)
self.assertTrue(1 in I.value_cache and 2 not in I.value_cache)
self.assertTrue('a' in I.value_cache[1] and 'b' in I.value_cache[1])
self.assertTrue(len(I)==2 and len(I.value_cache)==1)
self.assertTrue(I.last_updated == set(['b']))
self.assertTrue(I.last_updated['b'])
I.flush()
self.assertTrue(I.last_updated == set())
self.assertTrue(len(I.last_updated) == 0)

I.update(dict(a=3))
self.assertTrue('a' in I and 'b' in I)
self.assertTrue(1 in I.value_cache and 2 not in I.value_cache and 3 in I.value_cache)
self.assertTrue('a' in I.value_cache[3] and 'b' in I.value_cache[1])
self.assertTrue(len(I)==2 and len(I.value_cache)==2)
self.assertTrue(I.last_updated == set(['a']))
self.assertTrue(I.last_updated['a'])
I.flush()
self.assertTrue(I.last_updated == set())
self.assertTrue(len(I.last_updated) == 0)

I.remove(['a'])
self.assertTrue('a' not in I and 'b' in I)
self.assertTrue(1 in I.value_cache and 2 not in I.value_cache and 3 not in I.value_cache)
self.assertTrue('b' in I.value_cache[1])
self.assertTrue(len(I)==1 and len(I.value_cache)==1)
self.assertTrue(I.last_updated == set(['a']))
self.assertTrue(I.last_updated['a'])
I.flush()
self.assertTrue(I.last_updated == set())
self.assertTrue(len(I.last_updated) == 0)

I.remove(['b'])
self.assertTrue(len(I)==len(I.value_cache)==0)
self.assertTrue(I.last_updated == set(['b']))
self.assertTrue(I.last_updated['b'])
I.flush()
self.assertTrue(I.last_updated == set())
self.assertTrue(len(I.last_updated) == 0)

def test_indexer_types(self):
# Boolean indexer
Expand Down Expand Up @@ -205,18 +205,18 @@ def test_indexer_subset(self):

I1 = I.subset(['a','b'])
self.assertTrue('a' in I1 and 'b' in I1 and 'c' not in I1)
self.assertTrue(sorted(I1.last_updated)==['a','b'])
self.assertTrue(sorted(I1.last_updated.keys())==['a','b','c'])
self.assertTrue(isinstance(I1,NumericIndexer))

S = Slicer().add_keys(['a','b'])
I2 = I.subset(S)
self.assertTrue('a' in I2 and 'b' in I2 and 'c' not in I2)
self.assertTrue(sorted(I2.last_updated)==['a','b'])
self.assertTrue(sorted(I2.last_updated.keys())==['a','b','c'])
self.assertTrue(isinstance(I2,NumericIndexer))

I3 = I[S]
self.assertTrue('a' in I3 and 'b' in I3 and 'c' not in I3)
self.assertTrue(sorted(I3.last_updated)==['a','b'])
self.assertTrue(sorted(I3.last_updated.keys())==['a','b','c'])
self.assertTrue(isinstance(I3,NumericIndexer))

def test_indexer_slice(self):
Expand Down
23 changes: 13 additions & 10 deletions wc_rules/indexer.py
Expand Up @@ -123,7 +123,7 @@ class Indexer(dict):

def __init__(self):
self.value_cache = {}
self.last_updated = set()
self.last_updated = Slicer(default=False)

def __getitem__(self,key):
if isinstance(key,Slicer):
Expand All @@ -150,8 +150,11 @@ def add_key_to_value_cache(self,key,value):
self.value_cache[value].add_keys([key])
return self

def update_last_updated(self,key):
self.last_updated.add(key)
def update_last_updated(self,keylist):
if isinstance(keylist,list):
self.last_updated.add_keys(keylist)
else:
self.last_updated.add_keys(list(keylist))
return self

# Methods available externally
Expand All @@ -176,13 +179,11 @@ def subset(self,keylist,propagate=True):
keys = (key for key in self if keylist[key])
for key in keys:
I.update_key_value(key,self[key])
if propagate==True and key in self.last_updated:
I.update_last_updated(key)
if propagate==True:
I.update_last_updated(self.last_updated.keys())
return I

def update_key_value(self,key,value):
if key in self and self[key]==value:
return self
if self.value_is_compatible(value):
if key in self: self.delete_key_from_value_cache(key)
dict.__setitem__(self,key,value)
Expand All @@ -197,19 +198,21 @@ def remove_key(self,key):
return self

def update(self,dict_obj):
for key in dict_obj:
keys = (key for key in dict_obj if (key in self and self[key]!=dict_obj[key]) or key not in self)
for key in keys:
self.update_key_value(key, dict_obj[key])
self.update_last_updated(key)
return self

def remove(self,keylist):
for key in keylist:
keys = (key for key in keylist if key in self)
for key in keys:
self.remove_key(key)
self.update_last_updated(key)
return self

def flush(self):
self.last_updated.clear()
self.last_updated = Slicer(default=False)
return self

def __eq__(self,other):
Expand Down

0 comments on commit ecd57a2

Please sign in to comment.