QueryExecution.java
/*
* 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.common.analyzer.PreparedQuery;
import com.facebook.presto.common.resourceGroups.QueryType;
import com.facebook.presto.common.type.Type;
import com.facebook.presto.execution.QueryTracker.TrackedQuery;
import com.facebook.presto.execution.StateMachine.StateChangeListener;
import com.facebook.presto.memory.VersionedMemoryPoolId;
import com.facebook.presto.server.BasicQueryInfo;
import com.facebook.presto.spi.WarningCollector;
import com.facebook.presto.spi.analyzer.AnalyzerProvider;
import com.facebook.presto.spi.resourceGroups.ResourceGroupQueryLimits;
import com.facebook.presto.spi.security.AccessControl;
import com.facebook.presto.sql.planner.Plan;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.util.concurrent.ListenableFuture;
import io.airlift.units.Duration;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
import static java.util.Objects.requireNonNull;
/**
* Tracks a query that is being executed on the cluster. Provides methods to start, cancel or observe the execution of the query
* See also {@link QueryManager} for operations related to query lifecycle.
*/
public interface QueryExecution
extends TrackedQuery
{
QueryState getState();
ListenableFuture<QueryState> getStateChange(QueryState currentState);
void addStateChangeListener(StateChangeListener<QueryState> stateChangeListener);
void addOutputInfoListener(Consumer<QueryOutputInfo> listener);
Plan getQueryPlan();
BasicQueryInfo getBasicQueryInfo();
QueryInfo getQueryInfo();
String getSlug();
int getRetryCount();
Duration getTotalCpuTime();
long getRawInputDataSizeInBytes();
long getWrittenIntermediateDataSizeInBytes();
long getOutputPositions();
long getOutputDataSizeInBytes();
int getRunningTaskCount();
long getUserMemoryReservationInBytes();
long getTotalMemoryReservationInBytes();
VersionedMemoryPoolId getMemoryPool();
Optional<ResourceGroupQueryLimits> getResourceGroupQueryLimits();
void setResourceGroupQueryLimits(ResourceGroupQueryLimits resourceGroupQueryLimits);
void setMemoryPool(VersionedMemoryPoolId poolId);
void start();
void cancelQuery();
void cancelStage(StageId stageId);
void recordHeartbeat();
/**
* Add a listener for the final query info. This notification is guaranteed to be fired only once.
* Listener is always notified asynchronously using a dedicated notification thread pool so, care should
* be taken to avoid leaking {@code this} when adding a listener in a constructor.
*
* @param stateChangeListener The listener to add.
*/
void addFinalQueryInfoListener(StateChangeListener<QueryInfo> stateChangeListener);
interface QueryExecutionFactory<T extends QueryExecution>
{
T createQueryExecution(
AnalyzerProvider analyzerProvider,
PreparedQuery preparedQuery,
QueryStateMachine stateMachine,
String slug,
int retryCount,
WarningCollector warningCollector,
Optional<QueryType> queryType,
AccessControl accessControl,
String query);
}
/**
* Output schema and buffer URIs for query. The info will always contain column names and types. Buffer locations will always
* contain the full location set, but may be empty. Users of this data should keep a private copy of the seen buffers to
* handle out of order events from the listener. Once noMoreBufferLocations is set the locations will never change, and
* it is guaranteed that all previously sent locations are contained in the buffer locations.
*/
class QueryOutputInfo
{
private final List<String> columnNames;
private final List<Type> columnTypes;
private final Map<URI, TaskId> bufferLocations;
private final boolean noMoreBufferLocations;
public QueryOutputInfo(List<String> columnNames, List<Type> columnTypes, Map<URI, TaskId> bufferLocations, boolean noMoreBufferLocations)
{
this.columnNames = ImmutableList.copyOf(requireNonNull(columnNames, "columnNames is null"));
this.columnTypes = ImmutableList.copyOf(requireNonNull(columnTypes, "columnTypes is null"));
this.bufferLocations = ImmutableMap.copyOf(requireNonNull(bufferLocations, "bufferLocations is null"));
this.noMoreBufferLocations = noMoreBufferLocations;
}
public List<String> getColumnNames()
{
return columnNames;
}
public List<Type> getColumnTypes()
{
return columnTypes;
}
public Map<URI, TaskId> getBufferLocations()
{
return bufferLocations;
}
public boolean isNoMoreBufferLocations()
{
return noMoreBufferLocations;
}
}
}