Skip to content

Commit

Permalink
feat: 完成了enable_null中的各种操作
Browse files Browse the repository at this point in the history
包括表的创建,数据的插入、更新、删除、查询。
以及聚合函数对于NULL值的处理。

Signed-off-by: shala <357447923@qq.com>
  • Loading branch information
357447923 committed Sep 24, 2023
1 parent f847a73 commit 546c542
Show file tree
Hide file tree
Showing 14 changed files with 306 additions and 239 deletions.
1 change: 1 addition & 0 deletions src/observer/sql/executor/load_data_executor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ RC insert_record_from_file(Table *table,

if (RC::SUCCESS == rc) {
Record record;

rc = table->make_record(field_num, record_values.data(), record);
if (rc != RC::SUCCESS) {
errmsg << "insert failed.";
Expand Down
24 changes: 18 additions & 6 deletions src/observer/sql/expr/expression.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,25 +91,37 @@ RC ComparisonExpr::compare_value(const Value &left, const Value &right, bool &re
RC rc = RC::SUCCESS;
RC cmp_result = left.compare(right);
result = false;
const bool comp_can_cmp = cmp_result != RC::LEFT_CAN_NOT_CMP_TO_ANOTHER;

switch (comp_) {
case EQUAL_TO: {
result = (RC::LEFT_EQ_ANOTHER == cmp_result);
result = comp_can_cmp && (RC::LEFT_EQ_ANOTHER == cmp_result);
} break;
case LESS_EQUAL: {
result = (cmp_result == RC::LEFT_LT_ANOTHER || cmp_result == RC::LEFT_EQ_ANOTHER);
result = comp_can_cmp && (cmp_result == RC::LEFT_LT_ANOTHER || cmp_result == RC::LEFT_EQ_ANOTHER);
} break;
case NOT_EQUAL: {
result = (cmp_result != RC::LEFT_EQ_ANOTHER);
result = comp_can_cmp && (cmp_result != RC::LEFT_EQ_ANOTHER);
} break;
case LESS_THAN: {
result = (cmp_result == RC::LEFT_LT_ANOTHER);
result = comp_can_cmp && (cmp_result == RC::LEFT_LT_ANOTHER);
} break;
case GREAT_EQUAL: {
result = (cmp_result == RC::LEFT_GT_ANOTHER || cmp_result == RC::LEFT_GT_ANOTHER);
result = comp_can_cmp && (cmp_result == RC::LEFT_GT_ANOTHER || cmp_result == RC::LEFT_EQ_ANOTHER);
} break;
case GREAT_THAN: {
result = (cmp_result == RC::LEFT_GT_ANOTHER);
result = comp_can_cmp && (cmp_result == RC::LEFT_GT_ANOTHER);
} break;
case IS_NULL: {
AttrType left_type = left.attr_type();
AttrType right_type = right.attr_type();
result = left_type == right_type && left_type == NULLS;
}break;
case NOT_NULL: {
AttrType left_type = left.attr_type();
AttrType right_type = right.attr_type();
result = (left_type == NULLS || right_type == NULLS) && (left_type != NULLS || right_type != NULLS);
}break;
default: {
LOG_WARN("unsupported comparison. %d", comp_);
rc = RC::INTERNAL;
Expand Down
2 changes: 1 addition & 1 deletion src/observer/sql/expr/tuple.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ class RowTuple : public Tuple
FieldExpr *field_expr = speces_[index];
const FieldMeta *field_meta = field_expr->field().meta();
cell.set_type(field_meta->type());
cell.set_data(this->record_->data() + this->record_->bitmap_len() + field_meta->offset(), field_meta->len());
cell.set_data(data + field_meta->offset(), field_meta->len());
}
return RC::SUCCESS;
}
Expand Down
1 change: 1 addition & 0 deletions src/observer/sql/operator/insert_physical_operator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ RC InsertPhysicalOperator::open(Trx *trx)
// 初始化所有的记录
for (int i = 0; i < count; i++) {
Record record;
const Value &value = values_->operator[](i)[0];
rc = table_->make_record(values_->operator[](i).size(), values_->operator[](i).data(), record);
if (rc != RC::SUCCESS) {
LOG_WARN("failed to make record. rc=%s", strrc(rc));
Expand Down
77 changes: 47 additions & 30 deletions src/observer/sql/operator/project_physical_operator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,61 +60,78 @@ Tuple *ProjectPhysicalOperator::current_tuple()
}
}
}
// TODO 可能做了一些没有必要的计算,可以考虑进行修改
if (!(*is_none_func_)) {
RC rc = RC::SUCCESS;
const std::vector<TupleCellSpec *> &speces = tuple_.speces();
std::vector<Value> values;
Tuple *tuple = children_[0]->current_tuple();
int size = 1;
// 用来存储给avg使用的被除数
std::unordered_map<Value *, int> value_size;
const std::vector<AggFuncType> &func_types = tuple_.func_types();
// 先把当前tuple中的数据取出
for (int i = 0; i < speces.size(); i++) {
Value tmp;
tuple->find_cell(*speces[i], tmp);
values.push_back(tmp);
// 把为count聚合函数的初始值赋值
if (func_types[i] == FUNC_COUNT) {
values[i].set_int(values[i].attr_type() == NULLS? 0: 1);
}else if (func_types[i] == FUNC_AVG) {
value_size.insert(std::pair<Value *, int>(&values[i], values[i].attr_type() == NULLS? 0: 1));
}
}
while((rc = next()) == RC::SUCCESS) {
size++;
Tuple *tuple = children_[0]->current_tuple();
for(int i = 0; i < speces.size(); i++) {
Value tmp;
tuple->find_cell(*speces[i], tmp);
switch (tuple_.func_types()[i]) {
case FUNC_MAX: {
if (values[i].compare(tmp) == RC::LEFT_LT_ANOTHER) {
values[i].set_value(tmp);
}
};break;
case FUNC_MIN: {
if (values[i].compare(tmp) == RC::LEFT_GT_ANOTHER) {
values[i].set_value(tmp);
// 为NULL值的数据不参与计算
if (tmp.attr_type() != NULLS) {
switch (tuple_.func_types()[i]) {
case FUNC_MAX: {
if (values[i].compare(tmp) == RC::LEFT_LT_ANOTHER) {
values[i].set_value(tmp);
}
};break;
case FUNC_MIN: {
if (values[i].compare(tmp) == RC::LEFT_GT_ANOTHER) {
values[i].set_value(tmp);
}
}break;
case FUNC_AVG: {
if (tmp.attr_type() == FLOATS) {
values[i].set_float(values[i].get_float() + tmp.get_float());
}else {
values[i].set_int(values[i].get_int() + tmp.get_int());
}
}break;
case FUNC_COUNT: {
values[i].set_int(values[i].get_int() + 1);
}break;
default:{
LOG_WARN("Unacceptable aggregate func");
}break;
}
}break;
case FUNC_AVG: {
if (tmp.attr_type() == FLOATS) {
values[i].set_float(values[i].get_float() + tmp.get_float());
}else {
values[i].set_int(values[i].get_int() + tmp.get_int());
}
}break;
case FUNC_COUNT: break;
default:{
LOG_WARN("Unacceptable aggregate func");
}break;
}

}
}

// 计算count和avg
for (int i = 0; i < speces.size(); i++) {
if (tuple_.func_types()[i] == FUNC_AVG) {
if (func_types[i] == FUNC_AVG) {

Value &val = values[i];
if (val.attr_type() == AttrType::INTS) {
values[i].set_int((float)values[i].get_int() / size);
}else {
AttrType type = val.attr_type();
int size = value_size[&val];
if (size > 0 && (type == AttrType::INTS || type == AttrType::FLOATS)) {
values[i].set_float(values[i].get_float() / size);
}else {
values[i].set_type(NULLS);
}
}else if (tuple_.func_types()[i] == FUNC_COUNT) {
values[i].set_int(size);
}
}
// 把聚合好的数据装入value_list中
ValueListTuple *value_list = new ValueListTuple;
value_list->set_cells(values);
tuple_.set_tuple(value_list);
Expand Down
Loading

0 comments on commit 546c542

Please sign in to comment.