some code refactoring
This commit is contained in:
61
usql_dml.cpp
61
usql_dml.cpp
@@ -22,22 +22,19 @@ std::pair<bool, std::vector<rowid_t>> USql::probe_index_scan(const Node *where,
|
||||
std::pair<bool, std::vector<rowid_t>> USql::look_for_usable_index(const Node *where, Table *table) const {
|
||||
if (where->node_type == NodeType::relational_operator) {
|
||||
auto * ron = (RelationalOperatorNode *)where;
|
||||
// TODO impllemen > & < https://en.cppreference.com/w/cpp/container/map/upper_bound
|
||||
if (ron->op == RelationalOperatorType::equal) {
|
||||
if (ron->left->node_type == NodeType::database_value &&
|
||||
((ron->right->node_type == NodeType::int_value) || (ron->right->node_type == NodeType::string_value))
|
||||
) {
|
||||
) {
|
||||
auto col_name = ((DatabaseValueNode *)ron->left.get())->col_name;
|
||||
|
||||
Index<IndexValue> * used_index = table->get_index_for_column(col_name);
|
||||
if (used_index != nullptr) {
|
||||
std::vector<rowid_t> rowids;
|
||||
|
||||
if (used_index->get_data_type() == IndexedDataType::integer)
|
||||
rowids = used_index->search(((ValueNode *) ron->right.get())->getIntegerValue());
|
||||
else if (used_index->get_data_type() == IndexedDataType::string)
|
||||
rowids = used_index->search(((ValueNode *) ron->right.get())->getStringValue());
|
||||
|
||||
std::vector<rowid_t> rowids = used_index->search((ValueNode *)ron->right.get());
|
||||
#ifndef NDEBUG
|
||||
std::cout << "using index " << table->m_name << "(" << used_index->get_column_name() << "), " << rowids.size() << "/" << table->rows_count() << std::endl;
|
||||
#endif
|
||||
return std::make_pair(true, rowids);
|
||||
}
|
||||
}
|
||||
@@ -80,19 +77,21 @@ bool USql::normalize_where(const Node *node) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
void USql::eval_where_on_row(SelectFromTableNode &where_node,
|
||||
Table *src_table, Row *src_row,
|
||||
Table *rslt_table, Row *rslt_row,
|
||||
const std::vector<ColDefNode> &rslt_tbl_col_defs,
|
||||
const std::vector<int> &src_table_col_index,
|
||||
bool is_aggregated) {
|
||||
void USql::select_row(SelectFromTableNode &where_node,
|
||||
Table *src_table, Row *src_row,
|
||||
Table *rslt_table,
|
||||
const std::vector<ColDefNode> &rslt_tbl_col_defs,
|
||||
const std::vector<int> &src_table_col_index,
|
||||
bool is_aggregated) {
|
||||
|
||||
if (eval_where(where_node.where.get(), src_table, *src_row)) {
|
||||
// prepare empty src_row and copy column values
|
||||
// when aggregate functions in rslt_table only one src_row for src_table
|
||||
if (!is_aggregated || rslt_table->rows_count() == 0) {
|
||||
Row *rslt_row = nullptr;
|
||||
|
||||
// when aggregate functions in rslt_table only one row exists
|
||||
// TODO add function to get rows count
|
||||
if (is_aggregated && !rslt_table->m_rows.empty())
|
||||
rslt_row = &rslt_table->m_rows[0];
|
||||
else
|
||||
rslt_row = &rslt_table->create_empty_row();
|
||||
}
|
||||
|
||||
for (auto idx = 0; idx < rslt_table->columns_count(); idx++) {
|
||||
auto src_table_col_idx = src_table_col_index[idx];
|
||||
@@ -109,11 +108,8 @@ void USql::eval_where_on_row(SelectFromTableNode &where_node,
|
||||
}
|
||||
}
|
||||
|
||||
// add src_row to rslt_table
|
||||
if (!is_aggregated) {
|
||||
rslt_table->commit_row(*rslt_row);
|
||||
}
|
||||
}
|
||||
// for aggregate is validated more than needed
|
||||
rslt_table->commit_row(*rslt_row);
|
||||
}
|
||||
|
||||
bool USql::check_for_aggregate_only_functions(SelectFromTableNode &node, size_t result_cols_cnt) {
|
||||
@@ -155,12 +151,12 @@ void USql::setup_order_columns(std::vector<ColOrderNode> &node, Table *table) {
|
||||
|
||||
if (order_node.col_index < 0 || order_node.col_index >= table->columns_count())
|
||||
throw Exception("unknown column in order by clause (" + order_node.col_name + ")");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void USql::execute_distinct(SelectFromTableNode &node, Table *result) {
|
||||
if (!node.distinct) return;
|
||||
|
||||
|
||||
auto compare_rows = [](const Row &a, const Row &b) { return a.compare(b) >= 0; };
|
||||
std::sort(result->m_rows.begin(), result->m_rows.end(), compare_rows);
|
||||
|
||||
@@ -334,8 +330,7 @@ std::unique_ptr<Table> USql::execute_delete(const DeleteFromTableNode &node) {
|
||||
// execute access plan
|
||||
Table::rows_scanner i = get_iterator(table, node.where.get());
|
||||
while(Row *row = i.next()) {
|
||||
bool to_delete = eval_where(node.where.get(), table, *row);
|
||||
if (to_delete) {
|
||||
if (eval_where(node.where.get(), table, *row)) {
|
||||
row->set_deleted();
|
||||
table->unindex_row(*row);
|
||||
|
||||
@@ -356,8 +351,7 @@ std::unique_ptr<Table> USql::execute_update(const UpdateTableNode &node) {
|
||||
// execute access plan
|
||||
Table::rows_scanner i = get_iterator(table, node.where.get());
|
||||
while(Row *row = i.next()) {
|
||||
bool to_update = eval_where(node.where.get(), table, *row);
|
||||
if (to_update) {
|
||||
if (eval_where(node.where.get(), table, *row)) {
|
||||
Row old_row = * row;
|
||||
|
||||
int col_idx = 0;
|
||||
@@ -410,12 +404,11 @@ std::unique_ptr<Table> USql::execute_select(SelectFromTableNode &node) const {
|
||||
setup_order_columns(node.order_by, result.get());
|
||||
|
||||
// execute access plan
|
||||
Row *new_row = nullptr;
|
||||
|
||||
|
||||
Table::rows_scanner i = get_iterator(table, node.where.get());
|
||||
while(Row *row = i.next()) {
|
||||
eval_where_on_row(node, table, row, result.get(), new_row, result_tbl_col_defs, source_table_col_index, is_aggregated);
|
||||
if (eval_where(node.where.get(), table, *row)) { // put it into row_scanner.next
|
||||
select_row(node, table, row, result.get(), result_tbl_col_defs, source_table_col_index, is_aggregated);
|
||||
}
|
||||
}
|
||||
|
||||
execute_distinct(node, result.get());
|
||||
|
||||
Reference in New Issue
Block a user