/** * Create an instance that pushes {@link CardinalityEstimate}s through a data flow plan starting at the given * {@code inputSlots} and {@code sourceOperators}, thereby putting {@link CardinalityEstimate}s into the * {@code cache}. * * @param inputSlots open {@link InputSlot}s that will be initially activated * @param sourceOperators {@link Operator} that will be initially activated * @param configuration provides utilties for the estimation */ public static CardinalityEstimationTraversal createPushTraversal(Collection<InputSlot<?>> inputSlots, Collection<Operator> sourceOperators, Configuration configuration) { return createPushTraversal(inputSlots, Collections.emptySet(), sourceOperators, configuration); }
public CardinalityEstimationTraversal getPlanTraversal() { if (this.planTraversal == null) { this.planTraversal = CardinalityEstimationTraversal.createPushTraversal( Collections.emptyList(), this.rheemPlan.collectReachableTopLevelSources(), this.configuration ); } return this.planTraversal; }
public OperatorAlternativeCardinalityPusher(final OperatorAlternative operatorAlternative, final Configuration configuration ) { super(operatorAlternative); this.alternativeTraversals = operatorAlternative.getAlternatives().stream() .map(alternative -> { final CardinalityEstimationTraversal traversal = CardinalityEstimationTraversal.createPushTraversal(alternative, configuration); return new Tuple<>(alternative, traversal); }) .collect(Collectors.toList()); }
/** * Create an instance that pushes {@link CardinalityEstimate}s through a data flow plan starting at the given * {@code inputSlots} and {@code sourceOperators}, thereby putting {@link CardinalityEstimate}s into the * {@code cache}. * * @param operatorContainer that should be traversed * @param configuration provides utilities for the estimation */ public static CardinalityEstimationTraversal createPushTraversal(OperatorContainer operatorContainer, Configuration configuration) { if (operatorContainer.isSource()) { return createPushTraversal( Collections.emptyList(), Collections.singleton(operatorContainer.getSource()), configuration ); } else { return createPushTraversal( operatorContainer.getMappedInputs(), Collections.emptyList(), configuration ); } }
/** * Create an instance for the given {@link Subplan}. * * @return the instance if it could be created */ public static CardinalityPusher createFor(OperatorContainer container, Configuration configuration) { final CompositeOperator compositeOperator = container.toOperator(); final InputSlot<?>[] outerInputs = compositeOperator.getAllInputs(); final List<InputSlot<?>> innerInputs = Arrays.stream(outerInputs) .flatMap(inputSlot -> container.followInput(inputSlot).stream()) .collect(Collectors.toList()); final Collection<Operator> sourceOperators = compositeOperator.isSource() ? Collections.singleton(container.getSource()) : Collections.emptySet(); final CardinalityEstimationTraversal traversal = CardinalityEstimationTraversal.createPushTraversal( innerInputs, sourceOperators, configuration); return new SubplanCardinalityPusher(traversal, compositeOperator); }
public LoopSubplanCardinalityPusher(LoopSubplan loopSubplan, Configuration configuration) { super(loopSubplan); // Create the CardinalityPusher for the loop head. final LoopHeadOperator loopHead = loopSubplan.getLoopHead(); this.loopHeadInitializationPusher = loopHead.getInitializationPusher(configuration); this.loopHeadIterationPusher = loopHead.getCardinalityPusher(configuration); this.loopHeadFinalizationPusher = loopHead.getFinalizationPusher(configuration); // Create the CardinalityTraversal for the loop body. Set<InputSlot<?>> bodyInputSlots = Arrays.stream(loopSubplan.getAllInputs()) .flatMap(outerInput -> loopSubplan.followInput(outerInput).stream()) .collect(Collectors.toSet()); for (InputSlot<?> inputSlot : loopHead.getLoopInitializationInputs()) { bodyInputSlots.remove(inputSlot); } for (OutputSlot<?> outputSlot : loopHead.getLoopBodyOutputs()) { for (InputSlot<?> inputSlot : outputSlot.getOccupiedSlots()) { bodyInputSlots.add(inputSlot); } } this.bodyOutputSlots = loopHead.getLoopBodyInputs().stream() .map(InputSlot::getOccupant) .filter(Objects::nonNull) .collect(Collectors.toSet()); this.bodyTraversal = CardinalityEstimationTraversal.createPushTraversal( bodyInputSlots, loopHead.getLoopBodyInputs(), Collections.emptyList(), configuration); }