I have written a sample udf for isnumeric fucntion.
To be frank, I am beginner to C++ and this is my first UDx.
I wanted to make a UDx which checks if the input values is numeric.
The code is like this
Code: Select all
using namespace std;
/*
* ScalarFunction implementation for a UDSF that adds
* two numbers together.
*/
class isnumeric : public ScalarFunction
{
public:
/*
* This function does all of the actual processing for the UDF.
* In this case, it simply reads two integer values and returns
* their sum.
*
* The inputs are retrieved via arg_reader
* The outputs are returned via arg_writer
*/
virtual void processBlock(ServerInterface &srvInterface,
BlockReader &arg_reader,
BlockWriter &res_writer)
{
// While we have input to process
do
{
// Read the two integer input parameters by calling the
// BlockReader.getIntRef class function
char inStr = arg_reader.getStringRef(0);
int sizeOfString = strlen(inStr);
int iteration = 0;
bool isNumeric = true;
while(iteration < sizeOfString)
{
if(!isdigit(string[iteration]))
{
isNumeric = false;
break;
}
iteration++;
}
// Call BlockWriter.setInt to store the output value, which is the
// two input values added together
res_writer.setBool(isNumeric);
// 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());
}
};
/*
* This class provides metadata about the ScalarFunction class, and
* also instantiates a member of that class when needed.
*/
class isnumericFactory : 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, isnumeric);
}
// This function returns the description of the input and outputs of the
// Add2Ints class's processBlock function. It stores this information in
// two ColumnTypes objects, one for the input parameters, and one for
// the return value.
virtual void getPrototype(ServerInterface &interface,
ColumnTypes &argTypes,
ColumnTypes &returnType)
{
// Takes two ints as inputs, so add ints to the argTypes object
argTypes.addVarchar();
// returns a single int, so add a single int to the returnType object.
// Note that ScalarFunctions *always* return a single value.
returnType.addBool();
}
};
// Register the factory with HP Vertica
RegisterFactory(isnumericFactory);
Code: Select all
[nnani]$ g++ -D HAVE_LONG_INT_64 -I /opt/vertica/sdk/include -Wall -shared -Wno-unused-value -fPIC -o /home/dbadmin/navin/isnumeric.so isnumeric.cpp /opt/vertica/sdk/include/Vertica.cpp
isnumeric.cpp: In member function ‘virtual void isnumeric::processBlock(Vertica::ServerInterface&, Vertica::BlockReader&, Vertica::BlockWriter&)’:
isnumeric.cpp:33: error: cannot convert ‘const Vertica::VString’ to ‘char’ in initialization
isnumeric.cpp:35: error: invalid conversion from ‘char’ to ‘const char*’
isnumeric.cpp:35: error: initializing argument 1 of ‘size_t strlen(const char*)’
isnumeric.cpp:41: error: expected primary-expression before ‘[’ token
Can anybody point me with what is going wrong here.
Also, it would be great to have some info on my mistakes.
Thanks