| 69 | } |
| 70 | |
| 71 | pub fn split(&mut self, b: usize) -> Result<(K, Node<K, V>), io::Error> { |
| 72 | // println!("Splitting node: {:?}", self.keys); |
| 73 | |
| 74 | match self.node_type { |
| 75 | NodeType::Internal => { |
| 76 | if b <= 1 || b > self.keys.len() { |
| 77 | return Err(io::Error::new( |
| 78 | io::ErrorKind::Other, |
| 79 | "Invalid split point for internal node", |
| 80 | )); |
| 81 | } |
| 82 | let mut sibling_keys = self.keys.split_off(b - 1); |
| 83 | let median_key = sibling_keys.remove(0); |
| 84 | |
| 85 | let sibling_children = self.children.split_off(b); |
| 86 | |
| 87 | let sibling = Node { |
| 88 | keys: sibling_keys, |
| 89 | values: Vec::new(), |
| 90 | children: sibling_children, |
| 91 | max_keys: self.max_keys, |
| 92 | node_type: NodeType::Internal, |
| 93 | offset: 0, // This should be set when the node is stored |
| 94 | is_root: false, |
| 95 | parent_offset: self.parent_offset, |
| 96 | }; |
| 97 | |
| 98 | // println!( |
| 99 | // "Internal node split: median_key = {}, sibling_keys = {:?}", |
| 100 | // median_key, sibling.keys |
| 101 | // ); |
| 102 | Ok((median_key, sibling)) |
| 103 | } |
| 104 | NodeType::Leaf => { |
| 105 | if b < 1 || b >= self.keys.len() { |
| 106 | return Err(io::Error::new( |
| 107 | io::ErrorKind::Other, |
| 108 | "Invalid split point for leaf node", |
| 109 | )); |
| 110 | } |
| 111 | let sibling_keys = self.keys.split_off(b); |
| 112 | let median_key = self.keys.get(b - 1).unwrap().clone(); |
| 113 | let sibling_values = self.values.split_off(b); |
| 114 | |
| 115 | let sibling = Node { |
| 116 | keys: sibling_keys, |
| 117 | values: sibling_values, |
| 118 | children: Vec::new(), |
| 119 | max_keys: self.max_keys, |
| 120 | node_type: NodeType::Leaf, |
| 121 | offset: 0, // This should be set when the node is stored |
| 122 | is_root: false, |
| 123 | parent_offset: self.parent_offset, |
| 124 | }; |
| 125 | |
| 126 | // println!( |
| 127 | // "Leaf node split: median_key = {}, sibling_keys = {:?}", |
| 128 | // median_key, sibling.keys |