/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.facebook.presto.execution; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.planner.PlanFragment; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableList; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import java.net.URI; import java.util.List; import java.util.Optional; import static com.google.common.base.MoreObjects.toStringHelper; import static java.util.Objects.requireNonNull; @Immutable public class StageInfo { private final StageId stageId; private final StageState state; private final URI self; private final PlanFragment plan; private final List<Type> types; private final StageStats stageStats; private final List<TaskInfo> tasks; private final List<StageInfo> subStages; private final ExecutionFailureInfo failureCause; @JsonCreator public StageInfo( @JsonProperty("stageId") StageId stageId, @JsonProperty("state") StageState state, @JsonProperty("self") URI self, @JsonProperty("plan") @Nullable PlanFragment plan, @JsonProperty("types") List<Type> types, @JsonProperty("stageStats") StageStats stageStats, @JsonProperty("tasks") List<TaskInfo> tasks, @JsonProperty("subStages") List<StageInfo> subStages, @JsonProperty("failureCause") ExecutionFailureInfo failureCause) { requireNonNull(stageId, "stageId is null"); requireNonNull(state, "state is null"); requireNonNull(self, "self is null"); requireNonNull(stageStats, "stageStats is null"); requireNonNull(tasks, "tasks is null"); requireNonNull(subStages, "subStages is null"); this.stageId = stageId; this.state = state; this.self = self; this.plan = plan; this.types = types; this.stageStats = stageStats; this.tasks = ImmutableList.copyOf(tasks); this.subStages = subStages; this.failureCause = failureCause; } @JsonProperty public StageId getStageId() { return stageId; } @JsonProperty public StageState getState() { return state; } @JsonProperty public URI getSelf() { return self; } @JsonProperty @Nullable public PlanFragment getPlan() { return plan; } @JsonProperty public List<Type> getTypes() { return types; } @JsonProperty public StageStats getStageStats() { return stageStats; } @JsonProperty public List<TaskInfo> getTasks() { return tasks; } @JsonProperty public List<StageInfo> getSubStages() { return subStages; } @JsonProperty public ExecutionFailureInfo getFailureCause() { return failureCause; } public boolean isFinalStageInfo() { return state.isDone() && tasks.stream().allMatch(taskInfo -> taskInfo.getTaskStatus().getState().isDone()); } @Override public String toString() { return toStringHelper(this) .add("stageId", stageId) .add("state", state) .toString(); } public static List<StageInfo> getAllStages(Optional<StageInfo> stageInfo) { ImmutableList.Builder<StageInfo> collector = ImmutableList.builder(); addAllStages(stageInfo, collector); return collector.build(); } private static void addAllStages(Optional<StageInfo> stageInfo, ImmutableList.Builder<StageInfo> collector) { stageInfo.ifPresent(stage -> { collector.add(stage); stage.getSubStages().stream() .forEach(subStage -> addAllStages(Optional.ofNullable(subStage), collector)); }); } public boolean isCompleteInfo() { return state.isDone() && tasks.stream().allMatch(TaskInfo::isComplete); } }