#include "leaf_linklist_manager.h"
#include "b_plus_node_page.h"
leaf_linklist_manager::leaf_linklist_manager () {}
int leaf_linklist_manager::find_prev ( std::string index_file_name, int node_id )
{
cout << "find_prev begins" << endl;
int bptree_page_id = _bpnode_page_manager->get_bptree_field_of_page(index_file_name, node_id);
int root_node_id = _bptree_page_manager->get_root_node_field_of_page(index_file_name, bptree_page_id);
int current_node_id = node_id;
int prev_node_id = -1;
int prev_sibling = -1;
while ( current_node_id != root_node_id )
{
int parent_node_id = _bpnode_page_manager->get_parent_node_field_of_page(index_file_name, current_node_id );
cout << current_node_id << "," << parent_node_id << "," << root_node_id << endl;
int parent_node_children_num = _bpnode_page_manager->count_rows(index_file_name, parent_node_id);
bool prev_in_this_layer = false;
for ( int i = 0; i < parent_node_children_num; i++ )
{
vector<RecordItem> record_data;
_bpnode_page_manager->read_row(index_file_name, parent_node_id, i, record_data);
if ( record_data[2].getInt() == current_node_id )
{
if ( i == 0 )
{
prev_in_this_layer = false;
break;
}
else
{
prev_in_this_layer = true;
vector<RecordItem> record_data_1;
_bpnode_page_manager->read_row(index_file_name, parent_node_id, i-1, record_data_1);
prev_sibling = record_data_1[2].getInt();
}
}
}
if ( !prev_in_this_layer )
{
current_node_id = parent_node_id;
continue;
}
else
{
break;
}
}
cout << "here line55" << endl;
int current_node_id_1;
if ( prev_sibling != -1 )
{
current_node_id_1 = prev_sibling;
while ( true )
{
bool current_node_1_leaf_node = _bpnode_page_manager->get_is_leaf_node_field_of_page(index_file_name, current_node_id_1);
if ( current_node_1_leaf_node )
{
prev_node_id = current_node_id_1;
break;
}
else
{
vector<RecordItem> record_data_2;
_bpnode_page_manager->read_last_row(index_file_name, current_node_id_1, record_data_2);
current_node_id_1 = record_data_2[2].getInt();
continue;
}
}
}
else
{
prev_node_id = -1;
}
cout << "find_prev ends, prev_node_id = " << prev_node_id << endl;
return prev_node_id;
}
int leaf_linklist_manager::find_next ( std::string index_file_name, int node_id )
{
cout << "find_next begins" << endl;
int bptree_page_id = _bpnode_page_manager->get_bptree_field_of_page(index_file_name, node_id);
int root_node_id = _bptree_page_manager->get_root_node_field_of_page(index_file_name, bptree_page_id);
int current_node_id = node_id;
int next_node_id = -1;
int next_sibling = -1;
while ( current_node_id != root_node_id )
{
int parent_node_id = _bpnode_page_manager->get_parent_node_field_of_page(index_file_name, current_node_id );
cout << current_node_id << "," << parent_node_id << "," << root_node_id << endl;
int parent_node_children_num = _bpnode_page_manager->count_rows(index_file_name, parent_node_id);
bool next_in_this_layer = false;
for ( int i = parent_node_children_num - 1; i >= 0 ; i-- )
{
vector<RecordItem> record_data;
_bpnode_page_manager->read_row(index_file_name, parent_node_id, i, record_data);
if ( record_data[2].getInt() == current_node_id )
{
if ( i == parent_node_children_num - 1 )
{
next_in_this_layer = false;
break;
}
else
{
next_in_this_layer = true;
// cout << "here line99" << endl;
vector<RecordItem> record_data_1;
_bpnode_page_manager->read_row(index_file_name, parent_node_id, i+1, record_data_1);
next_sibling = record_data_1[2].getInt();
}
}
}
if ( !next_in_this_layer )
{
current_node_id = parent_node_id;
continue;
}
else
{
break;
}
}
if ( next_sibling != -1 )
{
int current_node_id_1 = next_sibling;
while ( true )
{
bool current_node_1_leaf_node = _bpnode_page_manager->get_is_leaf_node_field_of_page(index_file_name, current_node_id_1);
if ( current_node_1_leaf_node )
{
next_node_id = current_node_id_1;
break;
}
else
{
vector<RecordItem> record_data_2;
_bpnode_page_manager->read_row(index_file_name, current_node_id_1, 0, record_data_2);
current_node_id_1 = record_data_2[2].getInt();
continue;
}
}
}
else
{
next_node_id = -1;
}
cout << "find_next_ends, next_node_id = "<< next_node_id << endl;
return next_node_id;
}
int leaf_linklist_manager::get_prev_in_leaf_linklist ( std::string index_file_name, int node_id )
{
// suppose node_id refers to a node page, not tree page
int bptree_pos = _bpnode_page_manager->get_bptree_field_of_page(index_file_name, node_id);
int prev_node_id = _bpnode_page_manager->get_prev_page_in_leaf_link_list_field_of_page(index_file_name, node_id);
if ( prev_node_id == bptree_pos || prev_node_id == -1)
{
cout << "already the first page" << endl;
return -1;
}
else
{
return prev_node_id;
}
}
int leaf_linklist_manager::get_next_in_leaf_linklist ( std::string index_file_name, int node_id )
{
int bptree_pos = _bpnode_page_manager->get_bptree_field_of_page(index_file_name, node_id );
cout << "(bptree_pos = " << bptree_pos <<")" ;
int next_node_id = -1;
if ( bptree_pos == node_id )
{
next_node_id = _bptree_page_manager->get_leaf_link_list_pointer_field_of_page(index_file_name, node_id);
}
else
{
next_node_id = _bpnode_page_manager->get_next_page_in_leaf_link_list_field_of_page(index_file_name, node_id );
}
if ( next_node_id == -1 )
{
cout << "already the last page" << endl;
return -1;
}
else
{
cout << "(next_node_id = "<< next_node_id << ")";
return next_node_id;
}
}
void leaf_linklist_manager::print_leaf_linklist ( std::string index_file_name, int bptree_pos )
{
cout << "leaf_linklist of " << index_file_name << ":";
int current_node_id = bptree_pos;
while ( current_node_id >= 0 )
{
cout << current_node_id << ",";
current_node_id = get_next_in_leaf_linklist(index_file_name, current_node_id);
if ( current_node_id == bptree_pos )
{
cout << "line 205" << endl;
break;
}
}
cout << endl;
}
bool leaf_linklist_manager::check_if_in_leaf_linklist ( std::string index_file_name, int node_id )
{
int bptree_pos = _bpnode_page_manager->get_bptree_field_of_page ( index_file_name, node_id );
int current_node_id = bptree_pos;
while ( current_node_id >= 0 )
{
if ( current_node_id == node_id ) return true;
// cout << current_node_id << ",";
current_node_id = get_next_in_leaf_linklist(index_file_name, current_node_id);
}
// cout << endl;
return false;
}
void leaf_linklist_manager::add_to_leaf_linklist ( std::string index_file_name, int node_id )
{
cout << "in add_to_leaf_linklist" << endl;
int bptree_pos = _bpnode_page_manager->get_bptree_field_of_page(index_file_name, node_id );
int prev_node_id = find_prev(index_file_name,node_id);
int next_node_id = find_next(index_file_name,node_id);
if ( prev_node_id == -1 && next_node_id == -1)
{
_bptree_page_manager->set_leaf_link_list_pointer_field_of_page(index_file_name, bptree_pos, node_id );
_bpnode_page_manager->set_prev_page_in_leaf_link_list_field_of_page(index_file_name, node_id, bptree_pos );
_bpnode_page_manager->set_next_page_in_leaf_link_list_field_of_page(index_file_name, node_id, -1 );
}
else if ( prev_node_id == -1 && next_node_id != -1 )
{
_bptree_page_manager->set_leaf_link_list_pointer_field_of_page(index_file_name, bptree_pos, node_id );
_bpnode_page_manager->set_prev_page_in_leaf_link_list_field_of_page(index_file_name, node_id, bptree_pos );
_bpnode_page_manager->set_next_page_in_leaf_link_list_field_of_page(index_file_name, node_id, next_node_id );
_bpnode_page_manager->set_prev_page_in_leaf_link_list_field_of_page(index_file_name, next_node_id, node_id );
}
else if ( prev_node_id != -1 && next_node_id == -1 )
{
_bpnode_page_manager->set_next_page_in_leaf_link_list_field_of_page(index_file_name, prev_node_id, node_id );
_bpnode_page_manager->set_prev_page_in_leaf_link_list_field_of_page(index_file_name, node_id, prev_node_id );
_bpnode_page_manager->set_next_page_in_leaf_link_list_field_of_page(index_file_name, node_id, -1 );
}
else
{
_bpnode_page_manager->set_prev_page_in_leaf_link_list_field_of_page(index_file_name, node_id, prev_node_id);
_bpnode_page_manager->set_next_page_in_leaf_link_list_field_of_page(index_file_name, node_id, next_node_id);
_bpnode_page_manager->set_next_page_in_leaf_link_list_field_of_page(index_file_name, prev_node_id, node_id );
_bpnode_page_manager->set_prev_page_in_leaf_link_list_field_of_page(index_file_name, next_node_id, node_id );
}
cout << "after add_to_leaf_linklist" << endl;
}
void leaf_linklist_manager::delete_from_leaf_linklist ( std::string index_file_name, int node_id )
{
cout << "in delete_from_leaf_linklist, node_id = " << node_id << endl;
int bptree_pos = _bpnode_page_manager->get_bptree_field_of_page(index_file_name, node_id );
int prev_node_id = get_prev_in_leaf_linklist(index_file_name,node_id);
int next_node_id = get_next_in_leaf_linklist(index_file_name,node_id);
if ( prev_node_id == -1 && next_node_id == -1 )
{
_bptree_page_manager->set_leaf_link_list_pointer_field_of_page(index_file_name, bptree_pos, -1 );
}
else if ( prev_node_id == -1 && next_node_id != -1 )
{
_bptree_page_manager->set_leaf_link_list_pointer_field_of_page(index_file_name, bptree_pos, next_node_id);
_bpnode_page_manager->set_prev_page_in_leaf_link_list_field_of_page(index_file_name, next_node_id, bptree_pos );
_bpnode_page_manager->set_next_page_in_leaf_link_list_field_of_page(index_file_name, node_id, -1 );
}
else if ( prev_node_id != -1 && next_node_id == -1 )
{
_bpnode_page_manager->set_next_page_in_leaf_link_list_field_of_page(index_file_name, prev_node_id, -1 );
_bpnode_page_manager->set_prev_page_in_leaf_link_list_field_of_page(index_file_name, node_id, -1 );
}
else
{
_bpnode_page_manager->set_next_page_in_leaf_link_list_field_of_page(index_file_name, prev_node_id, next_node_id );
_bpnode_page_manager->set_prev_page_in_leaf_link_list_field_of_page(index_file_name, next_node_id, prev_node_id );
_bpnode_page_manager->set_next_page_in_leaf_link_list_field_of_page(index_file_name, node_id, -1 );
_bpnode_page_manager->set_prev_page_in_leaf_link_list_field_of_page(index_file_name, node_id, -1 );
}
cout << "after delete_from_leaf_linklist" << endl;
}
int leaf_linklist_manager::find_prev_pos ( std::string index_file_name, int page_id, int slot_id, std::vector<int>& res )
{
if ( slot_id == 0 )
{
int prev_page = get_prev_in_leaf_linklist ( index_file_name, page_id );
if ( prev_page == -1 )
{
return -1;
}
else
{
res.push_back( prev_page );
int row_num = _bpnode_page_manager->count_rows(index_file_name, prev_page);
res.push_back( row_num - 1 );
return 0;
}
}
else
{
res.push_back( page_id );
res.push_back( slot_id - 1 );
return 0;
}
}
int leaf_linklist_manager::find_next_pos ( std::string index_file_name, int page_id, int slot_id, std::vector<int>& res )
{
int row_num = _bpnode_page_manager->count_rows(index_file_name, page_id );
if ( slot_id == row_num - 1 )
{
int next_page = get_next_in_leaf_linklist ( index_file_name, page_id );
if ( next_page == -1 )
{
return -1;
}
else
{
res.push_back( next_page );
res.push_back( 0 );
return 0;
}
}
else
{
res.push_back( page_id );
res.push_back( slot_id + 1 );
return 0;
}
}
leaf_linklist_manager
最新推荐文章于 2025-12-15 09:15:21 发布
文章详细描述了一个名为`leaf_linklist_manager`的类,它在B+树结构中负责节点的查找,包括找到前一个节点和后一个节点,以及维护叶链表的操作。类方法涉及BPTreePageManager对象,用于获取和修改页上的节点信息。
4242

被折叠的 条评论
为什么被折叠?



