/* * 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.SessionRepresentation; import com.facebook.presto.client.FailureInfo; import com.facebook.presto.spi.ErrorCode; import com.facebook.presto.spi.ErrorType; import com.facebook.presto.spi.QueryId; import com.facebook.presto.spi.memory.MemoryPoolId; import com.facebook.presto.transaction.TransactionId; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import java.net.URI; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import static com.facebook.presto.execution.StageInfo.getAllStages; import static com.google.common.base.MoreObjects.toStringHelper; import static java.util.Objects.requireNonNull; @Immutable public class QueryInfo { private final QueryId queryId; private final SessionRepresentation session; private final QueryState state; private final MemoryPoolId memoryPool; private final boolean scheduled; private final URI self; private final List<String> fieldNames; private final String query; private final QueryStats queryStats; private final Map<String, String> setSessionProperties; private final Set<String> resetSessionProperties; private final Map<String, String> addedPreparedStatements; private final Set<String> deallocatedPreparedStatements; private final Optional<TransactionId> startedTransactionId; private final boolean clearTransactionId; private final String updateType; private final Optional<StageInfo> outputStage; private final FailureInfo failureInfo; private final ErrorType errorType; private final ErrorCode errorCode; private final Set<Input> inputs; private final Optional<Output> output; private final boolean completeInfo; private final Optional<String> resourceGroupName; @JsonCreator public QueryInfo( @JsonProperty("queryId") QueryId queryId, @JsonProperty("session") SessionRepresentation session, @JsonProperty("state") QueryState state, @JsonProperty("memoryPool") MemoryPoolId memoryPool, @JsonProperty("scheduled") boolean scheduled, @JsonProperty("self") URI self, @JsonProperty("fieldNames") List<String> fieldNames, @JsonProperty("query") String query, @JsonProperty("queryStats") QueryStats queryStats, @JsonProperty("setSessionProperties") Map<String, String> setSessionProperties, @JsonProperty("resetSessionProperties") Set<String> resetSessionProperties, @JsonProperty("addedPreparedStatements") Map<String, String> addedPreparedStatements, @JsonProperty("deallocatedPreparedStatements") Set<String> deallocatedPreparedStatements, @JsonProperty("startedTransactionId") Optional<TransactionId> startedTransactionId, @JsonProperty("clearTransactionId") boolean clearTransactionId, @JsonProperty("updateType") String updateType, @JsonProperty("outputStage") Optional<StageInfo> outputStage, @JsonProperty("failureInfo") FailureInfo failureInfo, @JsonProperty("errorCode") ErrorCode errorCode, @JsonProperty("inputs") Set<Input> inputs, @JsonProperty("output") Optional<Output> output, @JsonProperty("completeInfo") boolean completeInfo, @JsonProperty("resourceGroupName") Optional<String> resourceGroupName) { requireNonNull(queryId, "queryId is null"); requireNonNull(session, "session is null"); requireNonNull(state, "state is null"); requireNonNull(self, "self is null"); requireNonNull(fieldNames, "fieldNames is null"); requireNonNull(queryStats, "queryStats is null"); requireNonNull(setSessionProperties, "setSessionProperties is null"); requireNonNull(resetSessionProperties, "resetSessionProperties is null"); requireNonNull(addedPreparedStatements, "addedPreparedStatemetns is null"); requireNonNull(deallocatedPreparedStatements, "deallocatedPreparedStatements is null"); requireNonNull(startedTransactionId, "startedTransactionId is null"); requireNonNull(query, "query is null"); requireNonNull(outputStage, "outputStage is null"); requireNonNull(inputs, "inputs is null"); requireNonNull(output, "output is null"); requireNonNull(resourceGroupName, "resourceGroupName is null"); this.queryId = queryId; this.session = session; this.state = state; this.memoryPool = requireNonNull(memoryPool, "memoryPool is null"); this.scheduled = scheduled; this.self = self; this.fieldNames = ImmutableList.copyOf(fieldNames); this.query = query; this.queryStats = queryStats; this.setSessionProperties = ImmutableMap.copyOf(setSessionProperties); this.resetSessionProperties = ImmutableSet.copyOf(resetSessionProperties); this.addedPreparedStatements = ImmutableMap.copyOf(addedPreparedStatements); this.deallocatedPreparedStatements = ImmutableSet.copyOf(deallocatedPreparedStatements); this.startedTransactionId = startedTransactionId; this.clearTransactionId = clearTransactionId; this.updateType = updateType; this.outputStage = outputStage; this.failureInfo = failureInfo; this.errorType = errorCode == null ? null : errorCode.getType(); this.errorCode = errorCode; this.inputs = ImmutableSet.copyOf(inputs); this.output = output; this.completeInfo = completeInfo; this.resourceGroupName = resourceGroupName; } @JsonProperty public QueryId getQueryId() { return queryId; } @JsonProperty public SessionRepresentation getSession() { return session; } @JsonProperty public QueryState getState() { return state; } @JsonProperty public MemoryPoolId getMemoryPool() { return memoryPool; } @JsonProperty public boolean isScheduled() { return scheduled; } @JsonProperty public URI getSelf() { return self; } @JsonProperty public List<String> getFieldNames() { return fieldNames; } @JsonProperty public String getQuery() { return query; } @JsonProperty public QueryStats getQueryStats() { return queryStats; } @JsonProperty public Map<String, String> getSetSessionProperties() { return setSessionProperties; } @JsonProperty public Set<String> getResetSessionProperties() { return resetSessionProperties; } @JsonProperty public Map<String, String> getAddedPreparedStatements() { return addedPreparedStatements; } @JsonProperty public Set<String> getDeallocatedPreparedStatements() { return deallocatedPreparedStatements; } @JsonProperty public Optional<TransactionId> getStartedTransactionId() { return startedTransactionId; } @JsonProperty public boolean isClearTransactionId() { return clearTransactionId; } @Nullable @JsonProperty public String getUpdateType() { return updateType; } @JsonProperty public Optional<StageInfo> getOutputStage() { return outputStage; } @Nullable @JsonProperty public FailureInfo getFailureInfo() { return failureInfo; } @Nullable @JsonProperty public ErrorType getErrorType() { return errorType; } @Nullable @JsonProperty public ErrorCode getErrorCode() { return errorCode; } @JsonProperty public boolean isFinalQueryInfo() { return state.isDone() && getAllStages(outputStage).stream().allMatch(StageInfo::isFinalStageInfo); } @JsonProperty public Set<Input> getInputs() { return inputs; } @JsonProperty public Optional<Output> getOutput() { return output; } @JsonProperty public Optional<String> getResourceGroupName() { return resourceGroupName; } @Override public String toString() { return toStringHelper(this) .add("queryId", queryId) .add("state", state) .add("fieldNames", fieldNames) .toString(); } public boolean isCompleteInfo() { return completeInfo; } }