Github user HanumathRao commented on a diff in the pull request:

    https://github.com/apache/drill/pull/1152#discussion_r174558288
  
    --- Diff: 
exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillFilterItemStarReWriterRule.java
 ---
    @@ -54,83 +44,189 @@
     import static 
org.apache.drill.exec.planner.logical.FieldsReWriterUtil.FieldsReWriter;
     
     /**
    - * Rule will transform filter -> project -> scan call with item star 
fields in filter
    - * into project -> filter -> project -> scan where item star fields are 
pushed into scan
    - * and replaced with actual field references.
    + * Rule will transform item star fields in filter and replaced with actual 
field references.
      *
      * This will help partition pruning and push down rules to detect fields 
that can be pruned or push downed.
      * Item star operator appears when sub-select or cte with star are used as 
source.
      */
    -public class DrillFilterItemStarReWriterRule extends RelOptRule {
    +public class DrillFilterItemStarReWriterRule {
     
    -  public static final DrillFilterItemStarReWriterRule INSTANCE = new 
DrillFilterItemStarReWriterRule(
    -      RelOptHelper.some(Filter.class, RelOptHelper.some(Project.class, 
RelOptHelper.any( TableScan.class))),
    -      "DrillFilterItemStarReWriterRule");
    +  public static final DrillFilterItemStarReWriterRule.ProjectOnScan 
PROJECT_ON_SCAN = new ProjectOnScan(
    +          RelOptHelper.some(DrillProjectRel.class, 
RelOptHelper.any(DrillScanRel.class)),
    +          "DrillFilterItemStarReWriterRule.ProjectOnScan");
     
    -  private DrillFilterItemStarReWriterRule(RelOptRuleOperand operand, 
String id) {
    -    super(operand, id);
    -  }
    +  public static final DrillFilterItemStarReWriterRule.FilterOnScan 
FILTER_ON_SCAN = new FilterOnScan(
    +      RelOptHelper.some(DrillFilterRel.class, 
RelOptHelper.any(DrillScanRel.class)),
    +      "DrillFilterItemStarReWriterRule.FilterOnScan");
     
    -  @Override
    -  public void onMatch(RelOptRuleCall call) {
    -    Filter filterRel = call.rel(0);
    -    Project projectRel = call.rel(1);
    -    TableScan scanRel = call.rel(2);
    +  public static final DrillFilterItemStarReWriterRule.FilterOnProject 
FILTER_ON_PROJECT = new FilterOnProject(
    +      RelOptHelper.some(DrillFilterRel.class, 
RelOptHelper.some(DrillProjectRel.class, RelOptHelper.any(DrillScanRel.class))),
    +      "DrillFilterItemStarReWriterRule.FilterOnProject");
     
    -    ItemStarFieldsVisitor itemStarFieldsVisitor = new 
ItemStarFieldsVisitor(filterRel.getRowType().getFieldNames());
    -    filterRel.getCondition().accept(itemStarFieldsVisitor);
     
    -    // there are no item fields, no need to proceed further
    -    if (!itemStarFieldsVisitor.hasItemStarFields()) {
    -      return;
    +  private static class ProjectOnScan extends RelOptRule {
    +
    +    ProjectOnScan(RelOptRuleOperand operand, String id) {
    +      super(operand, id);
         }
     
    -    Map<String, DesiredField> itemStarFields = 
itemStarFieldsVisitor.getItemStarFields();
    +    @Override
    +    public boolean matches(RelOptRuleCall call) {
    +      DrillScanRel scan = call.rel(1);
    +      return scan.getGroupScan() instanceof ParquetGroupScan && 
super.matches(call);
    +    }
     
    -    // create new scan
    -    RelNode newScan = constructNewScan(scanRel, itemStarFields.keySet());
    +    @Override
    +    public void onMatch(RelOptRuleCall call) {
    +      DrillProjectRel projectRel = call.rel(0);
    +      DrillScanRel scanRel = call.rel(1);
    +
    +      ItemStarFieldsVisitor itemStarFieldsVisitor = new 
ItemStarFieldsVisitor(scanRel.getRowType().getFieldNames());
    +      List<RexNode> projects = projectRel.getProjects();
    +      for (RexNode project : projects) {
    +        project.accept(itemStarFieldsVisitor);
    +      }
     
    -    // combine original and new projects
    -    List<RexNode> newProjects = new ArrayList<>(projectRel.getProjects());
    +      Map<String, DesiredField> itemStarFields = 
itemStarFieldsVisitor.getItemStarFields();
     
    -    // prepare node mapper to replace item star calls with new input field 
references
    -    Map<RexNode, Integer> fieldMapper = new HashMap<>();
    +      // if there are no item fields, no need to proceed further
    +      if (itemStarFieldsVisitor.hasNoItemStarFields()) {
    --- End diff --
    
    Can this be moved to before getItemStarFields call?.


---

Reply via email to