| /* |
| * 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 io.netty.buffer.DrillBuf; |
| import org.apache.drill.common.types.TypeProtos.MinorType; |
| import org.apache.drill.exec.expr.holders.ValueHolder; |
| import org.apache.drill.exec.physical.resultSet.ResultSetLoader; |
| import org.apache.drill.exec.server.DrillbitContext; |
| import org.apache.drill.exec.server.options.OptionManager; |
| import org.apache.drill.exec.store.PartitionExplorer; |
| import com.google.common.base.Function; |
| import com.google.common.collect.ImmutableMap; |
| |
| /** |
| * Defines the query state and shared resources available to UDFs through |
| * injectables. For use in a function, include a {@link javax.inject.Inject} |
| * annotation on a UDF class member with any of the types available through |
| * this interface. |
| */ |
| public interface UdfUtilities { |
| |
| // Map between injectable classes and their respective getter methods |
| // used for code generation |
| ImmutableMap<Class<?>, String> INJECTABLE_GETTER_METHODS = |
| new ImmutableMap.Builder<Class<?>, String>() |
| .put(DrillBuf.class, "getManagedBuffer") |
| .put(PartitionExplorer.class, "getPartitionExplorer") |
| .put(ContextInformation.class, "getContextInformation") |
| .put(OptionManager.class, "getOptions") |
| .put(BufferManager.class, "getManagedBufferManager") |
| .put(DrillbitContext.class, "getDrillbitContext") |
| .put(ResultSetLoader.class, "getResultSetLoader") |
| .build(); |
| |
| |
| /** |
| * Get the context information such as: |
| * - query start time |
| * - root fragment timezone |
| * - query userName |
| * - system userName |
| * - default schema name in current session at the time of query. |
| * |
| * @return - ContextInformation |
| */ |
| ContextInformation getContextInformation(); |
| |
| /** |
| * For UDFs to allocate general purpose intermediate buffers we provide the |
| * DrillBuf type as an injectable, which provides access to an off-heap |
| * buffer that can be tracked by Drill and re-allocated as needed. |
| * |
| * @return - a buffer managed by Drill, connected to the fragment allocator |
| * for memory management |
| */ |
| DrillBuf getManagedBuffer(); |
| |
| /** |
| * A partition explorer allows UDFs to view the sub-partitions below a |
| * particular partition. This allows for the implementation of UDFs to |
| * query against the partition information, without having to read |
| * the actual data contained in the partition. This interface is designed |
| * for UDFs that take only constant inputs, as this interface will only |
| * be useful if we can evaluate the constant UDF at planning time. |
| * |
| * Any function defined to use this interface that is not evaluated |
| * at planning time by the constant folding rule will be querying |
| * the storage plugin for meta-data for each record processed. |
| * |
| * Be sure to check the query plans to see that this expression has already |
| * been evaluated during planning if you write UDFs against this interface. |
| * |
| * See {@link org.apache.drill.exec.expr.fn.impl.DirectoryExplorers} for |
| * example usages of this interface. |
| * |
| * @return - an object for exploring partitions of all available schemas |
| */ |
| PartitionExplorer getPartitionExplorer(); |
| |
| /** |
| * The Drillbit context allows UDFs to view storage information and other pieces |
| * of information about the running system. See the http_get implementation for details. |
| * @return - an object for accessing drillbit information such as storage configs. |
| */ |
| DrillbitContext getDrillbitContext(); |
| |
| ResultSetLoader getResultSetLoader(); |
| |
| /** |
| * Works with value holders cache which holds constant value and its wrapper by type. |
| * If value is absent uses holderInitializer to create holder and adds it to cache. |
| * |
| * @return - a wrapper object for an constant value. |
| */ |
| ValueHolder getConstantValueHolder(String value, MinorType type, Function<DrillBuf, ValueHolder> holderInitializer); |
| } |