diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/SqlFunctionConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/SqlFunctionConverter.java index eea796d..1572775 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/SqlFunctionConverter.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/SqlFunctionConverter.java @@ -1,8 +1,10 @@ package org.apache.hadoop.hive.ql.optimizer.optiq.translator; +import java.lang.annotation.Annotation; import java.util.List; import java.util.Map; +import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.FunctionInfo; import org.apache.hadoop.hive.ql.exec.FunctionRegistry; import org.apache.hadoop.hive.ql.parse.ASTNode; @@ -38,11 +40,10 @@ static final Map optiqToHiveToken; static final Map reverseOperatorMap; - static { Builder builder = new Builder(); - hiveToOptiq = builder.hiveToOptiq; - optiqToHiveToken = builder.optiqToHiveToken; + hiveToOptiq = ImmutableMap.copyOf(builder.hiveToOptiq); + optiqToHiveToken = ImmutableMap.copyOf(builder.optiqToHiveToken); reverseOperatorMap = ImmutableMap.copyOf(builder.reverseOperatorMap); } @@ -53,6 +54,8 @@ public static SqlOperator getOptiqOperator(GenericUDF hiveUDF, public static GenericUDF getHiveUDF(SqlOperator op, RelDataType dt) { String name = reverseOperatorMap.get(op); + if (name == null) + name = op.getName(); FunctionInfo hFn = name != null ? FunctionRegistry.getFunctionInfo(name) : null; if (hFn == null) hFn = handleExplicitCast(op, dt); @@ -137,17 +140,36 @@ public static ASTNode buildAST(SqlOperator op, List children, int i) { } private static String getName(GenericUDF hiveUDF) { + String udfName = null; if (hiveUDF instanceof GenericUDFBridge) { - return ((GenericUDFBridge) hiveUDF).getUdfName(); + udfName = ((GenericUDFBridge) hiveUDF).getUdfName(); } else { - return hiveUDF.getClass().getName(); + Class udfClass = hiveUDF.getClass(); + Annotation udfAnnotation = udfClass.getAnnotation(Description.class); + + if (udfAnnotation != null && udfAnnotation instanceof Description) { + Description udfDescription = (Description) udfAnnotation; + udfName = udfDescription.name(); + } + + if (udfName == null || udfName.isEmpty()) { + udfName = hiveUDF.getClass().getName(); + int indx = udfName.lastIndexOf("."); + if (indx >= 0) { + indx += 1; + udfName = udfName.substring(indx); + } + } } + + return udfName; } private static class Builder { - final Map hiveToOptiq = Maps.newHashMap(); - final Map optiqToHiveToken = Maps.newHashMap(); - final Map reverseOperatorMap = Maps.newHashMap(); + final Map hiveToOptiq = Maps.newHashMap(); + final Map optiqToHiveToken = Maps.newHashMap(); + final Map reverseOperatorMap = Maps.newHashMap(); + Builder() { registerFunction("+", SqlStdOperatorTable.PLUS, hToken(HiveParser.PLUS, "+")); registerFunction("-", SqlStdOperatorTable.MINUS, hToken(HiveParser.MINUS, "-")); @@ -243,9 +265,6 @@ public static SqlOperator getOptiqFn(String hiveUdfName, optiqOp = new SqlFunction(uInf.m_udfName, SqlKind.OTHER_FUNCTION, uInf.m_returnTypeInference, uInf.m_operandTypeInference, uInf.m_operandTypeChecker, SqlFunctionCategory.USER_DEFINED_FUNCTION); - hiveToOptiq.put(hiveUdfName, optiqOp); - HiveToken ht = hToken(HiveParser.TOK_FUNCTION, "TOK_FUNCTION"); - optiqToHiveToken.put(optiqOp, ht); } return optiqOp; @@ -259,9 +278,6 @@ public static SqlAggFunction getOptiqAggFn(String hiveUdfName, optiqAggFn = new OptiqUDAF(uInf.m_udfName, uInf.m_returnTypeInference, uInf.m_operandTypeInference, uInf.m_operandTypeChecker, uInf.m_argTypes, uInf.m_retType); - hiveToOptiq.put(hiveUdfName, optiqAggFn); - HiveToken ht = hToken(HiveParser.TOK_FUNCTION, "TOK_FUNCTION"); - optiqToHiveToken.put(optiqAggFn, ht); } return optiqAggFn;