@Override public LogicalProject copy(RelTraitSet traitSet, RelNode input, List<RexNode> projects, RelDataType rowType) { return new LogicalProject(getCluster(), traitSet, input, projects, rowType); }
@Override public LogicalProject copy(RelTraitSet traitSet, RelNode input, List<RexNode> projects, RelDataType rowType) { return new LogicalProject(getCluster(), traitSet, input, projects, rowType); }
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()); }
@Override public RelNode visit(LogicalProject project) { final RelNode input = project.getInput().accept(this); return new LogicalProject( cluster, copyOf(project.getTraitSet()), input, Lists.transform(project.getProjects(), COPY_REX_NODE), copyOf(project.getRowType()) ); }
/** Creates a LogicalProject, specifying row type rather than field names. */ public static LogicalProject create(final RelNode input, final List<? extends RexNode> projects, RelDataType rowType) { final RelOptCluster cluster = input.getCluster(); final RelMetadataQuery mq = cluster.getMetadataQuery(); final RelTraitSet traitSet = cluster.traitSet().replace(Convention.NONE) .replaceIfs(RelCollationTraitDef.INSTANCE, () -> RelMdCollation.project(mq, input, projects)); return new LogicalProject(cluster, traitSet, input, projects, rowType); }
/** Creates a LogicalProject, specifying row type rather than field names. */ public static LogicalProject create(final RelNode input, final List<? extends RexNode> projects, RelDataType rowType) { final RelOptCluster cluster = input.getCluster(); final RelMetadataQuery mq = cluster.getMetadataQuery(); final RelTraitSet traitSet = cluster.traitSet().replace(Convention.NONE) .replaceIfs(RelCollationTraitDef.INSTANCE, () -> RelMdCollation.project(mq, input, projects)); return new LogicalProject(cluster, traitSet, input, projects, rowType); }
/** * 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() ); } }
List<RelDataTypeField> fields = ImmutableList.<RelDataTypeField>of(new RelDataTypeFieldImpl("ContainsTemp", 0, call.getType())); Project temporary = new LogicalProject(node.getCluster(), node.getTraitSet().plus(Convention.NONE), node.getInput(0), ImmutableList.of(call), new RelRecordType(fields)); origins = mq.getColumnOrigins(temporary, 0);
new LogicalProject(cluster, window.getTraitSet(), window.getInput(), exps, builder.build());
new LogicalProject(cluster, window.getTraitSet(), window.getInput(), exps, builder.build());