You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@phoenix.apache.org by Kathiresan S <ka...@gmail.com> on 2015/05/06 13:48:54 UTC

UDF - Access Tuple Column Values By Name

Hi,

In UDF, in the implemented evaluate(tuple,ptr) method, i could access the
expression object of the columns passed to the UDF, by invoking
*getChildren.get(index)*. and then by invoking
expression.evaluate(tuple,ptr), i can get the value copied to the ptr
object. But, how do i access other elements of the tuple by passing its
column name. I don't have access to the expression object of other columns
in the select query within the UDF implementation method. Please suggest
what we should do to get the value of other columns from the tuple by
passing the column name.

For eg.

CREATE TABLE TESTTABLE (ID VARCHAR, NAME VARCHAR, PREFIX VARCHAR)

CREATE FUNCTION MYFUNCTION(VARCHAR) RETURNS VARCHAR WITH 'com.test.CF'
using jar '/tmp/cf.jar'

SELECT ID,MYFUNCTION(NAME),PREFIX FROM TESTTABLE

MYFUNCTION - is expected to concatenate PREFIX columns value and the NAME
columns value in each row.

In the evaluate method, as i pass the NAME column as argument to the
function, i get the expression object of it by invoking
nameExpr=getChildren.get(0) and then by invoking
nameExpr.evaluate(tuple,ptr) i can have the value copied to ptr. In this
case, is there a way to access the prefix columns value from the tuple, as
its also present in the SELECT clause.

Thanks,
Kathir

Re: UDF - Access Tuple Column Values By Name

Posted by Kathiresan S <ka...@gmail.com>.
Thanks James.

Thanks,
Kathir

On Wed, May 6, 2015 at 2:37 PM, James Taylor <ja...@apache.org> wrote:

> +1 to Jaime's suggestion of providing multiple arguments. You can have
> a variable number of arguments to a function by providing default
> values for trailing arguments. I wouldn't rely on the Tuple argument
> in the evaluate method as it might go away in the future
> (PHOENIX-1887).
>
> Thanks,
> James
>
> On Wed, May 6, 2015 at 6:14 AM, Kathiresan S
> <ka...@gmail.com> wrote:
> > Hi Jaime,
> >
> > In my case, the number of arguments passed to the custom function will be
> > different in different scenarios. I think UDF is designed to take fixed
> > number of arguments, i believe (also, I see number of arguments column in
> > SYSTEM.FUNCTION table).
> >
> > Another question - As we have the row (tuple) at this point of the code
> > (evaluate method) with all the values in it, why can't we pass the
> > expression list to the evaluate method from
> > PhoenixResultSet(RowProjector->columnProjectors), so we could access any
> > column we want from the tuple? Am i missing something?
> >
> > Thanks,
> > Kathir
> >
> > On Wed, May 6, 2015 at 8:43 AM, Jaime Solano <jd...@gmail.com>
> wrote:
> >>
> >> Hi Kathir,
> >>
> >> I don't know if that's posible, but seems like the better approach is to
> >> just define your function to take two arguments.
> >>
> >> What do you think?
> >>
> >> Best,
> >> -Jaime
> >>
> >> On May 6, 2015 7:50 AM, "Kathiresan S" <ka...@gmail.com>
> >> wrote:
> >>>
> >>> Hi,
> >>>
> >>> In UDF, in the implemented evaluate(tuple,ptr) method, i could access
> the
> >>> expression object of the columns passed to the UDF, by invoking
> >>> getChildren.get(index). and then by invoking
> expression.evaluate(tuple,ptr),
> >>> i can get the value copied to the ptr object. But, how do i access
> other
> >>> elements of the tuple by passing its column name. I don't have access
> to the
> >>> expression object of other columns in the select query within the UDF
> >>> implementation method. Please suggest what we should do to get the
> value of
> >>> other columns from the tuple by passing the column name.
> >>>
> >>> For eg.
> >>>
> >>> CREATE TABLE TESTTABLE (ID VARCHAR, NAME VARCHAR, PREFIX VARCHAR)
> >>>
> >>> CREATE FUNCTION MYFUNCTION(VARCHAR) RETURNS VARCHAR WITH 'com.test.CF'
> >>> using jar '/tmp/cf.jar'
> >>>
> >>> SELECT ID,MYFUNCTION(NAME),PREFIX FROM TESTTABLE
> >>>
> >>> MYFUNCTION - is expected to concatenate PREFIX columns value and the
> NAME
> >>> columns value in each row.
> >>>
> >>> In the evaluate method, as i pass the NAME column as argument to the
> >>> function, i get the expression object of it by invoking
> >>> nameExpr=getChildren.get(0) and then by invoking
> >>> nameExpr.evaluate(tuple,ptr) i can have the value copied to ptr. In
> this
> >>> case, is there a way to access the prefix columns value from the
> tuple, as
> >>> its also present in the SELECT clause.
> >>>
> >>> Thanks,
> >>> Kathir
> >
> >
>

