Untitled
unknown
c_cpp
2 years ago
10 kB
5
Indexable
//===----------------------------------------------------------------------===// // // BusTub // // nested_loop_join_executor.cpp // // Identification: src/execution/nested_loop_join_executor.cpp // // Copyright (c) 2015-2021, Carnegie Mellon University Database Group // //===----------------------------------------------------------------------===// #include "execution/executors/nested_loop_join_executor.h" // #include <_types/_uint32_t.h> #include "binder/table_ref/bound_join_ref.h" #include "common/exception.h" #include "type/value_factory.h" namespace bustub { NestedLoopJoinExecutor::NestedLoopJoinExecutor(ExecutorContext *exec_ctx, const NestedLoopJoinPlanNode *plan, std::unique_ptr<AbstractExecutor> &&left_executor, std::unique_ptr<AbstractExecutor> &&right_executor) : AbstractExecutor(exec_ctx) { if (!(plan->GetJoinType() == JoinType::LEFT || plan->GetJoinType() == JoinType::INNER)) { // Note for 2023 Fall: You ONLY need to implement left join and inner join. throw bustub::NotImplementedException(fmt::format("join type {} not supported", plan->GetJoinType())); } plan_ = plan; left_exec_ = std::move(left_executor); right_exec_ = std::move(right_executor); // left_valid_ = false; // right_position_ = 0; // left_match_ = false; } void NestedLoopJoinExecutor::Init() { left_exec_->Init(); right_exec_->Init(); ever_ = false; std::cout << "In Nested Loop Join" << std::endl; // right_tuples_.clear(); // left_valid_ = left_exec_->Next(&left_tuple_, &left_rid_); // right_position_ = 0; // left_match_ = false; // Tuple right_tuple; // RID right_rid; // while(right_exec_->Next(&right_tuple, &right_rid)){ // right_tuples_.push_back(right_tuple); // } } auto NestedLoopJoinExecutor::Next(Tuple *tuple, RID *rid) -> bool { if (ever_) { goto HERE; } ever_ = true; left_exec_->Init(); while (true) { left_valid_ = left_exec_->Next(&left_tuple_, &left_rid_); if (!left_valid_) { return false; } right_exec_->Init(); found_ = false; while (true) { right_valid_ = right_exec_->Next(&right_tuple_, &right_rid_); syield_ = false; if (!right_valid_) { if (!found_ && plan_->GetJoinType() == JoinType::LEFT) { syield_ = true; // tyield_ values_.clear(); for (uint32_t i = 0; i < left_exec_->GetOutputSchema().GetColumnCount(); i++) { values_.push_back(left_tuple_.GetValue(&left_exec_->GetOutputSchema(), i)); } for (uint32_t i = 0; i < right_exec_->GetOutputSchema().GetColumnCount(); i++) { auto type = right_exec_->GetOutputSchema().GetColumn(i).GetType(); values_.push_back(ValueFactory::GetNullValueByType(type)); } { Tuple new_tuple(values_, &plan_->OutputSchema()); *tuple = new_tuple; *rid = new_tuple.GetRid(); } } } else if (plan_->predicate_ != nullptr && plan_->Predicate()->ToString() == "true") { // added std::cout << "&&&&&&&&& 1 == 1 case in nested loop join" << std::endl; found_ = true; syield_ = true; // tyield_ values_.clear(); for (uint32_t i = 0; i < left_exec_->GetOutputSchema().GetColumnCount(); i++) { values_.push_back(left_tuple_.GetValue(&left_exec_->GetOutputSchema(), i)); std::cout << left_tuple_.GetValue(&left_exec_->GetOutputSchema(), i).GetAs<int>() << std::endl; } for (uint32_t i = 0; i < right_exec_->GetOutputSchema().GetColumnCount(); i++) { values_.push_back(right_tuple_.GetValue(&right_exec_->GetOutputSchema(), i)); std::cout << right_tuple_.GetValue(&right_exec_->GetOutputSchema(), i).GetAs<int>() << std::endl; } { Tuple new_tuple(values_, &plan_->OutputSchema()); *tuple = new_tuple; *rid = new_tuple.GetRid(); } } else if (plan_->predicate_ == nullptr || plan_->predicate_ ->EvaluateJoin(&left_tuple_, left_exec_->GetOutputSchema(), &right_tuple_, right_exec_->GetOutputSchema()) .GetAs<bool>()) { std::cout << "==============" << plan_->Predicate()->ToString() << std::endl; std::cout << "Left plan = " << plan_->GetLeftPlan()->ToString() << std::endl; std::cout << "Right plan = " << plan_->GetRightPlan()->ToString() << std::endl; if(plan_->predicate_ == nullptr){ std::cout << "NestedLoopJoin predicate is empty!! should make it 1 == 1" << std::endl; } if(plan_->Predicate()->ToString() == "true"){ std::cout << "Predicate is true +++++++++++++++++++=" << std::endl; } found_ = true; syield_ = true; // tyield_ values_.clear(); for (uint32_t i = 0; i < left_exec_->GetOutputSchema().GetColumnCount(); i++) { values_.push_back(left_tuple_.GetValue(&left_exec_->GetOutputSchema(), i)); std::cout << left_tuple_.GetValue(&left_exec_->GetOutputSchema(), i).GetAs<int>() << std::endl; } for (uint32_t i = 0; i < right_exec_->GetOutputSchema().GetColumnCount(); i++) { values_.push_back(right_tuple_.GetValue(&right_exec_->GetOutputSchema(), i)); std::cout << right_tuple_.GetValue(&right_exec_->GetOutputSchema(), i).GetAs<int>() << std::endl; } { Tuple new_tuple(values_, &plan_->OutputSchema()); *tuple = new_tuple; *rid = new_tuple.GetRid(); } } if (syield_) { return true; } HERE: if (!right_valid_) { break; } } } // return false; // if(right_tuples_.empty()){ // // TODO(chien-yu-liu): if left join, emit null // if(plan_->GetJoinType() == JoinType::LEFT){ // if(!left_valid_){ // return false; // } // std::vector<Value> values; // for(uint32_t i = 0; i < left_exec_->GetOutputSchema().GetColumnCount(); i++){ // values.push_back(left_tuple_.GetValue(&left_exec_->GetOutputSchema(), i)); // } // for(uint32_t i = 0; i < right_exec_->GetOutputSchema().GetColumnCount(); i++){ // auto type = right_exec_->GetOutputSchema().GetColumn(i).GetType(); // values.push_back(ValueFactory::GetNullValueByType(type)); // } // Tuple new_tuple(values, &plan_->OutputSchema()); // *tuple = new_tuple; // *rid = new_tuple.GetRid(); // left_valid_ = left_exec_->Next(&left_tuple_, &left_rid_); // return true; // } // return false; // } // while(left_valid_){ // Tuple right_tuple; // right_tuple = right_tuples_[right_position_]; // if(plan_->predicate_ == nullptr || plan_->predicate_->EvaluateJoin(&left_tuple_, left_exec_->GetOutputSchema(), // &right_tuple, right_exec_->GetOutputSchema()).GetAs<bool>()){ // left_match_ = true; // // TODO(chien-yu-liu): emit // std::vector<Value> values; // for(uint32_t i = 0; i < left_exec_->GetOutputSchema().GetColumnCount(); i++){ // values.push_back(left_tuple_.GetValue(&left_exec_->GetOutputSchema(), i)); // } // for(uint32_t i = 0; i < right_exec_->GetOutputSchema().GetColumnCount(); i++){ // values.push_back(right_tuple.GetValue(&right_exec_->GetOutputSchema(), i)); // } // Tuple new_tuple(values, &plan_->OutputSchema()); // *tuple = new_tuple; // *rid = new_tuple.GetRid(); // right_position_++; // if(right_position_ == static_cast<int>(right_tuples_.size())){ // right_position_ = 0; // left_valid_ = left_exec_->Next(&left_tuple_, &left_rid_); // left_match_ = false; // } // return true; // } // right_position_++; // if(right_position_ == static_cast<int>(right_tuples_.size())){ // right_position_ = 0; // bool emit = false; // if(!left_match_ && plan_->GetJoinType() == JoinType::LEFT){ // // TODO(chien-yu-liu): Emit tuple (with right being null) // std::vector<Value> values; // for(uint32_t i = 0; i < left_exec_->GetOutputSchema().GetColumnCount(); i++){ // values.push_back(left_tuple_.GetValue(&left_exec_->GetOutputSchema(), i)); // } // for(uint32_t i = 0; i < right_exec_->GetOutputSchema().GetColumnCount(); i++){ // auto type = right_exec_->GetOutputSchema().GetColumn(i).GetType(); // values.push_back(ValueFactory::GetNullValueByType(type)); // } // Tuple new_tuple(values, &plan_->OutputSchema()); // *tuple = new_tuple; // *rid = new_tuple.GetRid(); // emit = true; // } // left_valid_ = left_exec_->Next(&left_tuple_, &left_rid_); // left_match_ = false; // if(emit){ // return true; // } // } // } // // Tuple left_tuple; // // RID left_rid; // // std::cout << "test 1" << std::endl; // // while(left_exec_->Next(&left_tuple, &left_rid)){ // // // if(!right_exec_->Next(&right_tuple, &right_rid) && !left_exec_->Next(&left_tuple, &left_rid)){ // // // return false; // // // } // // for(const auto& right_tuple : right_tuples_){ // // if(plan_->predicate_ == nullptr || plan_->predicate_->EvaluateJoin(&left_tuple, // left_exec_->GetOutputSchema(), &right_tuple, right_exec_->GetOutputSchema()).GetAs<bool>()){ // // // std::vector<Value> values(plan_->output_schema_->GetColumnCount()); // // std::vector<Value> values; // // for(uint32_t i = 0; i < plan_->output_schema_->GetColumnCount(); i++){ // // auto value = plan_->predicate_->EvaluateJoin(&left_tuple, left_exec_->GetOutputSchema(), &right_tuple, // right_exec_->GetOutputSchema()); // // values.push_back(value); // // } // // std::cout << "test3" << std::endl; // // std::cout << "values.size() = " << values.size() << std::endl; // // *tuple = Tuple(values, &plan_->OutputSchema()); // // // *tuple = Tuple(values, &plan_->output_schema_); // // return true; // // } // // } // // } // return false; } } // namespace bustub
Editor is loading...
Leave a Comment