small code deduplication
This commit is contained in:
parent
fc5fd32976
commit
977a9cd198
1
main.cpp
1
main.cpp
|
|
@ -34,6 +34,7 @@ int main(int argc, char *argv[]) {
|
||||||
"select i, s, f from a where i < 300",
|
"select i, s, f from a where i < 300",
|
||||||
"create table x as 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 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"
|
"select i, to_string(i, '%d.%m.%Y'), s, f from a where i > 300"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
26
row.cpp
26
row.cpp
|
|
@ -51,6 +51,32 @@ namespace usql {
|
||||||
m_columns[col_index] = std::make_unique<ColStringValue>(value);
|
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() {
|
void Row::print() {
|
||||||
for (int ci = 0; ci < m_columns.size(); ci++) {
|
for (int ci = 0; ci < m_columns.size(); ci++) {
|
||||||
if (ci > 0) std::cout << ",";
|
if (ci > 0) std::cout << ",";
|
||||||
|
|
|
||||||
2
row.h
2
row.h
|
|
@ -75,6 +75,8 @@ namespace usql {
|
||||||
void setColumnValue(int col_index, long value);
|
void setColumnValue(int col_index, long value);
|
||||||
void setColumnValue(int col_index, double value);
|
void setColumnValue(int col_index, double value);
|
||||||
void setColumnValue(int col_index, const std::string &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) {
|
ColValue &operator[](int i) {
|
||||||
return *m_columns[i];
|
return *m_columns[i];
|
||||||
|
|
|
||||||
44
usql.cpp
44
usql.cpp
|
|
@ -81,17 +81,9 @@ std::unique_ptr<Table> USql::execute_insert_into_table(InsertIntoTableNode &node
|
||||||
// copy values
|
// copy values
|
||||||
for (size_t i = 0; i < node.cols_names.size(); i++) {
|
for (size_t i = 0; i < node.cols_names.size(); i++) {
|
||||||
ColDefNode col_def = table_def->get_column_def(node.cols_names[i].name);
|
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
|
new_row.setColumnValue(&col_def, col_value.get());
|
||||||
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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// append new_row
|
// append new_row
|
||||||
|
|
@ -111,10 +103,10 @@ std::unique_ptr<Table> USql::execute_select(SelectFromTableNode &node) {
|
||||||
std::vector<int> source_table_col_index{};
|
std::vector<int> source_table_col_index{};
|
||||||
|
|
||||||
for (int i = 0; i < node.cols_names->size(); i++) {
|
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);
|
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);
|
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++) {
|
for (auto idx = 0; idx < result->columns_count(); idx++) {
|
||||||
auto row_col_index = source_table_col_index[idx];
|
auto row_col_index = source_table_col_index[idx];
|
||||||
|
|
||||||
if (row_col_index == -1) {
|
if (row_col_index == -1) { // TODO introduce constant here
|
||||||
// todo its function TODO col_names zmenit na colValues
|
|
||||||
auto evaluated_value = evalValueNode(table, *row, node.cols_names->operator[](idx).value.get());
|
auto evaluated_value = evalValueNode(table, *row, node.cols_names->operator[](idx).value.get());
|
||||||
ValueNode *col_value = evaluated_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 {
|
} else {
|
||||||
ColValue *col_value = row->ithColumn(row_col_index);
|
ColValue *col_value = row->ithColumn(row_col_index);
|
||||||
if (!col_value->isNull()) {
|
new_row.setColumnValue(&result_tbl_col_defs[idx], col_value);
|
||||||
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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -170,8 +145,9 @@ std::tuple<int, ColDefNode> USql::getColumnDefinition(Table *table, SelectColNod
|
||||||
std::string new_col_name = select_col_node->name;
|
std::string new_col_name = select_col_node->name;
|
||||||
|
|
||||||
if (select_col_node->value->node_type == NodeType::column_name) {
|
if (select_col_node->value->node_type == NodeType::column_name) {
|
||||||
ColDefNode cdef = table->get_column_def(new_col_name);
|
ColDefNode src_cdef = table->get_column_def(new_col_name);
|
||||||
return std::make_tuple(cdef.order, cdef);
|
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) {
|
} else if (select_col_node->value->node_type == NodeType::function) {
|
||||||
auto node = static_cast<FunctionNode *>(select_col_node->value.get());
|
auto node = static_cast<FunctionNode *>(select_col_node->value.get());
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue