PlanContext LogicalFilter::GetPlanContext() { /** In the currently implementation, we assume that the boolean operator * between each AttributeComparator is "AND". */ PlanContext plan_context = child_->GetPlanContext(); if (plan_context.IsHashPartitioned()) { for (unsigned i = 0; i < plan_context.plan_partitioner_.GetNumberOfPartitions(); ++i) { if (CanBeHashPruned(i, plan_context.plan_partitioner_)) { // Is filtered. plan_context.plan_partitioner_.GetPartition(i)->set_filtered(); } else { // Call predictSelectivilty() to alter cardinality. /** * Should predict the volume of data that passes the filter. * TODO(wangli): A precious prediction is needed based on the statistic * of the input data, which may be maintained in the * catalog module. */ const unsigned before_filter_cardinality = plan_context.plan_partitioner_.GetPartition(i)->get_cardinality(); const unsigned after_filter_cardinality = before_filter_cardinality * PredictSelectivity(); plan_context.plan_partitioner_.GetPartition(i) ->set_cardinality(after_filter_cardinality); } } } set_column_id(plan_context); Schema* input_ = GetSchema(plan_context.attribute_list_); for (int i = 0; i < condi_.size(); ++i) { // Initialize expression of logical execution plan. InitExprAtLogicalPlan(condi_[i], t_boolean, column_id_, input_); } return plan_context; }
PlanContext LogicalFilter::GetPlanContext() { /** In the currently implementation, we assume that the boolean operator * between each AttributeComparator is "AND". */ lock_->acquire(); if (NULL != plan_context_) { lock_->release(); return *plan_context_; } PlanContext plan_context = child_->GetPlanContext(); if (plan_context.IsHashPartitioned()) { for (unsigned i = 0; i < plan_context.plan_partitioner_.GetNumberOfPartitions(); ++i) { if (CanBeHashPruned(i, plan_context.plan_partitioner_)) { // Is filtered. plan_context.plan_partitioner_.GetPartition(i)->set_filtered(); } else { // Call predictSelectivilty() to alter cardinality. /** * Should predict the volume of data that passes the filter. * TODO(wangli): A precious prediction is needed based on the statistic * of the input data, which may be maintained in the * catalog module. */ const unsigned before_filter_cardinality = plan_context.plan_partitioner_.GetPartition(i)->get_cardinality(); const unsigned after_filter_cardinality = before_filter_cardinality * PredictSelectivity(); plan_context.plan_partitioner_.GetPartition(i) ->set_cardinality(after_filter_cardinality); } } } // std::map<std::string, int> column_to_id; // GetColumnToId(plan_context.attribute_list_, column_to_id); // Schema* input_schema = GetSchema(plan_context.attribute_list_); #ifdef NEWCONDI for (int i = 0; i < condi_.size(); ++i) { // Initialize expression of logical execution plan. InitExprAtLogicalPlan(condi_[i], t_boolean, column_to_id, input_schema); } #else LogicInitCnxt licnxt; GetColumnToId(plan_context.attribute_list_, licnxt.column_id0_); licnxt.schema0_ = plan_context.GetSchema(); for (int i = 0; i < condition_.size(); ++i) { licnxt.return_type_ = t_boolean; condition_[i]->InitExprAtLogicalPlan(licnxt); } #endif plan_context_ = new PlanContext(); *plan_context_ = plan_context; plan_context_->attribute_list_.assign(plan_context.attribute_list_.begin(), plan_context.attribute_list_.end()); lock_->release(); return *plan_context_; }