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