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();
    }