[ 
https://issues.apache.org/jira/browse/PHOENIX-3773?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16034333#comment-16034333
 ] 

Loknath Priyatham Teja Singamsetty  commented on PHOENIX-3773:
--------------------------------------------------------------

[~jamestaylor]  

bq. Then, once you have all the values, combine them together using the 
PArrayDataType.appendItemToArray() method

I tried this last week as well but for some reason the output is not as 
expected. Yesterday made changes to use PArrayDataType.appendItemToArray(), 
upon debugging found two things:

a) For fixed length data types, the appendItemToArray is actually prepending 
the arrayBytes reversing the array construction. For the time being used 
prependItemToArray() method instead which fixed this issue. The following lines 
of code in appendItemToArray seems to be the reason behind this which copies 
the new bytes to front of array and older bytes to the end.

{quote}
            newArray = new byte[length + elementLength];

            System.arraycopy(arrayBytes, offset, newArray, 0, length); 
            System.arraycopy(elementBytes, elementOffset, newArray, length, 
elementLength);
{quote}
b) For variable length data types, the Array construction results in 
ArrayIndexOutOfBoundsException. Here is the stack trace

java.lang.ArrayIndexOutOfBoundsException: 32767
        at 
org.apache.phoenix.schema.types.PArrayDataType.prependItemToArray(PArrayDataType.java:545)
        at 
org.apache.phoenix.expression.aggregator.FirstLastValueBaseClientAggregator.evaluate(FirstLastValueBaseClientAggregator.java:117)
        at 
org.apache.phoenix.schema.KeyValueSchema.toBytes(KeyValueSchema.java:112)
        at 
org.apache.phoenix.schema.KeyValueSchema.toBytes(KeyValueSchema.java:93)
        at 
org.apache.phoenix.expression.aggregator.Aggregators.toBytes(Aggregators.java:112)
        at 
org.apache.phoenix.iterate.BaseGroupedAggregatingResultIterator.next(BaseGroupedAggregatingResultIterator.java:82)
        at 
org.apache.phoenix.jdbc.PhoenixResultSet.next(PhoenixResultSet.java:778)
        at 
org.apache.phoenix.end2end.FirstValuesFunctionIT.varcharDatatypeSimpleTest(FirstValuesFunctionIT.java:100)

I'm debugging this further. 
 

bq.Probably a good idea to have a test that asks for the top 3 values when 
there are only 2 values to make sure that case works too (if you don't have 
that already).

Test case is included already.



> Implement FIRST_VALUES aggregate function
> -----------------------------------------
>
>                 Key: PHOENIX-3773
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-3773
>             Project: Phoenix
>          Issue Type: New Feature
>            Reporter: James Taylor
>            Assignee: Loknath Priyatham Teja Singamsetty 
>              Labels: SFDC
>             Fix For: 4.11.0
>
>         Attachments: PHOENIX-3773_4.x-HBase-0.98.patch, 
> PHOENIX-3773_master.patch, PHOENIX-3773.patch, PHOENIX-3773.v2.patch, 
> PHOENIX-3773.v3.patch
>
>
> Similar to FIRST_VALUE, but would allow the user to specify how many values 
> to keep. This could use a MinMaxPriorityQueue under the covers and be much 
> more efficient than using multiple NTH_VALUE calls to do the same like this:
> {code}
> SELECT entity_id,
>        NTH_VALUE(user_id,1) WITHIN GROUP (ORDER BY last_read_date DESC) as 
> nth1_user_id,
>        NTH_VALUE(user_id,2) WITHIN GROUP (ORDER BY last_read_date DESC) as 
> nth2_user_id,
>        NTH_VALUE(user_id,3) WITHIN GROUP (ORDER BY last_read_date DESC) as 
> nth3_user_id,
>        count(*)
> FROM  MY_TABLE 
> WHERE tenant_id='00Dx0000000XXXX'
> AND entity_id in ('0D5x000000ABCD','0D5x000000ABCE')
> GROUP BY entity_id;
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to