Rev 4502: Move the _LeafNode object into the extension. in http://bazaar.launchpad.net/~jameinel/bzr/1.17-btree-faster
John Arbash Meinel
john at arbash-meinel.com
Wed Jul 1 21:50:47 BST 2009
At http://bazaar.launchpad.net/~jameinel/bzr/1.17-btree-faster
------------------------------------------------------------
revno: 4502
revision-id: john at arbash-meinel.com-20090701205037-ck7kpf8023fkg1d0
parent: john at arbash-meinel.com-20090701204325-gcgu6ovclsgbbfrj
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 1.17-btree-faster
timestamp: Wed 2009-07-01 15:50:37 -0500
message:
Move the _LeafNode object into the extension.
-------------- next part --------------
=== modified file 'bzrlib/_btree_serializer_py.py'
--- a/bzrlib/_btree_serializer_py.py 2009-07-01 20:43:25 +0000
+++ b/bzrlib/_btree_serializer_py.py 2009-07-01 20:50:37 +0000
@@ -17,6 +17,25 @@
"""B+Tree index parsing."""
+
+class _LeafNode(object):
+ """A leaf node for a serialised B+Tree index."""
+
+ __slots__ = ('keys',)
+
+ def __init__(self, bytes, key_length, ref_list_length):
+ """Parse bytes to create a leaf node object."""
+ # splitlines mangles the \r delimiters.. don't use it.
+ self.keys = dict(_parse_leaf_lines(bytes, key_length, ref_list_length))
+
+ def __len__(self):
+ return len(self.keys)
+
+ def get(self, key):
+ """Get the value, refs or None for a given key."""
+ return self.keys.get(key, None)
+
+
def _parse_leaf_lines(bytes, key_length, ref_list_length):
lines = bytes.split('\n')
nodes = []
=== modified file 'bzrlib/_btree_serializer_pyx.pyx'
--- a/bzrlib/_btree_serializer_pyx.pyx 2009-07-01 20:43:25 +0000
+++ b/bzrlib/_btree_serializer_pyx.pyx 2009-07-01 20:50:37 +0000
@@ -280,6 +280,26 @@
return parser.parse()
+cdef class _LeafNode:
+ """Contains the references to the leaf information."""
+
+ cdef object _keys
+
+ def __init__(self, bytes, key_length, ref_list_length):
+ self._keys = dict(_parse_leaf_lines(bytes, key_length, ref_list_length))
+
+ property keys:
+ def __get__(self):
+ return self._keys
+
+ def __len__(self):
+ return len(self._keys)
+
+ def get(self, key):
+ # PyDict_GetItem...
+ return self._keys.get(key, None)
+
+
def _flatten_node(node, reference_lists):
"""Convert a node into the serialized form.
=== modified file 'bzrlib/btree_index.py'
--- a/bzrlib/btree_index.py 2009-07-01 20:43:25 +0000
+++ b/bzrlib/btree_index.py 2009-07-01 20:50:37 +0000
@@ -588,25 +588,6 @@
"""In memory index's have no known corruption at the moment."""
-class _LeafNode(object):
- """A leaf node for a serialised B+Tree index."""
-
- __slots__ = ('keys',)
-
- def __init__(self, bytes, key_length, ref_list_length):
- """Parse bytes to create a leaf node object."""
- # splitlines mangles the \r delimiters.. don't use it.
- self.keys = dict(_btree_serializer._parse_leaf_lines(bytes,
- key_length, ref_list_length))
-
- def __len__(self):
- return len(self.keys)
-
- def get(self, key):
- """Get the value, refs or None for a given key."""
- return self.keys.get(key, None)
-
-
class _InternalNode(object):
"""An internal node for a serialised B+Tree index."""
@@ -1396,6 +1377,9 @@
pass
+def _LeafNode(*args, **kwargs):
+ return _btree_serializer._LeafNode(*args, **kwargs)
+
try:
from bzrlib import _btree_serializer_pyx as _btree_serializer
except ImportError:
=== modified file 'bzrlib/tests/test_btree_index.py'
--- a/bzrlib/tests/test_btree_index.py 2009-06-22 12:52:39 +0000
+++ b/bzrlib/tests/test_btree_index.py 2009-07-01 20:50:37 +0000
@@ -226,11 +226,11 @@
leaf1_bytes = zlib.decompress(leaf1)
sorted_node_keys = sorted(node[0] for node in nodes)
node = btree_index._LeafNode(leaf1_bytes, 1, 0)
- self.assertEqual(231, len(node.keys))
+ self.assertEqual(231, len(node))
self.assertEqual(sorted_node_keys[:231], sorted(node.keys))
leaf2_bytes = zlib.decompress(leaf2)
node = btree_index._LeafNode(leaf2_bytes, 1, 0)
- self.assertEqual(400 - 231, len(node.keys))
+ self.assertEqual(400 - 231, len(node))
self.assertEqual(sorted_node_keys[231:], sorted(node.keys))
def test_last_page_rounded_1_layer(self):
@@ -251,7 +251,7 @@
leaf2 = content[74:]
leaf2_bytes = zlib.decompress(leaf2)
node = btree_index._LeafNode(leaf2_bytes, 1, 0)
- self.assertEqual(10, len(node.keys))
+ self.assertEqual(10, len(node))
sorted_node_keys = sorted(node[0] for node in nodes)
self.assertEqual(sorted_node_keys, sorted(node.keys))
@@ -273,7 +273,7 @@
leaf2 = content[8192:]
leaf2_bytes = zlib.decompress(leaf2)
node = btree_index._LeafNode(leaf2_bytes, 1, 0)
- self.assertEqual(400 - 231, len(node.keys))
+ self.assertEqual(400 - 231, len(node))
sorted_node_keys = sorted(node[0] for node in nodes)
self.assertEqual(sorted_node_keys[231:], sorted(node.keys))
@@ -312,7 +312,7 @@
# in the second node it points at
pos = index._row_offsets[2] + internal_node2.offset + 1
leaf = index._get_leaf_nodes([pos])[pos]
- self.assertTrue(internal_node2.keys[0] in leaf.keys)
+ self.assertIsNot(None, leaf.get(internal_node2.keys[0]))
def test_2_leaves_2_2(self):
builder = btree_index.BTreeBuilder(key_elements=2, reference_lists=2)
@@ -710,7 +710,7 @@
index = btree_index.BTreeGraphIndex(trans, 'index', None)
del trans._activity[:]
nodes = dict(index._read_nodes([0]))
- self.assertEqual(range(num_pages), nodes.keys())
+ self.assertEqual(range(num_pages), sorted(nodes.keys()))
def test_2_levels_key_count_2_2(self):
builder = btree_index.BTreeBuilder(key_elements=2, reference_lists=2)
More information about the bazaar-commits
mailing list