private void setProjectedRowType(List<SchemaPath> projectedColumns){ if(projectedColumns != null){ LinkedHashSet<String> firstLevelPaths = new LinkedHashSet<>(); for(SchemaPath p : projectedColumns){ firstLevelPaths.add(p.getRootSegment().getNameSegment().getPath()); } final RelDataTypeFactory factory = getCluster().getTypeFactory(); final FieldInfoBuilder builder = new FieldInfoBuilder(factory); final Map<String, RelDataType> fields = new HashMap<>(); for(Field field : getBatchSchema()){ if(firstLevelPaths.contains(field.getName())){ fields.put(field.getName(), CompleteType.fromField(field).toCalciteType(factory)); } } Preconditions.checkArgument(firstLevelPaths.size() == fields.size(), "Projected column base size %d is not equal to outcome rowtype %d.", firstLevelPaths.size(), fields.size()); for(String path : firstLevelPaths){ builder.add(path, fields.get(path)); } this.rowType = builder.build(); } else { this.rowType = deriveRowType(); } } }
public static RelNode removeColumns(RelNode node, Predicate<RelDataTypeField> predicate) { if (node.getTraitSet() == null) { // for test purposes. return node; } // identify all fields that match passed predicate Set<RelDataTypeField> toRemove = FluentIterable.from(node.getRowType().getFieldList()).filter(predicate).toSet(); if (toRemove.isEmpty()) { return node; } final RexBuilder rexBuilder = node.getCluster().getRexBuilder(); final RelDataTypeFactory.FieldInfoBuilder rowTypeBuilder = new RelDataTypeFactory.FieldInfoBuilder(node.getCluster().getTypeFactory()); final List<RexNode> projects = FluentIterable.from(node.getRowType().getFieldList()) .filter(Predicates.not(toRemove::contains)) .transform((RelDataTypeField field) -> { rowTypeBuilder.add(field); return (RexNode) rexBuilder.makeInputRef(field.getType(), field.getIndex()); }).toList(); return new LogicalProject(node.getCluster(), node.getTraitSet(), node, projects, rowTypeBuilder.build()); }
/** * Removes an update column from a persisted column. This means it won't be written and won't be used in matching. * * If there is not initial update column, no changes will be made. */ public static RelNode removeUpdateColumn(RelNode node){ if(node.getTraitSet() == null){ // for test purposes. return node; } RelDataTypeField field = node.getRowType().getField(UPDATE_COLUMN, false, false); if(field == null ){ return node; } final RexBuilder rexBuilder = node.getCluster().getRexBuilder(); final RelDataTypeFactory.FieldInfoBuilder rowTypeBuilder = new RelDataTypeFactory.FieldInfoBuilder(node.getCluster().getTypeFactory()); final List<RexNode> projects = FluentIterable.from(node.getRowType().getFieldList()) .filter(new Predicate<RelDataTypeField>(){ @Override public boolean apply(RelDataTypeField input) { return !UPDATE_COLUMN.equals(input.getName()); }}) .transform(new Function<RelDataTypeField, RexNode>(){ @Override public RexNode apply(RelDataTypeField input) { rowTypeBuilder.add(input); return rexBuilder.makeInputRef(input.getType(), input.getIndex()); }}).toList(); return new LogicalProject(node.getCluster(), node.getTraitSet(), node, projects, rowTypeBuilder.build()); }
@Override public RelNode visit(LogicalProject project) { RelNode input = project.getInput().accept(this); RelDataType incomingRowType = input.getRowType(); List<RexNode> newProjects; RelDataTypeField modField = incomingRowType.getField(UPDATE_COLUMN, false, false); if (modField == null) { return project; } newProjects = FluentIterable.from(project.getProjects()) .append(new RexInputRef(modField.getIndex(), modField.getType())) .toList(); FieldInfoBuilder fieldInfoBuilder = new FieldInfoBuilder(project.getCluster().getTypeFactory()); for (RelDataTypeField field : project.getRowType().getFieldList()) { fieldInfoBuilder.add(field); } fieldInfoBuilder.add(UPDATE_COLUMN, modField.getType()); return new LogicalProject( project.getCluster(), project.getTraitSet(), input, newProjects, fieldInfoBuilder.build() ); } }
@SuppressWarnings("deprecation") public FieldInfoBuilder builder() { return new FieldInfoBuilder(this); }
@SuppressWarnings("deprecation") public FieldInfoBuilder builder() { return new FieldInfoBuilder(this); }
public RelDataType toCalciteRecordType(RelDataTypeFactory factory, Set<String> fieldBlacklist){ FieldInfoBuilder builder = new FieldInfoBuilder(factory); for(Field f : this) { if(!fieldBlacklist.contains(f.getName())){ builder.add(f.getName(), CompleteType.toCalciteType(f, factory)); } } RelDataType rowType = builder.build(); if(rowType.getFieldCount() == 0){ throw UserException.dataReadError().message("Selected table has no columns.").build(logger); } return rowType; }
static RelDataType toRowDataType(Collection<RelDataTypeField> fields, RelDataTypeFactory factory) { final RelDataTypeFactory.FieldInfoBuilder builder = new RelDataTypeFactory.FieldInfoBuilder(factory); for (RelDataTypeField field: fields) { builder.add(field); } return builder.build(); }