blob: 1e9f1b7b7551bd9df182d5d8de2bcc2cdaaa42ec [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.hadoop.hive.ql.udf;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.apache.hadoop.hive.common.classification.InterfaceAudience.Public;
import org.apache.hadoop.hive.common.classification.InterfaceStability.Evolving;
/**
* UDFType annotations are used to describe properties of a UDF. This gives
* important information to the optimizer.
* If the UDF is not deterministic, or if it is stateful, it is necessary to
* annotate it as such for correctness.
*
*/
@Public
@Evolving
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface UDFType {
/**
* Certain optimizations should not be applied if UDF is not deterministic.
* Deterministic UDF returns same result each time it is invoked with a
* particular input. This determinism just needs to hold within the context of
* a query.
*
* @return true if the UDF is deterministic
*/
boolean deterministic() default true;
/**
* If a UDF stores state based on the sequence of records it has processed, it
* is stateful. A stateful UDF cannot be used in certain expressions such as
* case statement and certain optimizations such as AND/OR short circuiting
* don't apply for such UDFs, as they need to be invoked for each record.
* row_sequence is an example of stateful UDF. A stateful UDF is considered to
* be non-deterministic, irrespective of what deterministic() returns.
*
* @return true
*/
boolean stateful() default false;
/**
* Property used to mark functions like current_timestamp, current_date, current_database().
* These functions aren't actually deterministic (the values can change between queries),
* but the value returned by these functions should be consistent for the life of the query,
* so constant folding still applies for these functions.
* Queries using these functions should not be eligible for materialized views or query caching.
* @return true if the function is a runtime constant
*/
boolean runtimeConstant() default false;
/**
* A UDF is considered distinctLike if the UDF can be evaluated on just the
* distinct values of a column. Examples include min and max UDFs. This
* information is used by metadata-only optimizer.
*
* @return true if UDF is distinctLike
*/
boolean distinctLike() default false;
/**
* Using in analytical functions to specify that UDF implies an ordering
*
* @return true if the function implies order
*/
boolean impliesOrder() default false;
/**
* Whether result of this operation will be altered by reordering its
* children.
*
* @return true if commutative law applies to this function
*/
boolean commutative() default false;
}