use super::structure::{InternalNode, Key, LeafNode, RowId};
use crate::page::PageId;
impl InternalNode {
pub fn find_child_index(&self, key: &Key) -> usize {
match self.keys.binary_search(key) {
Ok(idx) => idx + 1, Err(idx) => idx, }
}
pub fn insert_child(&mut self, key: Key, child_page_id: PageId) {
let idx = match self.keys.binary_search(&key) {
Ok(idx) | Err(idx) => idx,
};
self.keys.insert(idx, key);
self.children.insert(idx + 1, child_page_id);
}
}
impl LeafNode {
pub fn insert(&mut self, key: Key, row_id: RowId) -> bool {
match self.entries.binary_search_by_key(&&key, |(k, _)| k) {
Ok(idx) => {
self.entries[idx].1.push(row_id);
true
}
Err(idx) => {
self.entries.insert(idx, (key, vec![row_id]));
true
}
}
}
#[allow(dead_code)]
pub fn search(&self, key: &Key) -> Option<&Vec<RowId>> {
self.entries.binary_search_by_key(&key, |(k, _)| k).ok().map(|idx| &self.entries[idx].1)
}
#[allow(dead_code)]
pub fn delete(&mut self, key: &Key, row_id: RowId) -> bool {
match self.entries.binary_search_by_key(&key, |(k, _)| k) {
Ok(idx) => {
let row_ids = &mut self.entries[idx].1;
if let Some(pos) = row_ids.iter().position(|&id| id == row_id) {
row_ids.remove(pos);
if row_ids.is_empty() {
self.entries.remove(idx);
}
true
} else {
false }
}
Err(_) => false, }
}
pub fn delete_all(&mut self, key: &Key) -> bool {
match self.entries.binary_search_by_key(&key, |(k, _)| k) {
Ok(idx) => {
self.entries.remove(idx);
true
}
Err(_) => false,
}
}
}