You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@drill.apache.org by GitBox <gi...@apache.org> on 2019/08/23 16:29:50 UTC

[GitHub] [drill] vvysotskyi commented on a change in pull request #1847: DRILL-7253: Read Hive struct w/o nulls

vvysotskyi commented on a change in pull request #1847: DRILL-7253: Read Hive struct w/o nulls
URL: https://github.com/apache/drill/pull/1847#discussion_r317206684
 
 

 ##########
 File path: exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/SplitUpComplexExpressions.java
 ##########
 @@ -44,103 +44,108 @@
 
 public class SplitUpComplexExpressions extends BasePrelVisitor<Prel, Object, RelConversionException> {
 
-  RelDataTypeFactory factory;
-  DrillOperatorTable table;
-  FunctionImplementationRegistry funcReg;
+  private final RelDataTypeFactory factory;
+  private final RexBuilder rexBuilder;
+  private final FunctionImplementationRegistry funcReg;
 
-  public SplitUpComplexExpressions(RelDataTypeFactory factory, DrillOperatorTable table, FunctionImplementationRegistry funcReg) {
-    super();
+  public SplitUpComplexExpressions(RelDataTypeFactory factory, FunctionImplementationRegistry funcReg, RexBuilder rexBuilder) {
     this.factory = factory;
-    this.table = table;
     this.funcReg = funcReg;
+    this.rexBuilder = rexBuilder;
   }
 
   @Override
-  public Prel visitPrel(Prel prel, Object value) throws RelConversionException {
-    List<RelNode> children = Lists.newArrayList();
-    for(Prel child : prel){
-      child = child.accept(this, null);
+  public Prel visitPrel(Prel prel, Object unused) throws RelConversionException {
+    List<RelNode> children = new ArrayList<>();
+    for (Prel child : prel) {
+      child = child.accept(this, unused);
       children.add(child);
     }
     return (Prel) prel.copy(prel.getTraitSet(), children);
   }
 
 
   @Override
-  public Prel visitProject(ProjectPrel project, Object unused) throws RelConversionException {
+  public Prel visitProject(final ProjectPrel project, Object unused) throws RelConversionException {
+    final Prel oldInput = (Prel) project.getInput(0);
+    RelNode newInput = oldInput.accept(this, unused);
 
-    // Apply the rule to the child
-    RelNode originalInput = ((Prel)project.getInput(0)).accept(this, null);
-    project = (ProjectPrel) project.copy(project.getTraitSet(), Lists.newArrayList(originalInput));
-
-    List<RexNode> exprList = new ArrayList<>();
-
-    List<RelDataTypeField> relDataTypes = new ArrayList<>();
-    List<RelDataTypeField> origRelDataTypes = new ArrayList<>();
-    int i = 0;
-    final int lastColumnReferenced = PrelUtil.getLastUsedColumnReference(project.getProjects());
+    ProjectPrel newProject = (ProjectPrel) project.copy(project.getTraitSet(), Lists.newArrayList(newInput));
 
+    final int lastColumnReferenced = PrelUtil.getLastUsedColumnReference(newProject.getProjects());
     if (lastColumnReferenced == -1) {
-      return project;
+      return newProject;
     }
 
-    final int lastRexInput = lastColumnReferenced + 1;
-    RexVisitorComplexExprSplitter exprSplitter = new RexVisitorComplexExprSplitter(factory, funcReg, lastRexInput);
 
-    for (RexNode rex : project.getChildExps()) {
-      origRelDataTypes.add(project.getRowType().getFieldList().get(i));
-      i++;
-      exprList.add(rex.accept(exprSplitter));
+    List<RelDataTypeField> projectFields = newProject.getRowType().getFieldList();
+    List<RelDataTypeField> origRelDataTypes = new ArrayList<>();
+    List<RexNode> exprList = new ArrayList<>();
+    final int lastRexInput = lastColumnReferenced + 1;
+    RexVisitorComplexExprSplitter exprSplitter = new RexVisitorComplexExprSplitter(funcReg, rexBuilder, lastRexInput);
+    int i = 0;
+    for (RexNode rex : newProject.getChildExps()) {
+      RelDataTypeField originField = projectFields.get(i++);
+      RexNode splitRex = rex.accept(exprSplitter);
+      origRelDataTypes.add(originField);
+      exprList.add(splitRex);
     }
-    List<RexNode> complexExprs = exprSplitter.getComplexExprs();
 
-    if (complexExprs.size() == 1 && findTopComplexFunc(project.getChildExps()).size() == 1) {
-      return project;
+    final List<RexNode> complexExprs = exprSplitter.getComplexExprs();
+    if (complexExprs.size() == 1 && findTopComplexFunc(newProject.getChildExps()).size() == 1) {
+      return newProject;
     }
 
-    ProjectPrel childProject;
 
-    List<RexNode> allExprs = new ArrayList<>();
-    int exprIndex = 0;
-    List<String> fieldNames = originalInput.getRowType().getFieldNames();
-    for (int index = 0; index < lastRexInput; index++) {
-      RexBuilder builder = new RexBuilder(factory);
-      allExprs.add(builder.makeInputRef( new RelDataTypeDrillImpl(new RelDataTypeHolder(), factory), index));
 
-      if (fieldNames.get(index).contains(SchemaPath.DYNAMIC_STAR)) {
-        relDataTypes.add(new RelDataTypeFieldImpl(fieldNames.get(index), allExprs.size(), factory.createSqlType(SqlTypeName.ANY)));
-      } else {
-        relDataTypes.add(new RelDataTypeFieldImpl("EXPR$" + exprIndex, allExprs.size(), factory.createSqlType(SqlTypeName.ANY)));
-        exprIndex++;
-      }
-    }
-    RexNode currRexNode;
-    int index = lastRexInput - 1;
 
     // if the projection expressions contained complex outputs, split them into their own individual projects
     if (complexExprs.size() > 0 ) {
+      List<RexNode> allExprs = new ArrayList<>();
+      int exprIndex = 0;
+      List<String> fieldNames = newInput.getRowType().getFieldNames();
+
+      List<RelDataTypeField> relDataTypes = new ArrayList<>();
+      for (int index = 0; index < lastRexInput; index++) {
+        allExprs.add(rexBuilder.makeInputRef( new RelDataTypeDrillImpl(new RelDataTypeHolder(), factory), index));
+
+        if (fieldNames.get(index).contains(SchemaPath.DYNAMIC_STAR)) {
+          relDataTypes.add(new RelDataTypeFieldImpl(fieldNames.get(index), allExprs.size(), factory.createSqlType(SqlTypeName.ANY)));
+        } else {
+          relDataTypes.add(new RelDataTypeFieldImpl("EXPR$" + exprIndex, allExprs.size(), factory.createSqlType(SqlTypeName.ANY)));
+          exprIndex++;
+        }
+      }
+      RexNode currRexNode;
+      int index = lastRexInput - 1;
       while (complexExprs.size() > 0) {
         if ( index >= lastRexInput ) {
-          allExprs.remove(allExprs.size() - 1);
-          RexBuilder builder = new RexBuilder(factory);
-          allExprs.add(builder.makeInputRef( new RelDataTypeDrillImpl(new RelDataTypeHolder(), factory), index));
+          RexInputRef newLastRex = rexBuilder.makeInputRef(new RelDataTypeDrillImpl(new RelDataTypeHolder(), factory), index);
+          // replace last rex with new one
+          allExprs.set(allExprs.size() - 1, newLastRex);
         }
         index++;
         exprIndex++;
 
         currRexNode = complexExprs.remove(0);
         allExprs.add(currRexNode);
         relDataTypes.add(new RelDataTypeFieldImpl("EXPR$" + exprIndex, allExprs.size(), factory.createSqlType(SqlTypeName.ANY)));
-        childProject = new ProjectPrel(project.getCluster(), project.getTraitSet(), originalInput, ImmutableList.copyOf(allExprs), new RelRecordType(relDataTypes));
-        originalInput = childProject;
+
+        RelRecordType childProjectType = new RelRecordType(relDataTypes);
+        ProjectPrel childProject  = new ProjectPrel(newProject.getCluster(), newProject.getTraitSet(), newInput, ImmutableList.copyOf(allExprs), childProjectType);
+        newInput = childProject;
       }
+
       // copied from above, find a better way to do this
       allExprs.remove(allExprs.size() - 1);
-      RexBuilder builder = new RexBuilder(factory);
-      allExprs.add(builder.makeInputRef( new RelDataTypeDrillImpl(new RelDataTypeHolder(), factory), index));
+      allExprs.add(rexBuilder.makeInputRef( new RelDataTypeDrillImpl(new RelDataTypeHolder(), factory), index));
 
 Review comment:
   ```suggestion
         allExprs.add(rexBuilder.makeInputRef(new RelDataTypeDrillImpl(new RelDataTypeHolder(), factory), index));
   ```

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services