~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/index.py

  • Committer: John Arbash Meinel
  • Date: 2008-08-25 16:24:09 UTC
  • mto: This revision was merged to the branch mainline in revision 3688.
  • Revision ID: john@arbash-meinel.com-20080825162409-0766y19zjs45m87i
Do a bit more work to get all the tests to pass.

Show diffs side-by-side

added added

removed removed

Lines of Context:
95
95
            if not element or _whitespace_re.search(element) is not None:
96
96
                raise errors.BadIndexKey(element)
97
97
 
 
98
    def _update_nodes_by_key(self, key, value, node_refs):
 
99
        """Update the _nodes_by_key dict with a new key.
 
100
 
 
101
        For a key of (foo, bar, baz) create
 
102
        _nodes_by_key[foo][bar][baz] = key_value
 
103
        """
 
104
        if self._nodes_by_key is None:
 
105
            return
 
106
        key_dict = self._nodes_by_key
 
107
        if self.reference_lists:
 
108
            key_value = key, value, node_refs
 
109
        else:
 
110
            key_value = key, value
 
111
        for subkey in key[:-1]:
 
112
            key_dict = key_dict.setdefault(subkey, {})
 
113
        key_dict[key[-1]] = key_value
 
114
 
98
115
    def add_node(self, key, value, references=()):
99
116
        """Add a node to the index.
100
117
 
120
137
            node_refs.append(tuple(reference_list))
121
138
        if key in self._nodes and self._nodes[key][0] == '':
122
139
            raise errors.BadIndexDuplicateKey(key, self)
123
 
        self._nodes[key] = ('', tuple(node_refs), value)
 
140
        node_refs = tuple(node_refs)
 
141
        self._nodes[key] = ('', node_refs, value)
124
142
        self._keys.add(key)
125
143
        if self._key_length > 1 and self._nodes_by_key is not None:
126
 
            key_dict = self._nodes_by_key
127
 
            if self.reference_lists:
128
 
                key_value = key, value, tuple(node_refs)
129
 
            else:
130
 
                key_value = key, value
131
 
            # possibly should do this on-demand, but it seems likely it is 
132
 
            # always wanted
133
 
            # For a key of (foo, bar, baz) create
134
 
            # _nodes_by_key[foo][bar][baz] = key_value
135
 
            for subkey in key[:-1]:
136
 
                key_dict = key_dict.setdefault(subkey, {})
137
 
            key_dict[key[-1]] = key_value
 
144
            self._update_nodes_by_key(key, value, node_refs)
138
145
 
139
146
    def finish(self):
140
147
        lines = [_SIGNATURE]
320
327
                node_value = value
321
328
            self._nodes[key] = node_value
322
329
            if self._key_length > 1:
323
 
                subkey = list(reversed(key[:-1]))
 
330
                # TODO: We may want to do this lazily, but if we are calling
 
331
                #       _buffer_all, we are likely to be doing
 
332
                #       iter_entries_prefix
324
333
                key_dict = self._nodes_by_key
325
334
                if self.node_ref_lists:
326
335
                    key_value = key, node_value[0], node_value[1]
327
336
                else:
328
337
                    key_value = key, node_value
329
 
                # possibly should do this on-demand, but it seems likely it is 
330
 
                # always wanted
331
338
                # For a key of (foo, bar, baz) create
332
339
                # _nodes_by_key[foo][bar][baz] = key_value
333
340
                for subkey in key[:-1]:
1147
1154
    available - for example via a CombinedGraphIndex.
1148
1155
    """
1149
1156
 
 
1157
    def __init__(self, reference_lists=0, key_elements=1):
 
1158
        super(InMemoryGraphIndex, self).__init__(
 
1159
            reference_lists=reference_lists,
 
1160
            key_elements=key_elements)
 
1161
        # The tests using InMemoryGraphIndex expect _nodes_by_key to be filled
 
1162
        # out
 
1163
        self._nodes_by_key = {}
 
1164
 
1150
1165
    def add_nodes(self, nodes):
1151
1166
        """Add nodes to the index.
1152
1167