org.apache.calcite.rel.RelNode.replaceInput()方法的使用及代码示例

x33g5p2x  于2022-01-29 转载在 其他  
字(13.5k)|赞(0)|评价(0)|浏览(116)

本文整理了Java中org.apache.calcite.rel.RelNode.replaceInput方法的一些代码示例,展示了RelNode.replaceInput的具体用法。这些代码示例主要来源于Github/Stackoverflow/Maven等平台,是从一些精选项目中提取出来的代码,具有较强的参考意义,能在一定程度帮忙到你。RelNode.replaceInput方法的具体详情如下:
包路径:org.apache.calcite.rel.RelNode
类名称:RelNode
方法名:replaceInput

RelNode.replaceInput介绍

[英]Replaces the ordinalInParentth input. You must override this method if you override #getInputs.
[中]替换第ordinalInParent个输入。如果重写#getInputs,则必须重写此方法。

代码示例

代码示例来源:origin: apache/kylin

public void fixSharedOlapTableScanAt(RelNode parent, int ordinalInParent) {
  OLAPTableScan copy = copyTableScanIfNeeded(parent.getInputs().get(ordinalInParent));
  if (copy != null)
    parent.replaceInput(ordinalInParent, copy);
}

代码示例来源:origin: apache/hive

private static RelNode introduceDerivedTable(final RelNode rel, RelNode parent) {
 int i = 0;
 int pos = -1;
 List<RelNode> childList = parent.getInputs();
 for (RelNode child : childList) {
  if (child == rel) {
   pos = i;
   break;
  }
  i++;
 }
 if (pos == -1) {
  throw new RuntimeException("Couldn't find child node in parent's inputs");
 }
 RelNode select = introduceDerivedTable(rel);
 parent.replaceInput(pos, select);
 return select;
}

代码示例来源:origin: apache/drill

private static RelNode introduceDerivedTable(final RelNode rel, RelNode parent) {
 int i = 0;
 int pos = -1;
 List<RelNode> childList = parent.getInputs();
 for (RelNode child : childList) {
  if (child == rel) {
   pos = i;
   break;
  }
  i++;
 }
 if (pos == -1) {
  throw new RuntimeException("Couldn't find child node in parent's inputs");
 }
 RelNode select = introduceDerivedTable(rel);
 parent.replaceInput(pos, select);
 return select;
}

代码示例来源:origin: apache/hive

public static RelNode renameTopLevelSelectInResultSchema(final RelNode rootRel,
  Pair<RelNode, RelNode> topSelparentPair, List<FieldSchema> resultSchema)
  throws CalciteSemanticException {
 RelNode parentOforiginalProjRel = topSelparentPair.getKey();
 HiveProject originalProjRel = (HiveProject) topSelparentPair.getValue();
 // Assumption: top portion of tree could only be
 // (limit)?(OB)?(Project)....
 List<RexNode> rootChildExps = originalProjRel.getChildExps();
 if (resultSchema.size() != rootChildExps.size()) {
  // Safeguard against potential issues in CBO RowResolver construction. Disable CBO for now.
  LOG.error(PlanModifierUtil.generateInvalidSchemaMessage(originalProjRel, resultSchema, 0));
  throw new CalciteSemanticException("Result Schema didn't match Optimized Op Tree Schema");
 }
 List<String> newSelAliases = new ArrayList<String>();
 String colAlias;
 for (int i = 0; i < rootChildExps.size(); i++) {
  colAlias = resultSchema.get(i).getName();
  colAlias = getNewColAlias(newSelAliases, colAlias);
  newSelAliases.add(colAlias);
 }
 HiveProject replacementProjectRel = HiveProject.create(originalProjRel.getInput(),
   originalProjRel.getChildExps(), newSelAliases);
 if (rootRel == originalProjRel) {
  return replacementProjectRel;
 } else {
  parentOforiginalProjRel.replaceInput(0, replacementProjectRel);
  return rootRel;
 }
}

代码示例来源:origin: apache/drill

