[ 
https://issues.apache.org/jira/browse/DRILL-7253?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16914445#comment-16914445
 ] 

ASF GitHub Bot commented on DRILL-7253:
---------------------------------------

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

 ##########
 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)));
 
 Review comment:
   Please use `SqlValidatorUtil.EXPR_SUGGESTER`:
   ```suggestion
             relDataTypes.add(new 
RelDataTypeFieldImpl(SqlValidatorUtil.EXPR_SUGGESTER.apply(null, exprIndex, 0), 
allExprs.size(), factory.createSqlType(SqlTypeName.ANY)));
   ```
 
----------------------------------------------------------------
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:
us...@infra.apache.org


> Read Hive struct w/o nulls
> --------------------------
>
>                 Key: DRILL-7253
>                 URL: https://issues.apache.org/jira/browse/DRILL-7253
>             Project: Apache Drill
>          Issue Type: Sub-task
>            Reporter: Igor Guzenko
>            Assignee: Igor Guzenko
>            Priority: Major
>             Fix For: 1.17.0
>
>




--
This message was sent by Atlassian Jira
(v8.3.2#803003)

Reply via email to