@Override public ExecutionStage toExecutionStage() { final Iterator<ExecutionTask> iterator = this.allTasks.iterator(); final LoopSubplan loop = iterator.next().getOperator().getInnermostLoop(); assert Iterators.allMatch(iterator, task -> task.getOperator().getInnermostLoop() == loop, true ) : String.format("There are different loops in the stage with the tasks %s.", this.allTasks.stream() .map(task -> new Tuple<>(task, task.getOperator().getInnermostLoop())) .collect(Collectors.toList()) ); ExecutionStageLoop executionStageLoop = null; if (loop != null) { executionStageLoop = StageAssignmentTraversal.this.stageLoops.computeIfAbsent(loop, ExecutionStageLoop::new); } final ExecutionStage executionStage = this.platformExecution.createStage(executionStageLoop, this.sequenceNumber); for (ExecutionTask task : this.allTasks) { executionStage.addTask(task); if (this.checkIfStartTask(task)) { executionStage.markAsStartTask(task); } if (this.checkIfTerminalTask(task)) { executionStage.markAsTerminalTask(task); } } assert !executionStage.getTerminalTasks().isEmpty() : String.format("No terminal tasks among %s.", this.allTasks); return executionStage; }