blob: 414d583d85154e3af9d9fe4a402da2508fe4c99d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.drill.exec.ops;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import org.apache.drill.metastore.MetastoreRegistry;
import org.apache.drill.shaded.guava.com.google.common.annotations.VisibleForTesting;
import org.apache.calcite.schema.SchemaPlus;
import org.apache.drill.common.config.DrillConfig;
import org.apache.drill.exec.compile.CodeCompiler;
import org.apache.drill.exec.exception.ClassTransformationException;
import org.apache.drill.exec.expr.ClassGenerator;
import org.apache.drill.exec.expr.CodeGenerator;
import org.apache.drill.exec.expr.fn.FunctionLookupContext;
import org.apache.drill.exec.memory.BufferAllocator;
import org.apache.drill.exec.ops.QueryContext.SqlStatementType;
import org.apache.drill.exec.physical.base.PhysicalOperator;
import org.apache.drill.exec.proto.ExecProtos;
import org.apache.drill.exec.proto.UserBitShared.QueryId;
import org.apache.drill.exec.server.options.OptionManager;
import org.apache.drill.exec.testing.ExecutionControls;
import org.apache.drill.exec.work.filter.RuntimeFilterWritable;
import io.netty.buffer.DrillBuf;
/**
* Provides the resources required by a non-exchange operator to execute.
*/
public interface FragmentContext extends UdfUtilities, AutoCloseable {
/**
* Returns the UDF registry.
* @return the UDF registry
*/
FunctionLookupContext getFunctionRegistry();
/**
* Returns a read-only version of the session options.
* @return the session options
*/
OptionManager getOptions();
boolean isImpersonationEnabled();
/**
* Generates code for a class given a {@link ClassGenerator},
* and returns a single instance of the generated class. (Note
* that the name is a misnomer, it would be better called
* <tt>getImplementationInstance</tt>.)
*
* @param cg the class generator
* @return an instance of the generated class
*/
<T> T getImplementationClass(final ClassGenerator<T> cg)
throws ClassTransformationException, IOException;
/**
* Generates code for a class given a {@link CodeGenerator},
* and returns a single instance of the generated class. (Note
* that the name is a misnomer, it would be better called
* <tt>getImplementationInstance</tt>.)
*
* @param cg the code generator
* @return an instance of the generated class
*/
<T> T getImplementationClass(final CodeGenerator<T> cg)
throws ClassTransformationException, IOException;
/**
* Generates code for a class given a {@link ClassGenerator}, and returns the
* specified number of instances of the generated class. (Note that the name
* is a misnomer, it would be better called
* <tt>getImplementationInstances</tt>.)
*
* @param cg the class generator
* @return list of instances of the generated class
*/
<T> List<T> getImplementationClass(final ClassGenerator<T> cg, final int instanceCount)
throws ClassTransformationException, IOException;
/**
* Returns the statement type (e.g. SELECT, CTAS, ANALYZE) from the query context.
*
* @return query statement type {@link SqlStatementType}, if known.
*/
SqlStatementType getSQLStatementType();
/**
* Get this node's identity.
* @return A DrillbitEndpoint object.
*/
<T> List<T> getImplementationClass(final CodeGenerator<T> cg, final int instanceCount)
throws ClassTransformationException, IOException;
/**
* Return the set of execution controls used to inject faults into running
* code for testing.
*
* @return the execution controls
*/
ExecutionControls getExecutionControls();
/**
* Returns the Drill configuration for this run. Note that the config is
* global and immutable.
*
* @return the Drill configuration
*/
DrillConfig getConfig();
CodeCompiler getCompiler();
ExecutorService getScanDecodeExecutor();
ExecutorService getScanExecutor();
ExecutorService getExecutor();
ExecutorState getExecutorState();
BufferAllocator getNewChildAllocator(final String operatorName,
final int operatorId,
final long initialReservation,
final long maximumReservation);
ExecProtos.FragmentHandle getHandle();
BufferAllocator getAllocator();
/**
* @return ID {@link java.util.UUID} of the current query
*/
QueryId getQueryId();
/**
* @return The string representation of the ID {@link java.util.UUID} of the current query
*/
String getQueryIdString();
OperatorContext newOperatorContext(PhysicalOperator popConfig);
OperatorContext newOperatorContext(PhysicalOperator popConfig, OperatorStats stats);
SchemaPlus getFullRootSchema();
String getQueryUserName();
String getFragIdString();
DrillBuf replace(DrillBuf old, int newSize);
@Override
DrillBuf getManagedBuffer();
DrillBuf getManagedBuffer(int size);
@Override
void close();
/**
* Add a RuntimeFilter when the RuntimeFilter receiver belongs to the same MinorFragment.
*
* @param runtimeFilter runtime filter
*/
void addRuntimeFilter(RuntimeFilterWritable runtimeFilter);
RuntimeFilterWritable getRuntimeFilter(long rfIdentifier);
/**
* Get the RuntimeFilter with a blocking wait, if the waiting option is enabled.
*
* @param rfIdentifier runtime filter identifier
* @param maxWaitTime max wait time
* @param timeUnit time unit
* @return the RFW or null
*/
RuntimeFilterWritable getRuntimeFilter(long rfIdentifier, long maxWaitTime, TimeUnit timeUnit);
/**
* Get instance of Metastore registry to obtain Metastore instance if needed.
*
* @return Metastore registry
*/
MetastoreRegistry getMetastoreRegistry();
interface ExecutorState {
/**
* Tells individual operations whether they should continue. In some cases, an external event (typically cancellation)
* will mean that the fragment should prematurely exit execution. Long running operations should check this every so
* often so that Drill is responsive to cancellation operations.
*
* @return False if the action should terminate immediately, true if everything is okay.
*/
boolean shouldContinue();
/**
* Inform the executor if a exception occurs and fragment should be failed.
*
* @param t
* The exception that occurred.
*/
void fail(final Throwable t);
@VisibleForTesting
@Deprecated
boolean isFailed();
@VisibleForTesting
@Deprecated
Throwable getFailureCause();
}
}