private static MemoryTreeNode GetUpLinkFirstLeaf(TreeFile TreeFile, MemoryTreeNode ParentNode) { if (ParentNode.TreeNode.TypeIndicator == EnumValues.TypeIndicator.root) { return(null); } MemoryTreeNode siblingNode; byte[] siblingkey = KeyFinder.FindSmallestBiggerKey(ParentNode.ParentNodeKey, ParentNode.Parent.TreeNode.KeyArray, TreeFile.comparer); while (siblingkey != null) { var pointer = ParentNode.Parent.TreeNode.FindPointer(siblingkey); if (pointer != null && pointer.PositionPointer > 0) { siblingNode = GetOrLoadNode(TreeFile, ParentNode.Parent, pointer); var result = FindContainerFirstLeaf(TreeFile, siblingNode); if (result != null) { return(result); } } siblingkey = KeyFinder.FindSmallestBiggerKey(siblingkey, ParentNode.Parent.TreeNode.KeyArray, TreeFile.comparer); } return(GetUpLinkFirstLeaf(TreeFile, ParentNode.Parent)); }
public static MemoryTreeNode FindNextLeaf(TreeFile TreeFile, MemoryTreeNode CurrentLeaf) { if (CurrentLeaf.TreeNode.TypeIndicator != EnumValues.TypeIndicator.leaf) { throw new Exception("this method only accept leaf"); } byte[] key = KeyFinder.FindSmallestBiggerKey(CurrentLeaf.ParentNodeKey, CurrentLeaf.Parent.TreeNode.KeyArray, TreeFile.comparer); while (key != null) { var pointer = CurrentLeaf.Parent.TreeNode.FindPointer(key); if (pointer != null && pointer.PositionPointer > 0) { var nextleaf = GetOrLoadNode(TreeFile, CurrentLeaf.Parent, pointer); if (nextleaf != null && nextleaf.TreeNode.TypeIndicator == EnumValues.TypeIndicator.leaf) { return(nextleaf); } } key = KeyFinder.FindSmallestBiggerKey(key, CurrentLeaf.Parent.TreeNode.KeyArray, TreeFile.comparer); } return(GetUpLinkFirstLeaf(TreeFile, CurrentLeaf.Parent)); }
private static MemoryTreeNode FindContainerLastLeaf(TreeFile TreeFile, MemoryTreeNode ContainerNode) { if (ContainerNode == null) { return(null); } if (ContainerNode.TreeNode.TypeIndicator == EnumValues.TypeIndicator.leaf) { return(ContainerNode); } NodePointer pointer = new NodePointer(); pointer.PointerBytes = ContainerNode.TreeNode.PreviousPointer; if (pointer.PositionPointer > 0) { var subnode = GetOrLoadNode(TreeFile, ContainerNode, pointer); if (subnode != null) { var result = FindContainerFirstLeaf(TreeFile, subnode); if (result != null) { return(result); } } } // did not get return, try one key by one key. byte[] key = KeyFinder.FindSmallestBiggerKey(null, ContainerNode.TreeNode.KeyArray, TreeFile.comparer); while (key != null) { var nodepointer = ContainerNode.TreeNode.FindPointer(key); if (nodepointer != null && nodepointer.PositionPointer > 0) { var keynode = GetOrLoadNode(TreeFile, ContainerNode, nodepointer); if (keynode != null) { var result = FindContainerFirstLeaf(TreeFile, keynode); if (result != null) { return(result); } } } key = KeyFinder.FindSmallestBiggerKey(key, ContainerNode.TreeNode.KeyArray, TreeFile.comparer); } return(null); }