Пример #1
0
    def update_node(self, node, key, value):
        _node_type = self.node_type(node)
        #print("Node Type:", _node_type)
        if _node_type == 'Branch':
            #key空,直接將value 存在branch node 的最後
            if not key:
                node[-1] = value
            #沿著branch node繼續往下找
            else:   
                new_node = self.update_and_delete(self.decode(node[key[0]]), key[1:], value)
                node[key[0]] = self.update_db(new_node)
            return node
        
        elif _node_type == 'Leaf' or _node_type == 'Extension':
            original_key = ori_key = encoding.terminator(encoding.hp_to_hex(node[0]),False)
            prefix = 0
            for i in range(min(len(ori_key), len(key))):
                if key[i] != ori_key[i]:
                    break
                prefix = i + 1
            key = key[prefix:]
            ori_key = ori_key[prefix:]
            #與現在node's key一樣
            if key == ori_key == []:

                if _node_type == 'Leaf':
                    return [node[0], value]
                new_node = self.update_and_delete(self.decode(node[1]), key, value)
            
            elif ori_key == []:
                #查此extension node的child
                if _node_type == 'Extension':
                    
                    new_node = self.update_and_delete(self.decode(node[1]), key, value)
                #如果是leaf node 開一個branch node 將原本node和new node放進新的branch
                else:
                    new_node = [""]*17
                    new_node[-1] = node[1]
                    new_node[key[0]] = self.update_db([encoding.hex_to_hp(encoding.terminator(key[1:],True)), value])
            
            else:
                new_node = [""]*17
                if len(ori_key) == 1 and _node_type == "Extension":
                    new_node[ori_key[0]] = node[1]
                else:
                    if _node_type == "Extension":
                        ter = False
                    else:
                        ter = True
                    new_node[ori_key[0]] = self.update_db([encoding.hex_to_hp(encoding.terminator(ori_key[1:],ter)),node[1]])
                #if key空 value直接放進branch,else 把剩下的key value存入branch
                if key == []:
                    new_node[-1] = value
                else:
                    new_node[key[0]] = self.update_db([encoding.hex_to_hp(encoding.terminator(key[1:],True)), value])
            #change current node to a extension node which connected with the branch node we create above
            if prefix > 0:
                new_node = [encoding.hex_to_hp(original_key[:prefix]), self.update_db(new_node)]
            return new_node
                
        elif _node_type == "Blank":
            return [encoding.hex_to_hp(encoding.terminator(key,True)), value]
Пример #2
0
    def delete_node(self, node, key):
        _node_type = self.node_type(node)
        if _node_type == "Blank":
            return ""

        elif _node_type == "Branch":
            #key empty, find it
            if not key:
                node[-1] = ""
                #print("Node after delete",node)
            else:
                new_node = self.delete_and_delete(self.decode(node[key[0]]), key[1:])
                new_node = self.update_db(new_node)
                if new_node == node[key[0]]:
                    return node
                else:
                    node[key[0]] = new_node
            #after deleting, if the branch node has only one child, change it into extension/leaf node
            count = 0
            not_blank = []
            for idx in range(17):
                if node[idx] != "":
                    count += 1
                    not_blank.append(idx)
            if count > 1:
                return node
            else:
                #return leaf node
                if not_blank[0] == END:
                    return [encoding.hex_to_hp(encoding.terminator([], True)), node[-1]]
                else:
                    child_node = self.decode(node[not_blank[0]])
                    child_node_type = self.node_type(child_node)
                    if child_node_type == "Branch":
                        return [encoding.hex_to_hp(not_blank), self.update_db(child_node)]
                    elif child_node_type == "Leaf" or child_node_type == "Extension":
                        new_key = not_blank + encoding.hp_to_hex(child_node[0])
                        return [encoding.hex_to_hp(new_key), child_node[1]]
                    
        else:
            original_key = encoding.terminator(encoding.hp_to_hex(node[0]),False)
            if _node_type == "Leaf":
                if original_key == key:
                    return ""
                else:
                    return node
            if len(original_key) > len(key) or key[:len(original_key)] != original_key:
                return node
            new_node = self.delete_and_delete(self.decode(node[1]), key[len(original_key):])
            #child is not found
            if new_node == self.decode(node[1]):
                return node
            if new_node == "":
                return ""
            #some nodes have been changed
            else:
                new_node_type = self.node_type(new_node)
                if new_node_type == "Branch":
                    return [encoding.hex_to_hp(original_key), self.update_db(new_node)]
                else:
                    original_key = original_key + encoding.hp_to_hex(new_node[0])
                    return [encoding.hex_to_hp(original_key), new_node[1]]