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_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:
[email protected]
With regards,
Apache Git Services