leaf_linklist_manager

文章详细描述了一个名为`leaf_linklist_manager`的类,它在B+树结构中负责节点的查找,包括找到前一个节点和后一个节点,以及维护叶链表的操作。类方法涉及BPTreePageManager对象,用于获取和修改页上的节点信息。
#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;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值