Github user jacques-n commented on a diff in the pull request:

    https://github.com/apache/drill/pull/401#discussion_r54840816
  
    --- Diff: 
exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DefaultSqlHandler.java
 ---
    @@ -273,12 +282,90 @@ public RelNode visit(RelNode other) {
     
       }
     
    +  /**
    +   * Transform RelNode to a new RelNode without changing any traits. Also 
will log the outcome.
    +   *
    +   * @param plannerType
    +   *          The type of Planner to use.
    +   * @param phase
    +   *          The transformation phase we're running.
    +   * @param input
    +   *          The origianl RelNode
    +   * @return The transformed relnode.
    +   */
    +  private RelNode transform(PlannerType plannerType, PlannerPhase phase, 
RelNode input) {
    +    return transform(plannerType, phase, input, input.getTraitSet());
    +  }
    +
    +  /**
    +   * Transform RelNode to a new RelNode, targeting the provided set of 
traits. Also will log the outcome.
    +   *
    +   * @param plannerType
    +   *          The type of Planner to use.
    +   * @param phase
    +   *          The transformation phase we're running.
    +   * @param input
    +   *          The origianl RelNode
    +   * @param targetTraits
    +   *          The traits we are targeting for output.
    +   * @return The transformed relnode.
    +   */
    +  protected RelNode transform(PlannerType plannerType, PlannerPhase phase, 
RelNode input, RelTraitSet targetTraits) {
    +    final Stopwatch watch = Stopwatch.createStarted();
    +    final RuleSet rules = config.getRules(phase);
    +    final RelTraitSet toTraits = targetTraits.simplify();
    +
    +    final RelNode output;
    +    switch (plannerType) {
    +    case HEP_BOTTOM_UP:
    +    case HEP: {
    +      final HepProgramBuilder hepPgmBldr = new HepProgramBuilder();
    +      if (plannerType == PlannerType.HEP_BOTTOM_UP) {
    +        hepPgmBldr.addMatchOrder(HepMatchOrder.BOTTOM_UP);
    +      }
    +      for (RelOptRule rule : rules) {
    +        hepPgmBldr.addRuleInstance(rule);
    +      }
    +
    +      final HepPlanner planner = new HepPlanner(hepPgmBldr.build(), 
context.getPlannerSettings());
    +
    +      final List<RelMetadataProvider> list = Lists.newArrayList();
    +      list.add(DrillDefaultRelMetadataProvider.INSTANCE);
    +      planner.registerMetadataProviders(list);
    +      final RelMetadataProvider cachingMetaDataProvider = new 
CachingRelMetadataProvider(
    +          ChainedRelMetadataProvider.of(list), planner);
    +
    +      // Modify RelMetaProvider for every RelNode in the SQL operator Rel 
tree.
    +      input.accept(new MetaDataProviderModifier(cachingMetaDataProvider));
    +      planner.setRoot(input);
    +      if (!input.getTraitSet().equals(targetTraits)) {
    --- End diff --
    
    Those lines are only used if we do trait changes with HEP. Currently, we 
never do a traitChange planning cycle using HEP. That being said, I think we 
should explore it in the future to improve performance. I think there are other 
fixes that would need to be done to take advantage of this but this is here so 
that the interface works no matter the planner.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to