From 977a9cd1986b180500bdfc7722db1b06f7140f3f Mon Sep 17 00:00:00 2001 From: VaclavT Date: Thu, 22 Jul 2021 19:28:08 +0200 Subject: [PATCH] small code deduplication --- main.cpp | 1 + row.cpp | 26 ++++++++++++++++++++++++++ row.h | 2 ++ usql.cpp | 44 ++++++++++---------------------------------- 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/main.cpp b/main.cpp index f4aa373..4f080f7 100644 --- a/main.cpp +++ b/main.cpp @@ -34,6 +34,7 @@ int main(int argc, char *argv[]) { "select i, s, f from a where i < 300", "create table x as select i, s, f from a where i < 300", "select i, s, f from x where i < 300", + "select i, s, f from a where i > 300", "select i, to_string(i, '%d.%m.%Y'), s, f from a where i > 300" }; diff --git a/row.cpp b/row.cpp index 44963ef..61c9537 100644 --- a/row.cpp +++ b/row.cpp @@ -51,6 +51,32 @@ namespace usql { m_columns[col_index] = std::make_unique(value); }; + void Row::setColumnValue(ColDefNode *col_def, ColValue *col_value) { + if (!col_value->isNull()) { + if (col_def->type == ColumnType::integer_type) + setColumnValue(col_def->order, col_value->getIntValue()); + else if (col_def->type == ColumnType::float_type) + setColumnValue(col_def->order, col_value->getDoubleValue()); + else if (col_def->type == ColumnType::varchar_type) + setColumnValue(col_def->order, col_value->getStringValue()); + } else { + setColumnNull(col_def->order); + } + } + + void Row::setColumnValue(ColDefNode *col_def, ValueNode *col_value) { + if (!col_value->isNull()) { + if (col_def->type == ColumnType::integer_type) + setColumnValue(col_def->order, col_value->getIntValue()); + else if (col_def->type == ColumnType::float_type) + setColumnValue(col_def->order, col_value->getDoubleValue()); + else if (col_def->type == ColumnType::varchar_type) + setColumnValue(col_def->order, col_value->getStringValue()); + } else { + setColumnNull(col_def->order); + } + } + void Row::print() { for (int ci = 0; ci < m_columns.size(); ci++) { if (ci > 0) std::cout << ","; diff --git a/row.h b/row.h index 5f367e5..be8d0ff 100644 --- a/row.h +++ b/row.h @@ -75,6 +75,8 @@ namespace usql { void setColumnValue(int col_index, long value); void setColumnValue(int col_index, double value); void setColumnValue(int col_index, const std::string &value); + void setColumnValue(ColDefNode *col_def, ColValue *col_value); + void setColumnValue(ColDefNode *col_def, ValueNode *col_value); ColValue &operator[](int i) { return *m_columns[i]; diff --git a/usql.cpp b/usql.cpp index c696eca..2303da0 100644 --- a/usql.cpp +++ b/usql.cpp @@ -81,17 +81,9 @@ std::unique_ptr USql::execute_insert_into_table(InsertIntoTableNode &node // copy values for (size_t i = 0; i < node.cols_names.size(); i++) { ColDefNode col_def = table_def->get_column_def(node.cols_names[i].name); + auto col_value = evalValueNode(table_def, new_row, node.cols_values[i].get()); - // TODO validate value - auto value = evalValueNode(table_def, new_row, node.cols_values[i].get()); - - if (col_def.type == ColumnType::integer_type) { - new_row.setColumnValue(col_def.order, value->getIntValue()); - } else if (col_def.type == ColumnType::float_type) { - new_row.setColumnValue(col_def.order, value->getDoubleValue()); - } else { - new_row.setColumnValue(col_def.order, value->getStringValue()); - } + new_row.setColumnValue(&col_def, col_value.get()); } // append new_row @@ -111,10 +103,10 @@ std::unique_ptr
USql::execute_select(SelectFromTableNode &node) { std::vector source_table_col_index{}; for (int i = 0; i < node.cols_names->size(); i++) { - auto [ src_tbl_col_index, col_def ] = getColumnDefinition(table, &node.cols_names->operator[](i), i); + auto [ src_tbl_col_index, rst_tbl_col_def ] = getColumnDefinition(table, &node.cols_names->operator[](i), i); source_table_col_index.push_back(src_tbl_col_index); - result_tbl_col_defs.push_back(col_def); + result_tbl_col_defs.push_back(rst_tbl_col_def); } auto result = std::make_unique
("result", result_tbl_col_defs); @@ -130,31 +122,14 @@ std::unique_ptr
USql::execute_select(SelectFromTableNode &node) { for (auto idx = 0; idx < result->columns_count(); idx++) { auto row_col_index = source_table_col_index[idx]; - if (row_col_index == -1) { - // todo its function TODO col_names zmenit na colValues + if (row_col_index == -1) { // TODO introduce constant here auto evaluated_value = evalValueNode(table, *row, node.cols_names->operator[](idx).value.get()); ValueNode *col_value = evaluated_value.get(); - if (!col_value->isNull()) { // TODO sjednotit nasledujici - if (result_tbl_col_defs[idx].type == ColumnType::integer_type) - new_row.setColumnValue(idx, col_value->getIntValue()); - if (result_tbl_col_defs[idx].type == ColumnType::float_type) - new_row.setColumnValue(idx, col_value->getDoubleValue()); - if (result_tbl_col_defs[idx].type == ColumnType::varchar_type) - new_row.setColumnValue(idx, col_value->getStringValue()); - } - // TODO set to null + new_row.setColumnValue(&result_tbl_col_defs[idx], col_value); } else { ColValue *col_value = row->ithColumn(row_col_index); - if (!col_value->isNull()) { - if (result_tbl_col_defs[idx].type == ColumnType::integer_type) - new_row.setColumnValue(idx, col_value->getIntValue()); - else if (result_tbl_col_defs[idx].type == ColumnType::float_type) - new_row.setColumnValue(idx, col_value->getDoubleValue()); - else if (result_tbl_col_defs[idx].type == ColumnType::varchar_type) - new_row.setColumnValue(idx, col_value->getStringValue()); - } - // TODO set to null + new_row.setColumnValue(&result_tbl_col_defs[idx], col_value); } } @@ -170,8 +145,9 @@ std::tuple USql::getColumnDefinition(Table *table, SelectColNod std::string new_col_name = select_col_node->name; if (select_col_node->value->node_type == NodeType::column_name) { - ColDefNode cdef = table->get_column_def(new_col_name); - return std::make_tuple(cdef.order, cdef); + ColDefNode src_cdef = table->get_column_def(new_col_name); + ColDefNode cdef = ColDefNode{new_col_name, src_cdef.type, col_order, src_cdef.length, src_cdef.null}; + return std::make_tuple(src_cdef.order, cdef); } else if (select_col_node->value->node_type == NodeType::function) { auto node = static_cast(select_col_node->value.get());