P::PhysicalPtr ReduceGroupByAttributes::apply(const P::PhysicalPtr &input) { DCHECK(input->getPhysicalType() == P::PhysicalType::kTopLevelPlan); cost_model_.reset(new cost::StarSchemaSimpleCostModel( std::static_pointer_cast<const P::TopLevelPlan>(input)->shared_subplans())); P::PhysicalPtr output = applyInternal(input); if (output != input) { output = PruneColumns().apply(output); } return output; }
P::PhysicalPtr InjectJoinFilters::apply(const P::PhysicalPtr &input) { DCHECK(input->getPhysicalType() == P::PhysicalType::kTopLevelPlan); const P::TopLevelPlanPtr top_level_plan = std::static_pointer_cast<const P::TopLevelPlan>(input); cost_model_.reset( new cost::StarSchemaSimpleCostModel( top_level_plan->shared_subplans())); lip_filter_configuration_.reset(new P::LIPFilterConfiguration()); // Step 1. Transform applicable HashJoin nodes to FilterJoin nodes. P::PhysicalPtr output = transformHashJoinToFilters(input); if (output == input) { return input; } // Step 2. If the top level plan is a filter join, wrap it with a Selection // to stabilize output columns. output = wrapSelection(output); // Step 3. Push down FilterJoin nodes to be evaluated early. output = pushDownFilters(output); // Step 4. Add Selection nodes for attaching the LIPFilters, if necessary. output = addFilterAnchors(output, false); // Step 5. Because of the pushdown of FilterJoin nodes, there are optimization // opportunities for projecting columns early. output = PruneColumns().apply(output); // Step 6. For each FilterJoin node, attach its corresponding LIPFilter to // proper nodes. concretizeAsLIPFilters(output, nullptr); if (!lip_filter_configuration_->getBuildInfoMap().empty() || !lip_filter_configuration_->getProbeInfoMap().empty()) { output = std::static_pointer_cast<const P::TopLevelPlan>(output) ->copyWithLIPFilterConfiguration( P::LIPFilterConfigurationPtr(lip_filter_configuration_.release())); } return output; }