public static RelNode renameTopLevelSelectInResultSchema(final RelNode rootRel,
  Pair<RelNode, RelNode> topSelparentPair, List<FieldSchema> resultSchema)
  throws CalciteSemanticException {
 RelNode parentOforiginalProjRel = topSelparentPair.getKey();
 HiveProject originalProjRel = (HiveProject) topSelparentPair.getValue();
 // Assumption: top portion of tree could only be
 // (limit)?(OB)?(Project)....
 List<RexNode> rootChildExps = originalProjRel.getChildExps();
 if (resultSchema.size() != rootChildExps.size()) {
  // Safeguard against potential issues in CBO RowResolver construction. Disable CBO for now.
  LOG.error(PlanModifierUtil.generateInvalidSchemaMessage(originalProjRel, resultSchema, 0));
  throw new CalciteSemanticException("Result Schema didn't match Optimized Op Tree Schema");
 }
 List<String> newSelAliases = new ArrayList<String>();
 String colAlias;
 for (int i = 0; i < rootChildExps.size(); i++) {
  colAlias = resultSchema.get(i).getName();
  colAlias = getNewColAlias(newSelAliases, colAlias);
  newSelAliases.add(colAlias);
 }
 HiveProject replacementProjectRel = HiveProject.create(originalProjRel.getInput(),
   originalProjRel.getChildExps(), newSelAliases);
 if (rootRel == originalProjRel) {
  return replacementProjectRel;
 } else {
  parentOforiginalProjRel.replaceInput(0, replacementProjectRel);
  return rootRel;
 }
}

代码示例来源:origin: apache/hive

/** Fallback if none of the other {@code decorrelateRel} methods match. */
public Frame decorrelateRel(RelNode rel) {
 RelNode newRel = rel.copy(rel.getTraitSet(), rel.getInputs());
 if (rel.getInputs().size() > 0) {
  List<RelNode> oldInputs = rel.getInputs();
  List<RelNode> newInputs = Lists.newArrayList();
  for (int i = 0; i < oldInputs.size(); ++i) {
   final Frame frame = getInvoke(oldInputs.get(i), rel);
   if (frame == null || !frame.corDefOutputs.isEmpty()) {
    // if input is not rewritten, or if it produces correlated
    // variables, terminate rewrite
    return null;
   }
   newInputs.add(frame.r);
   newRel.replaceInput(i, frame.r);
  }
  if (!Util.equalShallow(oldInputs, newInputs)) {
   newRel = rel.copy(rel.getTraitSet(), newInputs);
  }
 }
 // the output position should not change since there are no corVars
 // coming from below.
 return register(rel, newRel, identityMap(rel.getRowType().getFieldCount()),
     ImmutableSortedMap.<CorDef, Integer>of());
}

代码示例来源:origin: apache/hive

private static void replaceEmptyGroupAggr(final RelNode rel, RelNode parent) {
  // If this function is called, the parent should only include constant
  List<RexNode> exps = parent.getChildExps();
  for (RexNode rexNode : exps) {
   if (!rexNode.accept(new HiveCalciteUtil.ConstantFinder())) {
    throw new RuntimeException("We expect " + parent.toString()
      + " to contain only constants. However, " + rexNode.toString() + " is "
      + rexNode.getKind());
   }
  }
  HiveAggregate oldAggRel = (HiveAggregate) rel;
  RelDataTypeFactory typeFactory = oldAggRel.getCluster().getTypeFactory();
  RelDataType longType = TypeConverter.convert(TypeInfoFactory.longTypeInfo, typeFactory);
  RelDataType intType = TypeConverter.convert(TypeInfoFactory.intTypeInfo, typeFactory);
  // Create the dummy aggregation.
  SqlAggFunction countFn = SqlFunctionConverter.getCalciteAggFn("count", false,
    ImmutableList.of(intType), longType);
  // TODO: Using 0 might be wrong; might need to walk down to find the
  // proper index of a dummy.
  List<Integer> argList = ImmutableList.of(0);
  AggregateCall dummyCall = new AggregateCall(countFn, false, argList, longType, null);
  Aggregate newAggRel = oldAggRel.copy(oldAggRel.getTraitSet(), oldAggRel.getInput(),
    oldAggRel.indicator, oldAggRel.getGroupSet(), oldAggRel.getGroupSets(),
    ImmutableList.of(dummyCall));
  RelNode select = introduceDerivedTable(newAggRel);
  parent.replaceInput(0, select);
 }
}

代码示例来源:origin: apache/drill

/** Fallback if none of the other {@code decorrelateRel} methods match. */
public Frame decorrelateRel(RelNode rel) {
 RelNode newRel = rel.copy(rel.getTraitSet(), rel.getInputs());
 if (rel.getInputs().size() > 0) {
  List<RelNode> oldInputs = rel.getInputs();
  List<RelNode> newInputs = Lists.newArrayList();
  for (int i = 0; i < oldInputs.size(); ++i) {
   final Frame frame = getInvoke(oldInputs.get(i), rel);
   if (frame == null || !frame.corDefOutputs.isEmpty()) {
    // if input is not rewritten, or if it produces correlated
    // variables, terminate rewrite
    return null;
   }
   newInputs.add(frame.r);
   newRel.replaceInput(i, frame.r);
  }
  if (!Util.equalShallow(oldInputs, newInputs)) {
   newRel = rel.copy(rel.getTraitSet(), newInputs);
  }
 }
 // the output position should not change since there are no corVars
 // coming from below.
 return register(rel, newRel, identityMap(rel.getRowType().getFieldCount()),
     ImmutableSortedMap.<CorDef, Integer>of());
}

