small code deduplication

This commit is contained in:
VaclavT 2021-07-22 19:28:08 +02:00
parent fc5fd32976
commit 977a9cd198
4 changed files with 39 additions and 34 deletions

View File

@ -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"
};

26
row.cpp
View File

@ -51,6 +51,32 @@ namespace usql {
m_columns[col_index] = std::make_unique<ColStringValue>(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 << ",";

2
row.h
View File

@ -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];

View File

@ -81,17 +81,9 @@ std::unique_ptr<Table> 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<Table> USql::execute_select(SelectFromTableNode &node) {
std::vector<int> 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<Table>("result", result_tbl_col_defs);
@ -130,31 +122,14 @@ std::unique_ptr<Table> 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<int, ColDefNode> 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<FunctionNode *>(select_col_node->value.get());