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",
|
||||
"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
26
row.cpp
|
|
@ -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
2
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];
|
||||
|
|
|
|||
44
usql.cpp
44
usql.cpp
|
|
@ -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());
|
||||
|
|
|
|||
Loading…
Reference in New Issue