C++ Example: Defining Parameters
The following code fragment demonstrates adding a single parameter to the C++ add2ints UDSF example. The getParameterType()
function defines a single integer parameter that is named constant
.
class Add2intsWithConstantFactory : public ScalarFunctionFactory { // Return an instance of Add2ints to perform the actual addition. virtual ScalarFunction *createScalarFunction(ServerInterface &interface) { // Calls the vt_createFuncObj to create the new Add2ints class instance. return vt_createFuncObj(interface.allocator, Add2intsWithConstant); } // Report the argument and return types to Vertica. virtual void getPrototype(ServerInterface &interface, ColumnTypes &argTypes, ColumnTypes &returnType) { // Takes two ints as inputs, so add ints to the argTypes object. argTypes.addInt(); argTypes.addInt(); // Returns a single int. returnType.addInt(); } // Defines the parameters for this UDSF. Works similarly to defining arguments and return types. virtual void getParameterType(ServerInterface &srvInterface, SizedColumnTypes ¶meterTypes) { // One int parameter named constant. parameterTypes.addInt("constant"); } }; RegisterFactory(Add2intsWithConstantFactory);
See the Vertica SDK entry for SizedColumnTypes
for a full list of the data-type-specific functions you can call to define parameters.
The following code fragment demonstrates using the parameter value. The Add2intsWithConstant
class defines a function that adds two integer values. If the user supplies it, the function also adds the value of the optional integer parameter named constant.
/** * A UDSF that adds two numbers together with a constant value. * */ class Add2intsWithConstant : public ScalarFunction { public: // Processes a block of data sent by Vertica. virtual void processBlock(ServerInterface &srvInterface, BlockReader &arg_reader, BlockWriter &res_writer) { try { // The default value for the constant parameter is 0. vint constant = 0; // Get the parameter reader from the ServerInterface to see if there are supplied parameters. ParamReader paramReader = srvInterface.getParamReader(); // See if the user supplied the constant parameter. if (paramReader.containsParameter("constant")) // There is a parameter, so get its value. constant = paramReader.getIntRef("constant"); // While we have input to process: do { // Read the two integer input parameters by calling the BlockReader.getIntRef class function. const vint a = arg_reader.getIntRef(0); const vint b = arg_reader.getIntRef(1); // Add arguments plus constant. res_writer.setInt(a+b+constant); // Finish writing the row, and advance to the next output row. res_writer.next(); // Continue looping until there are no more input rows. } while (arg_reader.next()); } catch (exception& e) { // Standard exception. Quit. vt_report_error(0, "Exception while processing partition: %s", e.what()); } } };