/*
 * 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();
  }
}
