@Override public boolean isTimeEstimatesComplete() { boolean isComplete = true; for (OperatorContext operatorContext : operatorContexts.values()) { if (operatorContext.getOperator().isExecutionOperator() && operatorContext.timeEstimate == null && RheemArrays.anyMatch(operatorContext.getOutputCardinalities(), Objects::nonNull)) { this.logger.warn("No TimeEstimate for {}.", operatorContext); isComplete = false; } } if (this.getBase() != null) { isComplete &= this.getBase().isTimeEstimatesComplete(); } for (LoopContext loopContext : this.loopContexts.values()) { for (OptimizationContext iterationContext : loopContext.getIterationContexts()) { isComplete &= iterationContext.isTimeEstimatesComplete(); } } return isComplete; }