Commit 6d2781c8 authored by Julien Muchembled's avatar Julien Muchembled

HBTreeFolder2: get rid off _tree_list and related methods (except getTreeIdList)

getTreeIdList is still required by Folder_reindexAll.
getTreeIdList is not immediate anymore but the reindexing of a folder should
anyway be reimplemented to not depend on this method: only one tree is indexed
at a time, which is unefficient when they're small.
parent a38a8035
...@@ -904,30 +904,6 @@ class Folder(CopyContainer, CMFBTreeFolder, CMFHBTreeFolder, Base, FolderMixIn): ...@@ -904,30 +904,6 @@ class Folder(CopyContainer, CMFBTreeFolder, CMFHBTreeFolder, Base, FolderMixIn):
return False return False
return CMFBTreeFolder.has_key(self, id) return CMFBTreeFolder.has_key(self, id)
def treeIds(self, base_id=None):
""" Return a list of subtree ids
"""
if self._folder_handler == HBTREE_HANDLER:
return CMFHBTreeFolder.treeIds(self, base_id)
else:
return CMFBTreeFolder.treeIds(self, base_id)
def _getTree(self, base_id):
""" Return the tree wich has the base_id
"""
if self._folder_handler == HBTREE_HANDLER:
return CMFHBTreeFolder._getTree(self, base_id)
else:
return CMFBTreeFolder._getTree(self, base_id)
def _getTreeIdList(self, htree=None):
""" recursively build a list of btree ids
"""
if self._folder_handler == HBTREE_HANDLER:
return CMFHBTreeFolder._getTreeIdList(self, htree)
else:
return CMFBTreeFolder._getTreeIdList(self, htree)
def getTreeIdList(self, htree=None): def getTreeIdList(self, htree=None):
""" recursively build a list of btree ids """ recursively build a list of btree ids
""" """
...@@ -936,38 +912,6 @@ class Folder(CopyContainer, CMFBTreeFolder, CMFHBTreeFolder, Base, FolderMixIn): ...@@ -936,38 +912,6 @@ class Folder(CopyContainer, CMFBTreeFolder, CMFHBTreeFolder, Base, FolderMixIn):
else: else:
return CMFBTreeFolder.getTreeIdList(self, htree) return CMFBTreeFolder.getTreeIdList(self, htree)
def _treeObjectValues(self, base_id=None):
""" return object values for a given btree
"""
if self._folder_handler == HBTREE_HANDLER:
return CMFHBTreeFolder._treeObjectValues(self, base_id)
else:
return CMFBTreeFolder._treeObjectValues(self, base_id)
def _treeObjectIds(self, base_id=None):
""" return object ids for a given btree
"""
if self._folder_handler == HBTREE_HANDLER:
return CMFHBTreeFolder._treeObjectIds(self, base_id)
else:
return CMFBTreeFolder._treeObjectIds(self, base_id)
def _isNotBTree(self, obj):
""" test object is not a btree
"""
if self._folder_handler == HBTREE_HANDLER:
return CMFHBTreeFolder._isNotBTree(self, obj)
else:
return CMFBTreeFolder._isNotBTree(self, obj)
def _checkObjectId(self, id):
""" test id is not in btree id list
"""
if self._folder_handler == HBTREE_HANDLER:
return CMFHBTreeFolder._checkObjectId(self, id)
else:
return CMFBTreeFolder._checkObjectId(self, id)
def objectIds(self, spec=None, **kw): def objectIds(self, spec=None, **kw):
if self._folder_handler == HBTREE_HANDLER: if self._folder_handler == HBTREE_HANDLER:
if self._htree is None: if self._htree is None:
......
...@@ -166,7 +166,6 @@ class HBTreeFolder2Base (Persistent): ...@@ -166,7 +166,6 @@ class HBTreeFolder2Base (Persistent):
_count = None # A BTrees.Length _count = None # A BTrees.Length
_v_nextid = 0 # The integer component of the next generated ID _v_nextid = 0 # The integer component of the next generated ID
title = '' title = ''
_tree_list = None
def __init__(self, id=None): def __init__(self, id=None):
...@@ -177,7 +176,6 @@ class HBTreeFolder2Base (Persistent): ...@@ -177,7 +176,6 @@ class HBTreeFolder2Base (Persistent):
def _initBTrees(self): def _initBTrees(self):
self._htree = OOBTree() self._htree = OOBTree()
self._count = Length() self._count = Length()
self._tree_list = PersistentMapping()
def _populateFromFolder(self, source): def _populateFromFolder(self, source):
"""Fill this folder with the contents of another folder. """Fill this folder with the contents of another folder.
...@@ -320,13 +318,9 @@ class HBTreeFolder2Base (Persistent): ...@@ -320,13 +318,9 @@ class HBTreeFolder2Base (Persistent):
tree_id = tree_id + id * MAX_OBJECT_PER_LEVEL tree_id = tree_id + id * MAX_OBJECT_PER_LEVEL
else: else:
tree_id = H_SEPARATOR.join(id_list[:idx+1]) tree_id = H_SEPARATOR.join(id_list[:idx+1])
# Index newly created level
self._tree_list[tree_id] = None
htree = htree[sub_id] htree = htree[sub_id]
if len(id_list) == 1 and not htree.has_key(None):
self._tree_list[None] = None
# set object in subtree # set object in subtree
ob_id = id_list[-1] ob_id = id_list[-1]
if htree.has_key(id): if htree.has_key(id):
...@@ -460,63 +454,35 @@ class HBTreeFolder2Base (Persistent): ...@@ -460,63 +454,35 @@ class HBTreeFolder2Base (Persistent):
except StopIteration: except StopIteration:
pass pass
security.declareProtected(access_contents_information,
'treeIds')
def treeIds(self, base_id=None):
""" Return a list of subtree ids
"""
tree = self._getTree(base_id=base_id)
return [k for k, v in self._htree.items() if isinstance(v, OOBTree)]
def _getTree(self, base_id):
""" Return the tree wich has the base_id
"""
htree = self._htree
id_list = self.hashId(base_id)
for sub_id in id_list:
if not isinstance(htree, OOBTree):
return None
if not htree.has_key(sub_id):
raise IndexError, base_id
htree = htree[sub_id]
return htree
def _getTreeIdList(self, htree=None):
""" recursively build a list of btree ids
"""
if htree is None:
htree = self._htree
btree_list = []
else:
btree_list = []
for obj_id in htree.keys():
obj = htree[obj_id]
if isinstance(obj, OOBTree):
btree_list.extend(["%s-%s"%(obj_id, x) for x in self._getTreeIdList(htree=obj)])
btree_list.append(obj_id)
return btree_list
security.declareProtected(access_contents_information, security.declareProtected(access_contents_information,
'getTreeIdList') 'getTreeIdList')
def getTreeIdList(self, htree=None): def getTreeIdList(self, htree=None):
""" Return list of all tree ids """ Return list of all tree ids
""" """
if self._tree_list is None or len(self._tree_list.keys()) == 0: r = []
tree_list = self._getTreeIdList(htree=htree) s = [(None, self._htree.iteritems())]
self._tree_list = PersistentMapping() while s:
for tree in tree_list: base_id, items = s.pop()
self._tree_list[tree] = None if base_id:
return sorted(self._tree_list.keys()) for k, v in items:
if type(v) is not OOBTree:
def _checkObjectId(self, ids): r.append(base_id)
""" test id is not in btree id list # As an optimization, and because _htree_iteritems does not
""" # support mixed buckets except at the root, we consider that
base_id, obj_id = ids # this one only contains leafs.
if base_id is not None: break
obj_id = "%s%s%s" %(base_id, H_SEPARATOR, obj_id) s.append((base_id + H_SEPARATOR + k, v.iteritems()))
return not self._tree_list.has_key(obj_id) else:
for k, v in items:
if type(v) is not OOBTree:
r.append(base_id)
for k, v in items:
if type(v) is OOBTree:
s.append((k, v.iteritems()))
break
s.append((k, v.iteritems()))
r.sort()
return r
security.declareProtected(access_contents_information, security.declareProtected(access_contents_information,
'objectValues') 'objectValues')
......
...@@ -50,9 +50,12 @@ class HBTreeFolder2Tests(ERP5TypeTestCase): ...@@ -50,9 +50,12 @@ class HBTreeFolder2Tests(ERP5TypeTestCase):
self.assertRaises(KeyError, f._getOb, id) self.assertRaises(KeyError, f._getOb, id)
self.assertRaises(KeyError, f._delOb, id) self.assertRaises(KeyError, f._delOb, id)
self.assertEqual(len(f), 1 + len(ok)) self.assertEqual(len(f), 1 + len(ok))
self.assertEqual(f.getTreeIdList(), [None, "b", "c-a"])
for id in ok: for id in ok:
f._delOb(id) f._delOb(id)
self.assertEqual(len(f), 1) self.assertEqual(len(f), 1)
self.assertEqual(f.getTreeIdList(), [None])
self.assertEqual(ff.getTreeIdList(), [])
def testAdded(self): def testAdded(self):
self.assertEqual(self.ff.id, 'item') self.assertEqual(self.ff.id, 'item')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment