Commit 97e6e87f authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 14ea63ba
...@@ -200,6 +200,9 @@ def Restructure(ztree, newStructure): ...@@ -200,6 +200,9 @@ def Restructure(ztree, newStructure):
_bcheck(ztree) # verify ztree before our tweaks _bcheck(ztree) # verify ztree before our tweaks
# dict with all k->v from ztree
kv = dict(ztree)
# walk original and new strucutres level by level. # walk original and new strucutres level by level.
# for each level we have A1...An "old" nodes, and B1...Bm "new" nodes. # for each level we have A1...An "old" nodes, and B1...Bm "new" nodes.
# XXX buckets - push till end # XXX buckets - push till end
...@@ -224,10 +227,58 @@ def Restructure(ztree, newStructure): ...@@ -224,10 +227,58 @@ def Restructure(ztree, newStructure):
# #
tnew = newStructure.copy() tnew = newStructure.copy()
zlevelv = _zwalkBFS(ztree) zlevelv = list(_zwalkBFS(ztree))
levelv = _walkBFS(tnew) levelv = list( _walkBFS(tnew))
# assotiate every node in tnew to a znode
# XXX check for end
zlevel = zlevel.pop(0)
level = level.pop(0)
if len(zlevel) == len(level): # map 1-1
for (znode, node) in zip(zlevel, level):
node.Z = znode
else:
panic("TODO")
# set znode states according to established tnew->znode association
for nodev in levelv:
for node in nodev:
znode = node.Z
if isinstance(node, Bucket):
# https://github.com/zopefoundation/BTrees/blob/4.5.0-1-gc8bf24e/BTrees/BucketTemplate.c#L1195
zstate = ()
for k in node.keyv:
zstate += (k, kv[k]) # (k1, v1, k2, v2, ..., kN, vN)
zstate = (zstate,)
if node.next_bucket is not None: # next
zstate += (node.next_bucket.Z,)
else:
assert isinstance(node, Tree)
# https://github.com/zopefoundation/BTrees/blob/4.5.0-1-gc8bf24e/BTrees/BTreeTemplate.c#L1087
if len(node.keyv) == 0:
panic("TODO: empty tree + tree with bucket without oid")
zstate = ()
assert len(node.children) == len(node.keyv) + 1
zstate += node.children[0]
for (child, k) in zip(node.children[1:], node.keyv):
zstate += (k, child) # (child0, k0, child1, k1, ..., childN, kN, childN+1)
zstate = (zstate,)
# firstbucket
zstate += (None,) # XXX
znode.__setstate__(zstate)
assert tnew.Z is ztree
_bcheck(ztree) # verify ztree after our tweaks _bcheck(ztree) # verify ztree after our tweaks
tstruct = StructureOf(ztree) tstruct = StructureOf(ztree)
......
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