Re: UDF - Access Tuple Column Values By Name

Posted by James Taylor <ja...@apache.org>.
+1 to Jaime's suggestion of providing multiple arguments. You can have
a variable number of arguments to a function by providing default
values for trailing arguments. I wouldn't rely on the Tuple argument
in the evaluate method as it might go away in the future
(PHOENIX-1887).

Thanks,
James

On Wed, May 6, 2015 at 6:14 AM, Kathiresan S
<ka...@gmail.com> wrote:
> Hi Jaime,
>
> In my case, the number of arguments passed to the custom function will be
> different in different scenarios. I think UDF is designed to take fixed
> number of arguments, i believe (also, I see number of arguments column in
> SYSTEM.FUNCTION table).
>
> Another question - As we have the row (tuple) at this point of the code
> (evaluate method) with all the values in it, why can't we pass the
> expression list to the evaluate method from
> PhoenixResultSet(RowProjector->columnProjectors), so we could access any
> column we want from the tuple? Am i missing something?
>
> Thanks,
> Kathir
>
> On Wed, May 6, 2015 at 8:43 AM, Jaime Solano <jd...@gmail.com> wrote:
>>
>> Hi Kathir,
>>
>> I don't know if that's posible, but seems like the better approach is to
>> just define your function to take two arguments.
>>
>> What do you think?
>>
>> Best,
>> -Jaime
>>
>> On May 6, 2015 7:50 AM, "Kathiresan S" <ka...@gmail.com>
>> wrote:
>>>
>>> Hi,
>>>
>>> In UDF, in the implemented evaluate(tuple,ptr) method, i could access the
>>> expression object of the columns passed to the UDF, by invoking
>>> getChildren.get(index). and then by invoking expression.evaluate(tuple,ptr),
>>> i can get the value copied to the ptr object. But, how do i access other
>>> elements of the tuple by passing its column name. I don't have access to the
>>> expression object of other columns in the select query within the UDF
>>> implementation method. Please suggest what we should do to get the value of
>>> other columns from the tuple by passing the column name.
>>>
>>> For eg.
>>>
>>> CREATE TABLE TESTTABLE (ID VARCHAR, NAME VARCHAR, PREFIX VARCHAR)
>>>
>>> CREATE FUNCTION MYFUNCTION(VARCHAR) RETURNS VARCHAR WITH 'com.test.CF'
>>> using jar '/tmp/cf.jar'
>>>
>>> SELECT ID,MYFUNCTION(NAME),PREFIX FROM TESTTABLE
>>>
>>> MYFUNCTION - is expected to concatenate PREFIX columns value and the NAME
>>> columns value in each row.
>>>
>>> In the evaluate method, as i pass the NAME column as argument to the
>>> function, i get the expression object of it by invoking
>>> nameExpr=getChildren.get(0) and then by invoking
>>> nameExpr.evaluate(tuple,ptr) i can have the value copied to ptr. In this
>>> case, is there a way to access the prefix columns value from the tuple, as
>>> its also present in the SELECT clause.
>>>
>>> Thanks,
>>> Kathir
>
>

Re: UDF - Access Tuple Column Values By Name

Posted by Kathiresan S <ka...@gmail.com>.
Hi Jaime,

