Java 示例:AddAnyInts
以下示例显示了将两个或更多整数相加的 Java ScalarFunction
的实施。
有关完整的源代码,请参阅示例(位于 /opt/vertica/sdk/examples/JavaUDx/ScalarFunctions
中)中的 AddAnyIntsInfo.java
。
加载和使用示例
加载库并创建函数,如下所示:
=> CREATE LIBRARY JavaScalarFunctions AS '/home/dbadmin/JavaScalarLib.jar' LANGUAGE 'JAVA';
CREATE LIBRARY
=> CREATE FUNCTION addAnyInts AS LANGUAGE 'Java' NAME 'com.vertica.JavaLibs.AddAnyIntsInfo'
LIBRARY JavaScalarFunctions;
CREATE FUNCTION
使用两个或多个整数实参调用函数:
=> SELECT addAnyInts(1,2);
addAnyInts
------------
3
(1 row)
=> SELECT addAnyInts(1,2,3,40,50,60,70,80,900);
addAnyInts
------------
1206
(1 row)
如果使用太少的实参或使用非整数实参调用函数,则产生由 processBlock()
方法生成的错误。UDx 负责确保用户向函数提供正确的参数个数和类型,如果无法处理参数,它应退出并显示错误。
函数实施
此示例中的大部分工作由 processBlock()
方法执行。该函数将对通过 BlockReader
对象传入的实参执行两次检查:
-
是否存在至少两个参数。
-
是否所有实参的数据类型均为整数。
多态 UDx 负责确定传入的所有输入是否有效。
processBlock()
方法验证其参数之后,它会在所有参数之中循环并将其相加。
@Override
public void processBlock(ServerInterface srvInterface,
BlockReader arg_reader,
BlockWriter res_writer)
throws UdfException, DestroyInvocation
{
SizedColumnTypes inTypes = arg_reader.getTypeMetaData();
ArrayList<Integer> argCols = new ArrayList<Integer>(); // Argument column indexes.
inTypes.getArgumentColumns(argCols);
// While we have inputs to process
do {
long sum = 0;
for (int i = 0; i < argCols.size(); ++i){
long a = arg_reader.getLong(i);
sum += a;
}
res_writer.setLong(sum);
res_writer.next();
} while (arg_reader.next());
}
}
工厂实施
工厂在 getPrototype()
函数中声明实参的数量和类型。
@Override
public void getPrototype(ServerInterface srvInterface,
ColumnTypes argTypes,
ColumnTypes returnType)
{
argTypes.addAny();
returnType.addInt();
}