main-4.cpp

#include <string>
#include "../include/antlr4-runtime/antlr4-runtime.h"

// 包含你完成的Visitor类
#include "../visitor/SQLBaseVisitor.h"
#include "../visitor/SQLLexer.h"
#include <iostream>

#include "../recordmanager/RecordManager.h"
#include "../indexmanager/index_manager.h"
#include "../loadstoremanager/load_store_manager.h"

using namespace antlr4;
using namespace std;

// 返回类型根据你的visitor决定
auto parse(SQLBaseVisitor* iVisitor, std::string sSQL) {
  // 解析SQL语句sSQL的过程
  // 转化为输入流
  ANTLRInputStream sInputStream(sSQL);
  // 设置Lexer
  SQLLexer iLexer(&sInputStream);
  CommonTokenStream sTokenStream(&iLexer);
  // 设置Parser
  SQLParser iParser(&sTokenStream);
  auto iTree = iParser.program();
  // visitor模式下执行SQL解析过程
  // --如果采用解释器方式可以在解析过程中完成执行过程(相对简单,但是很难进行进一步优化,功能上已经达到实验要求)
  // --如果采用编译器方式则需要生成自行设计的物理执行执行计划(相对复杂,易于进行进一步优化,希望有能力的同学自行调研尝试)
  auto iRes = iVisitor->visitProgram(iTree);
  return iRes;
}

int main()
{
    // parse("CREATE DATABASE db1; SHOW DATABASES; DROP DATABASE database3; USE DATABASE db1; SHOW TABLES; SHOW INDEXES; LOAD DATA INFILE file1 INTO TABLE table1; NULL;");
    MyBitMap::initConst(); 
    FileManager* fm = new FileManager();
    BufPageManager* bpm = new BufPageManager(fm);
    RecordManager* rm = new RecordManager(fm, bpm);
    b_plus_tree_page_manager* b_plus_tree_page_manager_instance = new b_plus_tree_page_manager(fm, bpm);
    b_plus_node_page_manager* b_plus_node_page_manager_instance = new b_plus_node_page_manager(fm, bpm, b_plus_tree_page_manager_instance);
    b_plus_node_page_manager_instance->_rm = rm;
    b_plus_node_page_manager_instance->table_file_name = "./databases/db1/tables/table1";
    room_manager* room_manager_instance = new room_manager(fm, bpm);
    room_manager_instance->set_bpnode_page_manager(b_plus_node_page_manager_instance);
    room_manager_instance->set_bptree_page_manager(b_plus_tree_page_manager_instance);
    leaf_linklist_manager* llm = new leaf_linklist_manager();
    llm->_bpnode_page_manager = b_plus_node_page_manager_instance;
    llm->_bptree_page_manager = b_plus_tree_page_manager_instance;
    index_manager* im = new index_manager(b_plus_tree_page_manager_instance,
    b_plus_node_page_manager_instance, room_manager_instance);
    im->_llm = llm;
    b_plus_node_page_manager_instance->_llm = llm;
    room_manager_instance->set_leaf_linklist_manager(llm);
    // 构造你的visitor
    SQLBaseVisitor* iVisitor = new SQLBaseVisitor();
    iVisitor->_fm = fm;
    iVisitor->_bpm = bpm;
    iVisitor->_rm = rm;
    iVisitor->_bpnode_page_manager = b_plus_node_page_manager_instance;
    iVisitor->_bptree_page_manager = b_plus_tree_page_manager_instance;
    iVisitor->_room_manager = room_manager_instance;
    iVisitor->_im = im;
    cout << "Line 0 begin" << endl;
    parse(iVisitor, "CREATE DATABASE db2; USE db2; CREATE TABLE table1 ( id INT, name VARCHAR(32), sex VARCHAR(4), status VARCHAR(32) ); ");
    cout << "Line 0 end" << endl;
    // parse(iVisitor, "USE db1; DROP TABLE table1;");
    // parse(iVisitor, "USE db1; DESC table1;");
    // cout << "Line 1 begin" << endl;
    // parse(iVisitor, "INSERT INTO table1 VALUES ( 0, 'LXL', 'M', 'undergraduate');");
    // cout << "Line 1 end" << endl;
    cout << "Line 2 begin" << endl;
    parse(iVisitor, "ALTER TABLE table1 ADD INDEX (id);");
    cout << "Line 2 end" << endl;
    load_store_manager lsm;
    lsm._rm = rm;
    lsm._im = im;
    lsm._sql_base_visitor = iVisitor;
    std::string table_file_name = lsm._sql_base_visitor->get_table_file_name_from_table_name("table1");
    cout << "table_file_name = " << table_file_name << endl;
    lsm.load_data("./loadstoremanager/1.csv", table_file_name, "table1");
    // cout << "Line 3 begin" << endl;
    // parse(iVisitor, "INSERT INTO table1 VALUES ( 1, 'MingMing', 'M', 'undergraduate');");
    // cout << "Line 3 end" << endl;
    // parse(iVisitor, "DELETE FROM table1 WHERE table1.id = 0;");
    // cout << "Line 4 begin" << endl;
    // parse(iVisitor, "UPDATE table1 SET id = 4 WHERE table1.id = 1;");
    // cout << "Line 4 end" << endl;
    cout << "Line 5 begin" << endl;
    parse(iVisitor, "SELECT * FROM table1; ");
    // parse(iVisitor, "SELECT * FROM table1 WHERE table1.id >= 0 AND table1.name <> 'LXL'; ");
    cout << "Line 5 end" << endl;
    cout << "yeah!" << endl;
    int root_node_id = im->_bptree_page_manager->get_root_node_field_of_page("./databases/db2/indexes/table1_on_id", 0);
    std::cout << root_node_id << std::endl;
    im->display("./databases/db2/indexes/table1_on_id", root_node_id);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值