phoenix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From James Taylor <jamestay...@apache.org>
Subject Re: Implementing ARRAY_APPEND built-in function
Date Sat, 07 Mar 2015 02:29:33 GMT
Hi Dumindu,

Good questions. For future, best to post questions specific to your
JIRA on the JIRA itself. All JIRA comments appear in the dev list as
well.

For the @BuiltInFunction annotation, you'd define your second type as
PVarbinary, since the element being appended may be of any type. To
get the actual type at runtime, you'd use the getChildren() method
which returns a List<Expression>. The children represent the arguments
to your built-in function. In your case, getChildren().get(0)
expression would represent the array, while the getChildren().get(1)
expression would represent the element being appended. From the
expression, you can call getDataType() to get the actual PDataType at
runtime, and use the dataType.toBytes() method to get the bytes that
represent the actual value which you can add to the array. Take a look
at PArrayDataType for methods that manipulate the array. If possible,
you'd want to keep the array as byte[], as converting back and forth
to objects is expensive. You might need to add a new method to
PArrayDataType that allows the byte[] of an element to be appended to
the byte[] of the array.

Note that you know the data types at compile time, so it's possible
that you could create a different expression for the
ArrayAppendFunction from a custom factory method. An example of this
is with the RoundFunction - it has a nodeClass attribute in its
annotation that delegate the creation to the indicated class. If you
look at that class, you'll see that it ends up creating a
RoundDateExpression, RoundTimestampExpression, or
RoundDecimalExpression depending on the type of the argument. In this
case, I don't think it's worth going this route, though.

HTH. Thanks,

James

On Fri, Mar 6, 2015 at 5:16 PM, Dumindu Buddhika
<dumindukarunathilaka@gmail.com> wrote:
> Hi all,
>
> I am a GSOC aspirant this year from Department of Computer Science and
> Engineering, University of Moratuwa, Sri Lanka.
>
> I would like to work on PHOENIX-1665, to create missing array built-in
> functions. I am currently trying to implement ARRAY_APPEND function. I have
> some questions associated with this. It would be great if someone can
> answer.
> PBinaryArray type would be first input of this function. Second would be a
> primitive type element to be appended to the first given array. So I am
> guessing it should be PDataType.
>
> The approach I thought was using  PDataType's toObject method to construct
> a PhoenixArray from given bytes(from ptr) and add the new element to it
> then convert it back to bytes.
>
> When using this approach I have a problem how to convert the second input
> argument(the element to be appended to the array) to corresponding object.
> if the type of this is known of this input for sure it can be done( ex: if
> its PInteger then PInteger.INSTANCE.getCodec().decodeInt can be used). But
> here it can be any of the primitive types to my understanding. so how to
> convert to the corresponding datatype object without exactly knowing the
> type?
>
> It would be really great if someone can help me on this. if this approach
> is wrong or if there is a better approach(directly manipulating bytes) I
> would also like to know :)
>
> Thank you.
>
> Regards,
> Dumindu.

Mime
View raw message