[ 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)