代码示例来源:origin: apache/drill

private static void replaceEmptyGroupAggr(final RelNode rel, RelNode parent) {
  // If this function is called, the parent should only include constant
  List<RexNode> exps = parent.getChildExps();
  for (RexNode rexNode : exps) {
   if (!rexNode.accept(new HiveCalciteUtil.ConstantFinder())) {
    throw new RuntimeException("We expect " + parent.toString()
      + " to contain only constants. However, " + rexNode.toString() + " is "
      + rexNode.getKind());
   }
  }
  HiveAggregate oldAggRel = (HiveAggregate) rel;
  RelDataTypeFactory typeFactory = oldAggRel.getCluster().getTypeFactory();
  RelDataType longType = TypeConverter.convert(TypeInfoFactory.longTypeInfo, typeFactory);
  RelDataType intType = TypeConverter.convert(TypeInfoFactory.intTypeInfo, typeFactory);
  // Create the dummy aggregation.
  SqlAggFunction countFn = SqlFunctionConverter.getCalciteAggFn("count", false,
    ImmutableList.of(intType), longType);
  // TODO: Using 0 might be wrong; might need to walk down to find the
  // proper index of a dummy.
  List<Integer> argList = ImmutableList.of(0);
  AggregateCall dummyCall = new AggregateCall(countFn, false, argList, longType, null);
  Aggregate newAggRel = oldAggRel.copy(oldAggRel.getTraitSet(), oldAggRel.getInput(),
    oldAggRel.indicator, oldAggRel.getGroupSet(), oldAggRel.getGroupSets(),
    ImmutableList.of(dummyCall));
  RelNode select = introduceDerivedTable(newAggRel);
  parent.replaceInput(0, select);
 }
}

代码示例来源:origin: org.apache.kylin/kylin-query

public void fixSharedOlapTableScanAt(RelNode parent, int ordinalInParent) {
  OLAPTableScan copy = copyTableScanIfNeeded(parent.getInputs().get(ordinalInParent));
  if (copy != null)
    parent.replaceInput(ordinalInParent, copy);
}

代码示例来源:origin: Qihoo360/Quicksql

private boolean fixUpInputs(RelNode rel) {
 List<RelNode> inputs = rel.getInputs();
 int i = -1;
 int changeCount = 0;
 for (RelNode input : inputs) {
  ++i;
  if (input instanceof RelSubset) {
   final RelSubset subset = (RelSubset) input;
   RelSubset newSubset = canonize(subset);
   if (newSubset != subset) {
    rel.replaceInput(i, newSubset);
    if (subset.set != newSubset.set) {
     subset.set.parents.remove(rel);
     newSubset.set.parents.add(rel);
    }
    changeCount++;
   }
  }
 }
 return changeCount > 0;
}

代码示例来源:origin: com.facebook.presto.hive/hive-apache

private static RelNode introduceDerivedTable(final RelNode rel, RelNode parent) {
 int i = 0;
 int pos = -1;
 List<RelNode> childList = parent.getInputs();
 for (RelNode child : childList) {
  if (child == rel) {
   pos = i;
   break;
  }
  i++;
 }
 if (pos == -1) {
  throw new RuntimeException("Couldn't find child node in parent's inputs");
 }
 RelNode select = introduceDerivedTable(rel);
 parent.replaceInput(pos, select);
 return select;
}

代码示例来源:origin: org.apache.calcite/calcite-core

private boolean fixUpInputs(RelNode rel) {
 List<RelNode> inputs = rel.getInputs();
 int i = -1;
 int changeCount = 0;
 for (RelNode input : inputs) {
  ++i;
  if (input instanceof RelSubset) {
   final RelSubset subset = (RelSubset) input;
   RelSubset newSubset = canonize(subset);
   if (newSubset != subset) {
    rel.replaceInput(i, newSubset);
    if (subset.set != newSubset.set) {
     subset.set.parents.remove(rel);
     newSubset.set.parents.add(rel);
    }
    changeCount++;
   }
  }
 }
 return changeCount > 0;
}

代码示例来源:origin: Qihoo360/Quicksql

public void rewriteGeneric(RelNode rel) {
 RelNode newRel = rel.copy(rel.getTraitSet(), rel.getInputs());
 List<RelNode> oldInputs = rel.getInputs();
 for (int i = 0; i < oldInputs.size(); ++i) {
  newRel.replaceInput(
    i,
    getNewForOldRel(oldInputs.get(i)));
 }
 setNewForOldRel(rel, newRel);
}

