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 &parameterTypes);

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"))
}