1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
int XDirectoryNode::insert(DataObject obj, X_Node **new_node) {
SET_OF_MBR *s1 *s2;
X_Node *follow, *new_son;
int return_value;
// choose a son node to insert obj into
follow = choose_subtree(obj);
// insert obj into subtree
return_value = follow->insert(obj,new_son);
// update MBR of o son node
update_mbr(follow->calc_mbr());
if (return_value == SPLIT) {
// insert mbr of new son node into current node
add_mbr(new_son->calc_mbr());
if (num_of_mbrs()>CAPACITY){ // overflow occurs
if (split(mbrs,s1,s2)==TRUE) {
// topological or overlap-minimal split was successfull
set_mbrs(s1);
*new_node=new X_DirectoryNode(s2);
return SPLIT;
} else { // there is no good split
*newnode = new X_SuperNode();
(*newnode)->set_mbrs(mbrs);
return SUPERNODE;
}
}
// node 'follow' becomes a supernode
} else if (return_value == SUPERNODE) {
remove_son(follow);
insert_son (new_son);
}
return NO_SPLIT;
} |
Partager