#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);
}