代码示例来源:origin: org.apache.calcite/calcite-core

public void rewriteGeneric(RelNode rel) {
 RelNode newRel = rel.copy(rel.getTraitSet(), rel.getInputs());
 List<RelNode> oldInputs = rel.getInputs();
 for (int i = 0; i < oldInputs.size(); ++i) {
  newRel.replaceInput(
    i,
    getNewForOldRel(oldInputs.get(i)));
 }
 setNewForOldRel(rel, newRel);
}

代码示例来源:origin: org.apache.calcite/calcite-core

private RelNode buildFinalPlan(HepRelVertex vertex) {
 RelNode rel = vertex.getCurrentRel();
 notifyChosen(rel);
 // Recursively process children, replacing this rel's inputs
 // with corresponding child rels.
 List<RelNode> inputs = rel.getInputs();
 for (int i = 0; i < inputs.size(); ++i) {
  RelNode child = inputs.get(i);
  if (!(child instanceof HepRelVertex)) {
   // Already replaced.
   continue;
  }
  child = buildFinalPlan((HepRelVertex) child);
  rel.replaceInput(i, child);
  rel.recomputeDigest();
 }
 return rel;
}

代码示例来源:origin: Qihoo360/Quicksql

private RelNode buildFinalPlan(HepRelVertex vertex) {
 RelNode rel = vertex.getCurrentRel();
 notifyChosen(rel);
 // Recursively process children, replacing this rel's inputs
 // with corresponding child rels.
 List<RelNode> inputs = rel.getInputs();
 for (int i = 0; i < inputs.size(); ++i) {
  RelNode child = inputs.get(i);
  if (!(child instanceof HepRelVertex)) {
   // Already replaced.
   continue;
  }
  child = buildFinalPlan((HepRelVertex) child);
  rel.replaceInput(i, child);
  rel.recomputeDigest();
 }
 return rel;
}

代码示例来源:origin: Qihoo360/Quicksql

private void pruneSubtree(RelNode parent,
  TableScan scan,
  int leftOrRight) {
  RelOptTableImpl lowLevelTable = ((RelOptTableImpl) scan.getTable());
  List<String> newNames = createTableAlias(lowLevelTable.getNames());
  RelNode originChild = parent.getInputs().get(leftOrRight);
  executePruningSubtree(originChild, scan.getTable(), newNames.get(0));
  TableScan tempTableScan = createTemporaryTableScan(lowLevelTable, newNames, scan,
    originChild);
  parent.replaceInput(leftOrRight, tempTableScan);
}

代码示例来源:origin: com.alibaba.blink/flink-table

/** Fallback if none of the other {@code decorrelateRel} methods match. */
public Frame decorrelateRel(RelNode rel) {
  RelNode newRel = rel.copy(rel.getTraitSet(), rel.getInputs());
  if (rel.getInputs().size() > 0) {
    List<RelNode> oldInputs = rel.getInputs();
    List<RelNode> newInputs = new ArrayList<>();
    for (int i = 0; i < oldInputs.size(); ++i) {
      final Frame frame = getInvoke(oldInputs.get(i));
      if (frame == null || frame.c != null) {
        // if input is not rewritten, or if it produces correlated variables, terminate rewrite
        return null;
      }
      newInputs.add(frame.r);
      newRel.replaceInput(i, frame.r);
    }
    if (!Util.equalShallow(oldInputs, newInputs)) {
      newRel = rel.copy(rel.getTraitSet(), newInputs);
    }
  }
  // the output position should not change since there are no corVars coming from below.
  return new Frame(rel, newRel, null, identityMap(rel.getRowType().getFieldCount()));
}

代码示例来源:origin: com.facebook.presto.hive/hive-apache

private RelNode introduceProjectIfNeeded(RelNode optimizedOptiqPlan)
  throws CalciteSemanticException {
 RelNode parent = null;
 RelNode input = optimizedOptiqPlan;
 RelNode newRoot = optimizedOptiqPlan;
 while (!(input instanceof Project) && (input instanceof Sort)) {
  parent = input;
  input = input.getInput(0);
 }
 if (!(input instanceof Project)) {
  HiveProject hpRel = HiveProject.create(input,
    HiveCalciteUtil.getProjsFromBelowAsInputRef(input), input.getRowType().getFieldNames());
  if (input == optimizedOptiqPlan) {
   newRoot = hpRel;
  } else {
   parent.replaceInput(0, hpRel);
  }
 }
 return newRoot;
}

相关文章