summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2017-06-11 20:23:16 +0300
committerLars Wirzenius <liw@liw.fi>2017-06-11 20:23:16 +0300
commit3975b223309c0f6a9f104e7e9efea87a93e9dcb9 (patch)
tree4f0cede768deb23376295186551a457ef834ade6
parente8343e237347ce3fbdf739deb6ac1844d9eba944 (diff)
downloadobnam-3975b223309c0f6a9f104e7e9efea87a93e9dcb9.tar.gz
Add: removal of keys from a CowTree
-rw-r--r--obnamlib/fmt_ga/cowtree.py19
-rw-r--r--obnamlib/fmt_ga/cowtree_tests.py21
2 files changed, 36 insertions, 4 deletions
diff --git a/obnamlib/fmt_ga/cowtree.py b/obnamlib/fmt_ga/cowtree.py
index 69b00a9e..c4793a67 100644
--- a/obnamlib/fmt_ga/cowtree.py
+++ b/obnamlib/fmt_ga/cowtree.py
@@ -85,11 +85,22 @@ class CowTree(object):
new_id = self._store.put_leaf(new)
self._leaf_list.insert_leaf(sorted_keys[0], sorted_keys[-1], new_id)
- def keys(self):
- for leaf_id in self._leaf_list.leaf_ids():
+ def remove(self, key):
+ leaf_id = self._leaf_list.find_leaf_for_key(key)
+ if leaf_id is not None:
+ self._leaf_list.drop_leaf(leaf_id)
leaf = self._store.get_leaf(leaf_id)
- for key in leaf.keys():
- yield key
+ leaf.remove(key)
+ if len(leaf) > 0:
+ self._make_split_leaf(leaf, list(sorted(leaf.keys())))
+
+ def keys(self):
+ leaf_ids = self._leaf_list.leaf_ids()
+ if leaf_ids:
+ for leaf_id in leaf_ids:
+ leaf = self._store.get_leaf(leaf_id)
+ for key in leaf.keys():
+ yield key
def commit(self):
fake_leaf = obnamlib.CowLeaf()
diff --git a/obnamlib/fmt_ga/cowtree_tests.py b/obnamlib/fmt_ga/cowtree_tests.py
index c53a9ab7..2bcc4075 100644
--- a/obnamlib/fmt_ga/cowtree_tests.py
+++ b/obnamlib/fmt_ga/cowtree_tests.py
@@ -28,6 +28,9 @@ class CowTreeTests(unittest.TestCase):
self.cow = obnamlib.CowTree()
self.cow.set_leaf_store(self.ls)
+ def test_has_no_keys_initially(self):
+ self.assertEqual(list(self.cow.keys()), [])
+
def test_lookup_returns_none_if_key_is_missing(self):
self.assertEqual(self.cow.lookup(42), None)
@@ -36,6 +39,24 @@ class CowTreeTests(unittest.TestCase):
value = 'barvalue'
self.cow.insert(key, value)
self.assertEqual(self.cow.lookup(key), value)
+ self.assertEqual(list(self.cow.keys()), [key])
+
+ def test_removes_only_key_in_blob(self):
+ key = 'fookey'
+ value = 'barvalue'
+ self.cow.insert(key, value)
+ self.cow.remove(key)
+ self.assertEqual(list(self.cow.keys()), [])
+
+ def test_removes_one_of_the_keys_in_blob(self):
+ key = 'fookey'
+ value = 'barvalue'
+ key2 = 'fookey2'
+ value2 = 'barvalue2'
+ self.cow.insert(key, value)
+ self.cow.insert(key2, value2)
+ self.cow.remove(key)
+ self.assertEqual(list(self.cow.keys()), [key2])
def test_inserts_many_keys(self):
N = 10