private void typeAffinity(String methodName, TypeInfo inputType, int expectedNumFoundMethods, Class expectedFoundType) { List<Method> mlist = getMethods(TestUDF.class, methodName); assertEquals(true, 1 < mlist.size()); List<TypeInfo> inputTypes = new ArrayList<TypeInfo>(); inputTypes.add(inputType); // narrow down the possible choices based on type affinity FunctionRegistry.filterMethodsByTypeAffinity(mlist, inputTypes); assertEquals(expectedNumFoundMethods, mlist.size()); if (expectedNumFoundMethods == 1) { assertEquals(expectedFoundType, mlist.get(0).getParameterTypes()[0]); } }
public void testDeterminism() throws Exception { checkDeterministicFn(getUDF("+")); checkDeterministicFn(getUDF("ascii")); checkNondeterministicFn(getUDF("rand")); checkNondeterministicFn(getUDF("uuid")); checkRuntimeConstant(getUDF("current_database")); checkRuntimeConstant(getUDF("current_date")); checkRuntimeConstant(getUDF("current_timestamp")); checkRuntimeConstant(getUDF("current_user")); checkRuntimeConstant(getUDF("logged_in_user")); } }
public void testCommonClass() { common(TypeInfoFactory.intTypeInfo, TypeInfoFactory.decimalTypeInfo, TypeInfoFactory.decimalTypeInfo); common(TypeInfoFactory.stringTypeInfo, TypeInfoFactory.decimalTypeInfo, TypeInfoFactory.stringTypeInfo); common(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.decimalTypeInfo, TypeInfoFactory.doubleTypeInfo); common(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.stringTypeInfo, TypeInfoFactory.stringTypeInfo); common(TypeInfoFactory.stringTypeInfo, varchar10, TypeInfoFactory.stringTypeInfo); common(varchar10, TypeInfoFactory.stringTypeInfo, TypeInfoFactory.stringTypeInfo); common(TypeInfoFactory.stringTypeInfo, char10, TypeInfoFactory.stringTypeInfo); common(char10, TypeInfoFactory.stringTypeInfo, TypeInfoFactory.stringTypeInfo); // common class between char/varchar is string? common(char5, varchar10, TypeInfoFactory.stringTypeInfo); }
private void checkRuntimeConstant(GenericUDF udf) { assertFalse(FunctionRegistry.isDeterministic(udf)); assertTrue(FunctionRegistry.isRuntimeConstant(udf)); assertTrue(FunctionRegistry.isConsistentWithinQuery(udf)); }
private void verify(Class udf, String name, TypeInfo ta, TypeInfo tb, Class a, Class b, boolean throwException) { List<TypeInfo> args = new LinkedList<TypeInfo>(); args.add(ta); args.add(tb); Method result = null; try { result = FunctionRegistry.getMethodInternal(udf, name, false, args); } catch (UDFArgumentException e) { assert(throwException); return; } assert(!throwException); assertEquals(2, result.getParameterTypes().length); assertEquals(a, result.getParameterTypes()[0]); assertEquals(b, result.getParameterTypes()[1]); }
private void checkNondeterministicFn(GenericUDF udf) { assertFalse(FunctionRegistry.isDeterministic(udf)); assertFalse(FunctionRegistry.isRuntimeConstant(udf)); assertFalse(FunctionRegistry.isConsistentWithinQuery(udf)); }
public void testCommonClassComparison() { comparison(TypeInfoFactory.intTypeInfo, TypeInfoFactory.decimalTypeInfo, TypeInfoFactory.decimalTypeInfo); comparison(TypeInfoFactory.stringTypeInfo, TypeInfoFactory.decimalTypeInfo, TypeInfoFactory.doubleTypeInfo); comparison(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.decimalTypeInfo, TypeInfoFactory.doubleTypeInfo); comparison(TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.stringTypeInfo, TypeInfoFactory.doubleTypeInfo); comparison(TypeInfoFactory.dateTypeInfo, TypeInfoFactory.stringTypeInfo, TypeInfoFactory.dateTypeInfo); comparison(TypeInfoFactory.stringTypeInfo, TypeInfoFactory.dateTypeInfo, TypeInfoFactory.dateTypeInfo); comparison(TypeInfoFactory.timestampTypeInfo, TypeInfoFactory.stringTypeInfo, TypeInfoFactory.timestampTypeInfo); comparison(TypeInfoFactory.stringTypeInfo, TypeInfoFactory.timestampTypeInfo, TypeInfoFactory.timestampTypeInfo); comparison(TypeInfoFactory.intTypeInfo, TypeInfoFactory.timestampTypeInfo, TypeInfoFactory.doubleTypeInfo); comparison(TypeInfoFactory.timestampTypeInfo, TypeInfoFactory.intTypeInfo, TypeInfoFactory.doubleTypeInfo); comparison(TypeInfoFactory.timestampTypeInfo, TypeInfoFactory.dateTypeInfo, TypeInfoFactory.timestampTypeInfo); comparison(TypeInfoFactory.stringTypeInfo, varchar10, TypeInfoFactory.stringTypeInfo); comparison(varchar10, TypeInfoFactory.stringTypeInfo, TypeInfoFactory.stringTypeInfo); comparison(varchar5, varchar10, varchar10); comparison(TypeInfoFactory.stringTypeInfo, char10, TypeInfoFactory.stringTypeInfo);
public void testBuiltInFunction() throws Exception { FunctionInfo functionInfo = FunctionRegistry.getFunctionInfo("ln"); assertTrue(functionInfo.isBuiltIn()); assertTrue(functionInfo.isNative()); }
private void checkDeterministicFn(GenericUDF udf) { assertTrue(FunctionRegistry.isDeterministic(udf)); assertFalse(FunctionRegistry.isRuntimeConstant(udf)); assertTrue(FunctionRegistry.isConsistentWithinQuery(udf)); }
private void implicit(TypeInfo a, TypeInfo b, boolean convertible) { assertEquals(convertible, TypeInfoUtils.implicitConvertible(a, b)); }
public void testRegisterTemporaryFunctions() throws Exception { FunctionResource[] emptyResources = new FunctionResource[] {}; // UDF FunctionRegistry.registerTemporaryUDF("tmp_ln", UDFLn.class, emptyResources); FunctionInfo functionInfo = FunctionRegistry.getFunctionInfo("tmp_ln"); assertFalse(functionInfo.isNative()); // GenericUDF FunctionRegistry.registerTemporaryUDF("tmp_concat", GenericUDFConcat.class, emptyResources); functionInfo = FunctionRegistry.getFunctionInfo("tmp_concat"); assertFalse(functionInfo.isNative()); // GenericUDAF FunctionRegistry.registerTemporaryUDF("tmp_max",GenericUDAFMax.class, emptyResources); functionInfo = FunctionRegistry.getFunctionInfo("tmp_max"); assertFalse(functionInfo.isNative()); functionInfo = FunctionRegistry.getWindowFunctionInfo("tmp_max"); assertFalse(functionInfo.isNative()); // UDTF FunctionRegistry.registerTemporaryUDF("tmp_explode", GenericUDTFExplode.class, emptyResources); functionInfo = FunctionRegistry.getFunctionInfo("tmp_explode"); assertFalse(functionInfo.isNative()); }
public void testIsPermanentFunction() throws Exception { // Setup exprNode GenericUDF udf = new GenericUDFCurrentTimestamp(); List<ExprNodeDesc> children = new ArrayList<ExprNodeDesc>(); ExprNodeGenericFuncDesc fnExpr = new ExprNodeGenericFuncDesc(TypeInfoFactory.timestampTypeInfo, udf, children); assertFalse("Function not added as permanent yet", FunctionRegistry.isPermanentFunction(fnExpr)); // Now register as permanent function FunctionResource[] emptyResources = new FunctionResource[] {}; FunctionRegistry.registerPermanentFunction("default.perm_current_timestamp", GenericUDFCurrentTimestamp.class.getName(), true, emptyResources); assertTrue("Function should now be recognized as permanent function", FunctionRegistry.isPermanentFunction(fnExpr)); }
private void common(TypeInfo a, TypeInfo b, TypeInfo result) { assertEquals(result, FunctionRegistry.getCommonClass(a,b)); }
assertTrue(functionInfo.isPersistent()); assertTrue(functionInfo.isNative()); assertFalse(functionInfo.isBuiltIn()); functionInfo = FunctionRegistry.getFunctionInfo("default.perm_ln"); assertTrue(functionInfo.isPersistent()); assertTrue(functionInfo.isNative()); assertFalse(functionInfo.isBuiltIn()); GenericUDFConcat.class.getName(), true, emptyResources); functionInfo = FunctionRegistry.getFunctionInfo("default.perm_concat"); assertTrue(functionInfo.isPersistent()); assertTrue(functionInfo.isNative()); assertFalse(functionInfo.isBuiltIn()); GenericUDAFMax.class.getName(), true, emptyResources); functionInfo = FunctionRegistry.getFunctionInfo("default.perm_max"); assertTrue(functionInfo.isPersistent()); functionInfo = FunctionRegistry.getWindowFunctionInfo("default.perm_max"); assertTrue(functionInfo.isPersistent()); assertTrue(functionInfo.isNative()); assertFalse(functionInfo.isBuiltIn()); GenericUDTFExplode.class.getName(), true, emptyResources); functionInfo = FunctionRegistry.getFunctionInfo("default.perm_explode"); assertTrue(functionInfo.isPersistent()); assertTrue(functionInfo.isNative()); assertFalse(functionInfo.isBuiltIn());
private void unionAll(TypeInfo a, TypeInfo b, TypeInfo result) { assertEquals(result, FunctionRegistry.getCommonClassForUnionAll(a,b)); }
private void comparison(TypeInfo a, TypeInfo b, TypeInfo result) { assertEquals(result, FunctionRegistry.getCommonClassForComparison(a,b)); }
public void testGetTypeInfoForPrimitiveCategory() { // varchar should take string length into account. // varchar(5), varchar(10) => varchar(10) assertEquals(varchar10, FunctionRegistry.getTypeInfoForPrimitiveCategory( (PrimitiveTypeInfo) varchar5, (PrimitiveTypeInfo) varchar10, PrimitiveCategory.VARCHAR)); assertEquals(varchar10, FunctionRegistry.getTypeInfoForPrimitiveCategory( (PrimitiveTypeInfo) varchar10, (PrimitiveTypeInfo) varchar5, PrimitiveCategory.VARCHAR)); assertEquals(char10, FunctionRegistry.getTypeInfoForPrimitiveCategory( (PrimitiveTypeInfo) char5, (PrimitiveTypeInfo) char10, PrimitiveCategory.CHAR)); assertEquals(char10, FunctionRegistry.getTypeInfoForPrimitiveCategory( (PrimitiveTypeInfo) char10, (PrimitiveTypeInfo) char5, PrimitiveCategory.CHAR)); assertEquals(varchar10, FunctionRegistry.getTypeInfoForPrimitiveCategory( (PrimitiveTypeInfo) varchar5, (PrimitiveTypeInfo) char10, PrimitiveCategory.VARCHAR)); // non-qualified types should simply return the TypeInfo associated with that type assertEquals(TypeInfoFactory.stringTypeInfo, FunctionRegistry.getTypeInfoForPrimitiveCategory( (PrimitiveTypeInfo) varchar10, TypeInfoFactory.stringTypeInfo, PrimitiveCategory.STRING)); assertEquals(TypeInfoFactory.stringTypeInfo, FunctionRegistry.getTypeInfoForPrimitiveCategory( TypeInfoFactory.stringTypeInfo, TypeInfoFactory.stringTypeInfo, PrimitiveCategory.STRING)); assertEquals(TypeInfoFactory.doubleTypeInfo, FunctionRegistry.getTypeInfoForPrimitiveCategory( TypeInfoFactory.doubleTypeInfo, TypeInfoFactory.stringTypeInfo, PrimitiveCategory.DOUBLE)); }