@Override public Prel visitPrel(Prel prel, Void value) throws RuntimeException { // Require prefix rename : there exists other expression, in addition to a star column. if (!prefixedForStar // not set yet. && StarColumnHelper.containsStarColumn(prel.getRowType()) && prel.getRowType().getFieldNames().size() > 1) { prefixedForStar = true; } List<RelNode> children = Lists.newArrayList(); for (Prel child : prel) { child = child.accept(this, null); children.add(child); } return (Prel) prel.copy(prel.getTraitSet(), children); }
private Prel addTrivialOrderedProjectPrel(Prel prel) { RelDataType t = prel.getRowType(); RexBuilder b = prel.getCluster().getRexBuilder(); List<RexNode> projections = Lists.newArrayList(); int projectCount = t.getFieldList().size(); // no point in reordering if we only have one column if (projectCount < 2) { return prel; } for (int i = 0; i < projectCount; i++) { projections.add(b.makeInputRef(prel, i)); } return new ProjectPrel(prel.getCluster(), prel.getTraitSet(), prel, projections, prel.getRowType()); }
public void add(Prel prel) { maxCost = Math.max(maxCost, prel.getCostForParallelization()); }
public ComplexToJsonPrel(Prel phyRelNode) { super(phyRelNode.getCluster(), phyRelNode.getTraitSet(), phyRelNode); }
@Override public Prel visitPrel(Prel prel, Void dummy) { List<RelNode> children = new ArrayList<>(); for(Prel p : prel){ children.add(p.accept(this, null)); } return (Prel) prel.copy(prel.getTraitSet(), children); }
@Override public Prel visitPrel(Prel prel, Void value) throws RuntimeException { SelectionVectorMode[] encodings = prel.getSupportedEncodings(); List<RelNode> children = Lists.newArrayList(); for (Prel child : prel) { child = child.accept(this, null); children.add(convert(encodings, child)); } return (Prel) prel.copy(prel.getTraitSet(), children); }
@Override public LeafPrel visitPrel(Prel prel, Void v) { LeafPrel leafPrel = null; for (Prel child : prel) { leafPrel = child.accept(this, v); if (leafPrel != null) { return leafPrel; } } return null; }
public static Prel useGlobalDictionaries(Prel prel) { final PrelWithDictionaryInfo p = prel.accept(new GlobalDictionaryVisitor(prel.getCluster()), null); return p.getPrel(); }
@Override public Prel visitExchange(ExchangePrel prel, Void value) throws RuntimeException { Prel child = ((Prel)prel.getInput()).accept(this, null); // Whenever we encounter a HashToRandomExchangePrel // If MuxExchange is enabled, insert a UnorderedMuxExchangePrel before HashToRandomExchangePrel. // If DeMuxExchange is enabled, insert a UnorderedDeMuxExchangePrel after HashToRandomExchangePrel. if (!(prel instanceof HashToRandomExchangePrel)) { return (Prel)prel.copy(prel.getTraitSet(), Collections.singletonList(((RelNode)child))); } Prel newPrel = child; if (isMuxEnabled) { newPrel = new UnorderedMuxExchangePrel(child.getCluster(), child.getTraitSet(), child); } newPrel = new HashToRandomExchangePrel(prel.getCluster(), prel.getTraitSet(), newPrel, ((HashToRandomExchangePrel) prel).getFields()); if (isDeMuxEnabled) { HashToRandomExchangePrel hashExchangePrel = (HashToRandomExchangePrel) newPrel; // Insert a DeMuxExchange to narrow down the number of receivers newPrel = new UnorderedDeMuxExchangePrel(prel.getCluster(), prel.getTraitSet(), hashExchangePrel, hashExchangePrel.getFields()); } return newPrel; }
@Override public PhysicalOperator getPhysicalOperator(PhysicalPlanCreator creator) throws IOException { List<PhysicalOperator> inputPops = Lists.newArrayList(); for (int i = 0; i < this.getInputs().size(); i++) { inputPops.add( ((Prel)this.getInputs().get(i)).getPhysicalOperator(creator)); } UnionAll unionall = new UnionAll(inputPops); return creator.addMetadata(this, unionall); }
@Override public Prel visitExchange(ExchangePrel prel, Void value) throws RuntimeException { Prel child = ((Prel)prel.getInput()).accept(this, null); // check if the hash expression has already been added for this particular exchange if (!child.getRowType().getFieldNames().contains(HashPrelUtil.HASH_EXPR_NAME)) { if (prel instanceof HashToMergeExchangePrel) { return visit(prel, ((HashToMergeExchangePrel) prel).getDistFields(), child); } if (prel instanceof HashToRandomExchangePrel) { return visit(prel, ((HashToRandomExchangePrel) prel).getFields(), child); } } return (Prel) prel.copy(prel.getTraitSet(), Collections.singletonList(((RelNode)child))); }
private void verifyCount(Double expected, Prel input) { final RelMetadataQuery metadataQuery = input.getCluster().getMetadataQuery(); Double rowCountFromGet = metadataQuery.getRowCount(input); assertEquals(expected, rowCountFromGet.doubleValue(), 0.0d); Double rowCountFromEstimateRowCount = input.estimateRowCount(metadataQuery); assertEquals(expected, rowCountFromEstimateRowCount.doubleValue(), 0.0d); }
final RelDataType childRowType = input.getRowType(); final RelOptCluster cluster = input.getCluster(); final List<RexNode> exprs = new ArrayList<>(); final List<String> fieldNames = new ArrayList<>();
default double getCostForParallelization() { return getCluster().getMetadataQuery().getRowCount(this); }
@Override public Prel visitPrel(Prel prel, Set<Prel> data) throws RuntimeException { List<RelNode> children = Lists.newArrayList(); boolean childrenChanged = false; for (Prel child : prel) { Prel newChild = visitPrel(child, data); if (newChild != child) { childrenChanged = true; } children.add(newChild); } if (!data.add(prel) || childrenChanged) { return (Prel) prel.copy(prel.getTraitSet(), children); } else { return prel; } }
public PhysicalOperator addMetadata(Prel originalPrel, PhysicalOperator op){ op.setOperatorId(opIdMap.get(originalPrel).getAsSingleInt()); op.setCost(originalPrel.getCostForParallelization()); if (originalPrel.getTraitSet().getTrait(DistributionTraitDef.INSTANCE) == DistributionTrait.SINGLETON) { op.setAsSingle(); } return op; }
private Prel convert(SelectionVectorMode[] encodings, Prel prel) { for (SelectionVectorMode m : encodings) { if (prel.getEncoding() == m) { return prel; } } return new SelectionVectorRemoverPrel(prel); }
/** * Generate readable text and json plans and set them in <code>planHolder</code> * @param rel * @param explainlevel explain plan level. * @param observer */ public static String setPlansWithIds(final Prel rel, final SqlExplainLevel explainlevel, final AttemptObserver observer, final long millisTaken) { if (rel == null) { return null; } Map<Prel, OpId> relIdMap = getIdMap(rel); final StringWriter sw = new StringWriter(); final RelWriter textPlanWriter = new NumberingRelWriter(relIdMap, new PrintWriter(sw), explainlevel); rel.explain(textPlanWriter); final String textPlan = sw.toString(); observer.planText(sw.toString(), millisTaken); final RelJsonWriter jsonPlanWriter = new RelJsonWriter(getIdMap(rel), explainlevel); rel.explain(jsonPlanWriter); observer.planJsonPlan(jsonPlanWriter.asString()); return textPlan; }
private void addRels(List<String> list, Prel input) { String descr = input.getDescription(); list.add(descr.substring(0, descr.lastIndexOf("Prel"))); for(Prel child : input) { addRels(list, child); } }
@Override public Prel visitPrel(Prel prel, Void value) throws RuntimeException { List<RelNode> children = Lists.newArrayList(); for(Prel child : prel){ children.add(child.accept(this, null)); } return (Prel) prel.copy(prel.getTraitSet(), children); } }