ScalarFunctionFactory 类
ScalarFunctionFactory
类将向 Vertica 提供有关 UDSF 的元数据:其参数数量和数据类型及其返回值的数据类型。该类还会实例化 ScalarFunction
的子类。
方法
您必须在 ScalarFunctionFactory
子类中实施以下方法:
-
createScalarFunction()
实例化ScalarFunction
子类。如果采用 C++ 进行编写,则您可以使用ScalarFunction
子类的名称调用vt_createFuncObj
宏。此宏会为您分配类并将该类实例化。 -
getPrototype()
会向 Vertica 提供有关 UDSF 的参数和返回类型。除了一个ServerInterface
对象之外,此方法还获取另外两个ColumnTypes
对象。在此函数中唯一需要执行的操作是,对这两个对象调用类函数以构建参数列表和返回值类型。如果返回多个值,则将结果打包为 ROW 类型。
定义工厂类之后,您需要调用 RegisterFactory
宏。此宏可将工厂类的成员实例化,以便 Vertica 可以与该成员交互并提取其中包含的有关 UDSF 的元数据。
声明返回值
如果函数返回特定大小的列(一种长度可变的返回数据类型,例如 VARCHAR)、需要精度的值或多个值,则必须实施 getReturnType()
。此方法由 Vertica 调用,以用于查找在每个结果行中返回的数据的长度和精度。此方法的返回值取决于 processBlock()
方法所返回的数据类型:
-
CHAR、(LONG) VARCHAR、BINARY 和 (LONG) VARBINARY 将返回最大长度。
-
NUMERIC 类型可指定精度和小数位数。
-
TIME 和 TIMESTAMP 值可指定精度(无论是否带有时区均可)。
-
INTERVAL YEAR TO MONTH 可指定范围。
-
INTERVAL DAY TO SECOND 可指定精度和范围。
-
ARRAY 类型将指定元素的最大数量。
如果 UDSF 不返回以上数据类型之一,而返回单个值,则它不需要实施 getReturnType()
方法。
传递到 getReturnType()
方法的输入是一个 SizedColumnTypes
对象,其中包含输入参数类型及其长度。此对象将传递到 processBlock()
函数的一个实例。getReturnType()
的实施必须从该输入提取数据类型和长度,并确定输出行的长度或精度,然后将此信息保存在 SizedColumnTypes
类的另一个实例中。
API
ScalarFunctionFactory API 提供了以下通过子类扩展的方法:
virtual ScalarFunction * createScalarFunction(ServerInterface &srvInterface)=0;
virtual void getPrototype(ServerInterface &srvInterface,
ColumnTypes &argTypes, ColumnTypes &returnType)=0;
virtual void getReturnType(ServerInterface &srvInterface,
const SizedColumnTypes &argTypes, SizedColumnTypes &returnType);
virtual void getParameterType(ServerInterface &srvInterface,
SizedColumnTypes ¶meterTypes);
ScalarFunctionFactory API 提供了以下通过子类扩展的方法:
public abstract ScalarFunction createScalarFunction(ServerInterface srvInterface);
public abstract void getPrototype(ServerInterface srvInterface, ColumnTypes argTypes, ColumnTypes returnType);
public void getReturnType(ServerInterface srvInterface, SizedColumnTypes argTypes,
SizedColumnTypes returnType) throws UdfException;
public void getParameterType(ServerInterface srvInterface, SizedColumnTypes parameterTypes);
ScalarFunctionFactory API 提供了以下通过子类扩展的方法:
def createScalarFunction(self, srv)
def getPrototype(self, srv_interface, arg_types, return_type)
def getReturnType(self, srv_interface, arg_types, return_type)
实施 工厂函数 API 以定义标量函数工厂:
FunctionNameFactory <- function() {
list(name = FunctionName,
udxtype = c("scalar"),
intype = c("int"),
outtype = c("int"))
}