better table print, order by/offset/limit improvements

This commit is contained in:
2021-08-01 10:40:47 +02:00
parent 34e432d031
commit 70c036f08c
17 changed files with 3037 additions and 60 deletions

View File

@@ -106,7 +106,7 @@ std::unique_ptr<Table> USql::execute_save(SaveTableNode &node) {
file << csv_string;
file.close();
return create_stmt_result_table(0, "save succeeded", 0);
return create_stmt_result_table(0, "save succeeded", table_def->rows_count());
}
std::unique_ptr<Table> USql::execute_drop(DropTableNode &node) {
@@ -191,18 +191,20 @@ std::unique_ptr<Table> USql::execute_select(SelectFromTableNode &node) {
}
// order by
execute_order_by(node, table, result);
execute_order_by(node, table, result.get());
// offset & limit
execute_offset_limit(node.offset_limit, result.get());
return std::move(result);
}
void USql::execute_order_by(SelectFromTableNode &node, Table *table, std::__unique_if<Table>::__unique_single &result) const {
void USql::execute_order_by(SelectFromTableNode &node, Table *table, Table *result) const {
if (node.order_by.size() == 0) return;
auto compare_rows = [&node, &table, this](const Row &a, const Row &b) {
auto compare_rows = [&node, &result, this](const Row &a, const Row &b) {
for(auto order_by_col_def : node.order_by) {
ColDefNode col_def = table->get_column_def(order_by_col_def.col_index - 1); // TODO validate index
ColDefNode col_def = result->get_column_def(order_by_col_def.col_index - 1); // TODO validate index
ColValue *a_val = a.ith_column(col_def.order);
ColValue *b_val = b.ith_column(col_def.order);
@@ -217,7 +219,16 @@ void USql::execute_order_by(SelectFromTableNode &node, Table *table, std::__uniq
return false;
};
result->m_rows.sort(compare_rows);
std::sort(result->m_rows.begin(), result->m_rows.end(), compare_rows);
}
void USql::execute_offset_limit(OffsetLimitNode &node, Table *result) const {
if (node.offset > 0)
result->m_rows.erase(result->m_rows.begin(),
result->rows_count() > node.offset ? result->m_rows.begin() + node.offset : result->m_rows.end());
if (node.limit > 0 && node.limit < result->rows_count())
result->m_rows.erase(result->m_rows.begin() + node.limit, result->m_rows.end());
}
int USql::compare_col_values(const ColDefNode &col_def, ColValue *a_val, ColValue *b_val) const {
@@ -247,7 +258,7 @@ std::tuple<int, ColDefNode> USql::get_column_definition(Table *table, SelectColN
auto node = static_cast<FunctionNode *>(select_col_node->value.get());
if (node->function == "to_string") {
ColDefNode cdef = ColDefNode{new_col_name, ColumnType::varchar_type, col_order, 64, true};
ColDefNode cdef = ColDefNode{new_col_name, ColumnType::varchar_type, col_order, 32, true};
return std::make_tuple(-1, cdef);
} else if (node->function == "to_date") {
ColDefNode cdef = ColDefNode{new_col_name, ColumnType::integer_type, col_order, 1, true};
@@ -264,16 +275,14 @@ std::unique_ptr<Table> USql::execute_delete(DeleteFromTableNode &node) {
Table *table = find_table(node.table_name);
// execute access plan
int affected_rows = 0;
auto it = table->m_rows.begin();
for (; it != table->m_rows.end();) {
if (eval_where(node.where.get(), table, *it)) {
it = table->m_rows.erase(it);
affected_rows++;
} else {
++it;
}
}
int affected_rows = table->rows_count();
table->m_rows.erase(
std::remove_if(table->m_rows.begin(), table->m_rows.end(),
[&node, table, this](Row &row){return eval_where(node.where.get(), table, row);}),
table->m_rows.end());
affected_rows -= table->rows_count();
return create_stmt_result_table(0, "delete succeeded", affected_rows);
}
@@ -520,7 +529,7 @@ std::unique_ptr<ValueNode> USql::eval_arithmetic_operator(ColumnType outType, Ar
std::unique_ptr<Table> USql::create_stmt_result_table(long code, const std::string &text, long affected_rows) {
std::vector<ColDefNode> result_tbl_col_defs{};
result_tbl_col_defs.push_back(ColDefNode("code", ColumnType::integer_type, 0, 1, false));
result_tbl_col_defs.push_back(ColDefNode("desc", ColumnType::varchar_type, 1, 255, false));
result_tbl_col_defs.push_back(ColDefNode("desc", ColumnType::varchar_type, 1, 48, false));
result_tbl_col_defs.push_back(ColDefNode("affected_rows", ColumnType::integer_type, 0, 1, true));
auto table_def = std::make_unique<Table>("result", result_tbl_col_defs);