in wayang-commons/wayang-core/src/main/java/org/apache/wayang/core/optimizer/cardinality/CardinalityEstimatorManager.java [107:148]
public void updateConversionOperatorCardinalities(
PlanImplementation planImplementation,
OptimizationContext optimizationContext,
int optimizationContextIndex) {
// Update conversion operators outside of loops.
for (OptimizationContext.OperatorContext operatorContext : optimizationContext.getLocalOperatorContexts().values()) {
final Operator operator = operatorContext.getOperator();
for (int outputIndex = 0; outputIndex < operator.getNumOutputs(); outputIndex++) {
if (operatorContext.isOutputMarked(outputIndex)) {
final OutputSlot<?> output = operator.getOutput(outputIndex);
final Junction junction = planImplementation.getJunction(output);
if (junction == null) continue;
final CardinalityEstimate cardinality = operatorContext.getOutputCardinality(outputIndex);
OptimizationContext jctOptimizationContext = junction.getOptimizationContexts().get(0);
for (OptimizationContext.OperatorContext jctOpCtx : jctOptimizationContext.getLocalOperatorContexts().values()) {
final OptimizationContext.OperatorContext opCtx = optimizationContext.getOperatorContext(jctOpCtx.getOperator());
if (opCtx.getInputCardinalities().length == 1) opCtx.setInputCardinality(0, cardinality);
if (opCtx.getOutputCardinalities().length == 1) opCtx.setOutputCardinality(0, cardinality);
opCtx.updateCostEstimate();
}
}
}
}
// Visit loops.
for (Map.Entry<LoopSubplan, LoopImplementation> entry : planImplementation.getLoopImplementations().entrySet()) {
final LoopSubplan loop = entry.getKey();
final LoopImplementation loopImplementation = entry.getValue();
final OptimizationContext.LoopContext loopContext = optimizationContext.getNestedLoopContext(loop);
assert loopContext != null;
for (int iteration = 0; iteration < loopContext.getIterationContexts().size(); iteration++) {
final OptimizationContext iterationContext = loopContext.getIterationContext(iteration);
this.updateConversionOperatorCardinalities(
loopImplementation.getSingleIterationImplementation().getBodyImplementation(),
iterationContext,
iteration
);
}
}
}