@Override public void pushThroughAlternatives(OptimizationContext.OperatorContext opCtx, Configuration configuration) { final OptimizationContext optCtx = opCtx.getOptimizationContext(); for (Tuple<OperatorAlternative.Alternative, CardinalityPusher> alternativePusher : this.alternativePushers) { LoopHeadOperator loopHeadOperator = (LoopHeadOperator) alternativePusher.field0.getContainedOperator(); final OptimizationContext.OperatorContext lhoCtx = optCtx.getOperatorContext(loopHeadOperator); alternativePusher.field1.push(lhoCtx, configuration); } }
/** * Execute this instance, thereby activating new instances and putting them on the queue. * * @param optimizationContext the current {@link OptimizationContext} in which the push should take place * @param activatorQueue accepts newly activated {@link CardinalityEstimator}s */ boolean process(OptimizationContext optimizationContext, Configuration configuration, Queue<Activator> activatorQueue) { OptimizationContext.OperatorContext opCtx = optimizationContext.getOperatorContext(this.operator); assert opCtx != null : String.format("Could not find OperatorContext for %s.", this.operator); // Do the local estimation. boolean isUpdated = this.pusher.push(opCtx, configuration); opCtx.pushCardinalitiesForward(); for (int outputIndex = 0; outputIndex < this.operator.getNumOutputs(); outputIndex++) { // Trigger follow-up operators. this.processDependentActivations(this.dependentActivations[outputIndex], activatorQueue); } return isUpdated; }