List<RelDataTypeField> origFields = setOp.getRowType().getFieldList(); int[] adjustments = new int[origFields.size()]; final List<RelNode> newSetOpInputs = new ArrayList<>(); RelNode lastInput = null; for (int index = 0; index < setOp.getInputs().size(); index++) { RelNode input = setOp.getInput(index); RexNode newCondition = condition.accept(new RelOptUtil.RexInputConverter(rexBuilder, origFields, input.getRowType().getFieldList(), adjustments)); if (index == setOp.getInputs().size() - 1) { lastInput = relBuilder.push(input).filter(newCondition).build(); SetOp newSetOp = setOp.copy(setOp.getTraitSet(), newSetOpInputs); call.transformTo(newSetOp); } else {
public RelNode align(SetOp rel, List<RelFieldCollation> collations) { ImmutableList.Builder<RelNode> newInputs = new ImmutableList.Builder<>(); for (RelNode input : rel.getInputs()) { newInputs.add(dispatchAlign(input, collations)); } return rel.copy(rel.getTraitSet(), newInputs.build()); }
/** * Returns whether all the inputs of this set operator have the same row * type as its output row. * * @param compareNames Whether column names are important in the * homogeneity comparison * @return Whether all the inputs of this set operator have the same row * type as its output row */ public boolean isHomogeneous(boolean compareNames) { RelDataType unionType = getRowType(); for (RelNode input : getInputs()) { if (!RelOptUtil.areRowTypesEqual( input.getRowType(), unionType, compareNames)) { return false; } } return true; } }
for (RelNode inputRel : setop.getInputs()) { if (!validSetopChild(inputRel)) { introduceDerivedTable(inputRel, setop);
if (setOpClass.isInstance(call.rel(2)) && !Minus.class.isAssignableFrom(setOpClass)) { relBuilder.push(topOp.getInput(0)); relBuilder.pushAll(bottomOp.getInputs()); for (int index = 2; index < topOp.getInputs().size(); index++) { relBuilder.push(topOp.getInput(index)); relBuilder.pushAll(bottomOp.getInputs()); relBuilder.pushAll(Util.skip(topOp.getInputs())); int n = bottomOp.getInputs().size() + topOp.getInputs().size() - 1; if (topOp instanceof Union) {
private static Set<ImmutableBitSet> getUniqueKeys(SetOp rel) { if (!rel.all) { return ImmutableSet.of( ImmutableBitSet.range(rel.getRowType().getFieldCount())); } return ImmutableSet.of(); }
@Override public SetOp copy(RelTraitSet traitSet, List<RelNode> inputs) { return copy(traitSet, inputs, all); }
@Override protected RelDataType deriveRowType() { final List<RelDataType> inputRowTypes = Lists.transform(inputs, RelNode::getRowType); final RelDataType rowType = getCluster().getTypeFactory().leastRestrictive(inputRowTypes); if (rowType == null) { throw new IllegalArgumentException("Cannot compute compatible row type " + "for arguments to set op: " + Util.sepList(inputRowTypes, ", ")); } return rowType; }
@Override public void replaceInput(int ordinalInParent, RelNode p) { final List<RelNode> newInputs = new ArrayList<>(inputs); newInputs.set(ordinalInParent, p); inputs = ImmutableList.copyOf(newInputs); recomputeDigest(); }
public RelNode align(SetOp rel, List<RelFieldCollation> collations) { ImmutableList.Builder<RelNode> newInputs = new ImmutableList.Builder<>(); for (RelNode input : rel.getInputs()) { newInputs.add(dispatchAlign(input, collations)); } return rel.copy(rel.getTraitSet(), newInputs.build()); }
/** * Returns whether all the inputs of this set operator have the same row * type as its output row. * * @param compareNames Whether column names are important in the * homogeneity comparison * @return Whether all the inputs of this set operator have the same row * type as its output row */ public boolean isHomogeneous(boolean compareNames) { RelDataType unionType = getRowType(); for (RelNode input : getInputs()) { if (!RelOptUtil.areRowTypesEqual( input.getRowType(), unionType, compareNames)) { return false; } } return true; } }
for (RelNode inputRel : setop.getInputs()) { if (!validSetopChild(inputRel)) { introduceDerivedTable(inputRel, setop);
if (setOpClass.isInstance(call.rel(2)) && !Minus.class.isAssignableFrom(setOpClass)) { relBuilder.push(topOp.getInput(0)); relBuilder.pushAll(bottomOp.getInputs()); for (int index = 2; index < topOp.getInputs().size(); index++) { relBuilder.push(topOp.getInput(index)); relBuilder.pushAll(bottomOp.getInputs()); relBuilder.pushAll(Util.skip(topOp.getInputs())); int n = bottomOp.getInputs().size() + topOp.getInputs().size() - 1; if (topOp instanceof Union) {
public Set<ImmutableBitSet> getUniqueKeys(SetOp rel, RelMetadataQuery mq, boolean ignoreNulls) { if (!rel.all) { return ImmutableSet.of( ImmutableBitSet.range(rel.getRowType().getFieldCount())); } return ImmutableSet.of(); }
@Override public SetOp copy(RelTraitSet traitSet, List<RelNode> inputs) { return copy(traitSet, inputs, all); }
@Override protected RelDataType deriveRowType() { final List<RelDataType> inputRowTypes = Lists.transform(inputs, RelNode::getRowType); final RelDataType rowType = getCluster().getTypeFactory().leastRestrictive(inputRowTypes); if (rowType == null) { throw new IllegalArgumentException("Cannot compute compatible row type " + "for arguments to set op: " + Util.sepList(inputRowTypes, ", ")); } return rowType; }
@Override public void replaceInput(int ordinalInParent, RelNode p) { final List<RelNode> newInputs = new ArrayList<>(inputs); newInputs.set(ordinalInParent, p); inputs = ImmutableList.copyOf(newInputs); recomputeDigest(); }
final RelBuilder relBuilder = call.builder(); List<RelDataTypeField> origFields = setOp.getRowType().getFieldList(); int[] adjustments = new int[origFields.size()]; final List<RelNode> newSetOpInputs = new ArrayList<>(); for (RelNode input : setOp.getInputs()) { RexNode newCondition = condition.accept( setOp.copy(setOp.getTraitSet(), newSetOpInputs);
for (RelNode input : setOp.getInputs()) { setOp.copy(setOp.getTraitSet(), newSetOpInputs);
ImmutableBitSet fieldsUsed, Set<RelDataTypeField> extraFields) { final RelDataType rowType = setOp.getRowType(); final int fieldCount = rowType.getFieldCount(); int changeCount = 0; for (RelNode input : setOp.getInputs()) { TrimResult trimResult = trimChild(setOp, input, fieldsUsed, extraFields); for (RelNode input : setOp.getInputs()) { relBuilder.build(); relBuilder.union(setOp.all, setOp.getInputs().size()); break; case INTERSECT: relBuilder.intersect(setOp.all, setOp.getInputs().size()); break; case EXCEPT: assert setOp.getInputs().size() == 2; relBuilder.minus(setOp.all); break;