In my case, the number of arguments passed to the custom function will be
different in different scenarios. I think UDF is designed to take fixed
number of arguments, i believe (also, I see number of arguments column in
SYSTEM.FUNCTION table).

Another question - As we have the row (tuple) at this point of the code
(evaluate method) with all the values in it, why can't we pass the
expression list to the evaluate method from
PhoenixResultSet(RowProjector->columnProjectors), so we could access any
column we want from the tuple? Am i missing something?

Thanks,
Kathir

On Wed, May 6, 2015 at 8:43 AM, Jaime Solano <jd...@gmail.com> wrote:

> Hi Kathir,
>
> I don't know if that's posible, but seems like the better approach is to
> just define your function to take two arguments.
>
> What do you think?
>
> Best,
> -Jaime
> On May 6, 2015 7:50 AM, "Kathiresan S" <ka...@gmail.com>
> wrote:
>
>> Hi,
>>
>> In UDF, in the implemented evaluate(tuple,ptr) method, i could access the
>> expression object of the columns passed to the UDF, by invoking
>> *getChildren.get(index)*. and then by invoking
>> expression.evaluate(tuple,ptr), i can get the value copied to the ptr
>> object. But, how do i access other elements of the tuple by passing its
>> column name. I don't have access to the expression object of other columns
>> in the select query within the UDF implementation method. Please suggest
>> what we should do to get the value of other columns from the tuple by
>> passing the column name.
>>
>> For eg.
>>
>> CREATE TABLE TESTTABLE (ID VARCHAR, NAME VARCHAR, PREFIX VARCHAR)
>>
>> CREATE FUNCTION MYFUNCTION(VARCHAR) RETURNS VARCHAR WITH 'com.test.CF'
>> using jar '/tmp/cf.jar'
>>
>> SELECT ID,MYFUNCTION(NAME),PREFIX FROM TESTTABLE
>>
>> MYFUNCTION - is expected to concatenate PREFIX columns value and the NAME
>> columns value in each row.
>>
>> In the evaluate method, as i pass the NAME column as argument to the
>> function, i get the expression object of it by invoking
>> nameExpr=getChildren.get(0) and then by invoking
>> nameExpr.evaluate(tuple,ptr) i can have the value copied to ptr. In this
>> case, is there a way to access the prefix columns value from the tuple, as
>> its also present in the SELECT clause.
>>
>> Thanks,
>> Kathir
>>
>

Re: UDF - Access Tuple Column Values By Name

Posted by Jaime Solano <jd...@gmail.com>.
Hi Kathir,

I don't know if that's posible, but seems like the better approach is to
just define your function to take two arguments.

What do you think?

Best,
-Jaime
On May 6, 2015 7:50 AM, "Kathiresan S" <ka...@gmail.com> wrote:

> Hi,
>
> In UDF, in the implemented evaluate(tuple,ptr) method, i could access the
> expression object of the columns passed to the UDF, by invoking
> *getChildren.get(index)*. and then by invoking
> expression.evaluate(tuple,ptr), i can get the value copied to the ptr
> object. But, how do i access other elements of the tuple by passing its
> column name. I don't have access to the expression object of other columns
> in the select query within the UDF implementation method. Please suggest
> what we should do to get the value of other columns from the tuple by
> passing the column name.
>
> For eg.
>
> CREATE TABLE TESTTABLE (ID VARCHAR, NAME VARCHAR, PREFIX VARCHAR)
>
> CREATE FUNCTION MYFUNCTION(VARCHAR) RETURNS VARCHAR WITH 'com.test.CF'
> using jar '/tmp/cf.jar'
>
> SELECT ID,MYFUNCTION(NAME),PREFIX FROM TESTTABLE
>
> MYFUNCTION - is expected to concatenate PREFIX columns value and the NAME
> columns value in each row.
>
> In the evaluate method, as i pass the NAME column as argument to the
> function, i get the expression object of it by invoking
> nameExpr=getChildren.get(0) and then by invoking
> nameExpr.evaluate(tuple,ptr) i can have the value copied to ptr. In this
> case, is there a way to access the prefix columns value from the tuple, as
> its also present in the SELECT clause.
>
> Thanks,
> Kathir
>