topFieldNames.add(field.getName()); topRel = HiveRelFactories.HIVE_PROJECT_FACTORY.createProject(topRel, topFields, topFieldNames);
projectFactory.createProject(frame.rel, ImmutableList.copyOf(nodeList), fieldNameList); stack.pop();
projectFactory.createProject(frame.rel, ImmutableList.copyOf(nodeList), fieldNameList); stack.pop();
leftRel = factory.createProject(leftRel, newLeftFields, SqlValidatorUtil.uniquify(newLeftFieldNames)); rightRel = factory.createProject(rightRel, newRightFields, SqlValidatorUtil.uniquify(newRightFieldNames));
RelNode newProjectRel = projectFactory.createProject( aggregate, belowProjectExprs, belowProjectColumnNames); RelNode newTopProjectRel = projectFactory.createProject( newProjectRel, topProjectExprs, project.getRowType().getFieldNames());
offsetNode, fetchNode); replaceTop( projectFactory.createProject(sort, project.getProjects(), Pair.right(project.getNamedProjects())));
offsetNode, fetchNode); replaceTop( projectFactory.createProject(sort, project.getProjects(), Pair.right(project.getNamedProjects())));
projFactory.createProject(child, Pair.left(projects), Pair.right(projects));
offsetNode, fetchNode); replaceTop( projectFactory.createProject(sort, project.getProjects(), Pair.right(project.getNamedProjects())));
if (rename) { return projectFactory.createProject(rel, castExps, castRowType.getFieldNames()); } else { return projectFactory.createProject(rel, castExps, rowType.getFieldNames());
if (rename) { return projectFactory.createProject(rel, castExps, castRowType.getFieldNames()); } else { return projectFactory.createProject(rel, castExps, rowType.getFieldNames());
@Override public RelNode project(ImmutableBitSet fieldsUsed, Set<RelDataTypeField> extraFields, RelFactories.ProjectFactory projectFactory) { // 1. If the schema is the same then bail out final int fieldCount = getRowType().getFieldCount(); if (fieldsUsed.equals(ImmutableBitSet.range(fieldCount)) && extraFields.isEmpty()) { return this; } // 2. Make sure there is no dynamic addition of virtual cols if (extraFields != null && !extraFields.isEmpty()) { throw new RuntimeException("Hive TS does not support adding virtual columns dynamically"); } // 3. Create new TS schema that is a subset of original final List<RelDataTypeField> fields = getRowType().getFieldList(); List<RelDataType> fieldTypes = new LinkedList<RelDataType>(); List<String> fieldNames = new LinkedList<String>(); List<RexNode> exprList = new ArrayList<RexNode>(); RexBuilder rexBuilder = getCluster().getRexBuilder(); for (int i : fieldsUsed) { RelDataTypeField field = fields.get(i); fieldTypes.add(field.getType()); fieldNames.add(field.getName()); exprList.add(rexBuilder.makeInputRef(this, i)); } // 4. Build new TS HiveTableScan newHT = copy(getCluster().getTypeFactory().createStructType(fieldTypes, fieldNames)); // 5. Add Proj on top of TS return projectFactory.createProject(newHT, exprList, new ArrayList<String>(fieldNames)); }
/** * The purpose of the replace() method is to allow the caller to replace a 'top' and 'bottom' project with * a single merged project with the assumption that caller knows exactly the semantics/correctness of merging * the two projects. This is not applying the full fledged DrillMergeProjectRule. * @param topProject * @param bottomProject * @return new project after replacement */ public static Project replace(Project topProject, Project bottomProject) { final List<RexNode> newProjects = RelOptUtil.pushPastProject(topProject.getProjects(), bottomProject); // replace the two projects with a combined projection if (topProject instanceof DrillProjectRel) { RelNode newProjectRel = DrillRelFactories.DRILL_LOGICAL_PROJECT_FACTORY.createProject( bottomProject.getInput(), newProjects, topProject.getRowType().getFieldNames()); return (Project) newProjectRel; } else { RelNode newProjectRel = PrelFactories.PROJECT_FACTORY.createProject( bottomProject.getInput(), newProjects, topProject.getRowType().getFieldNames()); return (Project) newProjectRel; } }
@Deprecated // to be removed before 2.0 public static RelNode projectMapping( RelNode rel, Mapping mapping, List<String> fieldNames, RelFactories.ProjectFactory projectFactory) { assert mapping.getMappingType().isSingleSource(); assert mapping.getMappingType().isMandatorySource(); if (mapping.isIdentity()) { return rel; } final List<String> outputNameList = new ArrayList<>(); final List<RexNode> exprList = new ArrayList<>(); final List<RelDataTypeField> fields = rel.getRowType().getFieldList(); final RexBuilder rexBuilder = rel.getCluster().getRexBuilder(); for (int i = 0; i < mapping.getTargetCount(); i++) { final int source = mapping.getSource(i); final RelDataTypeField sourceField = fields.get(source); outputNameList.add( ((fieldNames == null) || (fieldNames.size() <= i) || (fieldNames.get(i) == null)) ? sourceField.getName() : fieldNames.get(i)); exprList.add(rexBuilder.makeInputRef(rel, source)); } return projectFactory.createProject(rel, exprList, outputNameList); }
@Deprecated // to be removed before 2.0 public static RelNode projectMapping( RelNode rel, Mapping mapping, List<String> fieldNames, RelFactories.ProjectFactory projectFactory) { assert mapping.getMappingType().isSingleSource(); assert mapping.getMappingType().isMandatorySource(); if (mapping.isIdentity()) { return rel; } final List<String> outputNameList = new ArrayList<>(); final List<RexNode> exprList = new ArrayList<>(); final List<RelDataTypeField> fields = rel.getRowType().getFieldList(); final RexBuilder rexBuilder = rel.getCluster().getRexBuilder(); for (int i = 0; i < mapping.getTargetCount(); i++) { final int source = mapping.getSource(i); final RelDataTypeField sourceField = fields.get(source); outputNameList.add( ((fieldNames == null) || (fieldNames.size() <= i) || (fieldNames.get(i) == null)) ? sourceField.getName() : fieldNames.get(i)); exprList.add(rexBuilder.makeInputRef(rel, source)); } return projectFactory.createProject(rel, exprList, outputNameList); }
/** * Creates a projection which casts a rel's output to a desired row type. * Differs from RelOptUtil implementation by casting even when type is ANY. * * @param rel producer of rows to be converted * @param castRowType row type after cast * @param projectFactory Project Factory * * @return conversion rel */ public static RelNode createCastRel( final RelNode rel, RelDataType castRowType, RelFactories.ProjectFactory projectFactory) { assert projectFactory != null; RelDataType rowType = rel.getRowType(); if (areRowTypesEqual(rowType, castRowType, false, true)) { // nothing to do return rel; } final RexBuilder rexBuilder = rel.getCluster().getRexBuilder(); final List<RexNode> castExps = RexUtil.generateCastExpressions(rexBuilder, castRowType, rowType); return projectFactory.createProject(rel, castExps, rowType.getFieldNames()); }
leftRel = factory.createProject(leftRel, newLeftFields, SqlValidatorUtil.uniquify(newLeftFieldNames)); rightRel = factory.createProject(rightRel, newRightFields, SqlValidatorUtil.uniquify(newRightFieldNames));
topFieldNames.add(field.getName()); topRel = HiveRelFactories.HIVE_PROJECT_FACTORY.createProject(topRel, topFields, topFieldNames);
RelNode newProjectRel = projectFactory.createProject( aggregate, belowProjectExprs, belowProjectColumnNames); RelNode newTopProjectRel = projectFactory.createProject( newProjectRel, topProjectExprs, project.getRowType().getFieldNames());
leftRel = factory.createProject(leftRel, newLeftFields, SqlValidatorUtil.uniquify(newLeftFieldNames)); rightRel = factory.createProject(rightRel, newRightFields, SqlValidatorUtil.uniquify(newRightFieldNames));