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

James Taylor edited comment on PHOENIX-953 at 8/4/15 8:15 PM:
--------------------------------------------------------------

Questions from [~ram_krish] & [~Dumindux]:
{quote}
-> What is the initial scope of UNNEST we will target?
-> As I can read from the description UNNEST can be used a full table like 
structure for doing JOINS etc.
-> There can be cases like
SELECT ARRAY(SELECT DISTINCT UNNEST(stuff) FROM Foo where id = 1);

-> The UNNEST without 'FROM' clause.

Coming to the implementation for a SELECT UNNEST (ARRAY) from TABLE, we will 
not implement UNNEST as a function I believe.
We will add an entry in the grammar file and have an expression for UNNEST and 
for the UNNEST expression we may need a new type of compilation and a new type 
of result iterator on the Column Projector right?

So the KV that is getting returned back to the client ( I mean per KV) we will 
need to iterate the value part of it. Am not sure whether the normal iterators 
would do this work. 
{quote}

Yes, we'll need to add UNNEST support to the grammar on par with other 
expressions in the term rule:
{code}
term returns [ParseNode ret]
    :   e=literal_or_bind { $ret = e; }
    |   field=identifier { $ret = factory.column(null,field,field); }
    |   UNNEST LPAREN e=expression RPAREN { $ret = factory.unnest(e); }
    ...
{code}
We should be able to handle UNNEST purely at the compile layer. It should be 
equivalent to the following (which should already work):
{code}
    SELECT ( SELECT a[1],a[2],a[3],a[4]... )
{code}
The inner select will return one row per array element. We may have a special 
QueryPlan derived from EmptyTableQueryPlan specific for this case (like 
UnnestArrayQueryPlan) that'll simply project all the elements of the array 
expression from the UNNEST call.

I don't think any runtime changes will be necessary. If there are places in 
which we don't support this, then those can be fixed in future work (and/or 
when we move to Calcite).

First cut, I don't think we need to support the DISTINCT keyword. Not sure if 
our SELECT without FROM clause supports that currently. In theory, you might be 
able to put it in an outer SELECT instead.

Thoughts, [~maryannxue]?


was (Author: jamestaylor):
Questions from [~ram_krish] & [~Dumindux]:
{quote}
-> What is the initial scope of UNNEST we will target?
-> As I can read from the description UNNEST can be used a full table like 
structure for doing JOINS etc.
-> There can be cases like
SELECT ARRAY(SELECT DISTINCT UNNEST(stuff) FROM Foo where id = 1);

-> The UNNEST without 'FROM' clause.

Coming to the implementation for a SELECT UNNEST (ARRAY) from TABLE, we will 
not implement UNNEST as a function I believe.
We will add an entry in the grammar file and have an expression for UNNEST and 
for the UNNEST expression we may need a new type of compilation and a new type 
of result iterator on the Column Projector right?

So the KV that is getting returned back to the client ( I mean per KV) we will 
need to iterate the value part of it. Am not sure whether the normal iterators 
would do this work. 
{quote}

Yes, we'll need to add UNNEST support to the grammar on par with other 
expressions in the term rule:
{code}
term returns [ParseNode ret]
    :   e=literal_or_bind { $ret = e; }
    |   field=identifier { $ret = factory.column(null,field,field); }
    |   UNNEST LPAREN e=expression RPAREN { $ret = factory.unnest(e); }
    ...
{code}
We should be able to handle UNNEST purely at the compile layer. It should be 
equivalent to the following (which should already work):
{code}
    SELECT ( SELECT a[1],a[2],a[3],a[4]... )
{code}
The inner select will return one row per array element. We may have a special 
QueryPlan derived from EmptyTableQueryPlan specific for this case (like 
UnnestArrayQueryPlan) that'll simply project all the elements of the array 
expression from the UNNEST call.

I don't think any runtime changes will be necessary. If there are places in 
which we don't support this, then those can be fixed in future work (and/or 
when we move to Calcite).

Thoughts, [~maryannxue]?

> Support UNNEST for ARRAY
> ------------------------
>
>                 Key: PHOENIX-953
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-953
>             Project: Phoenix
>          Issue Type: Sub-task
>            Reporter: James Taylor
>            Assignee: Dumindu Buddhika
>
> The UNNEST built-in function converts an array into a set of rows. This is 
> more than a built-in function, so should be considered an advanced project.
> For an example, see the following Postgres documentation: 
> http://www.postgresql.org/docs/8.4/static/functions-array.html
> http://www.anicehumble.com/2011/07/postgresql-unnest-function-do-many.html
> http://tech.valgog.com/2010/05/merging-and-manipulating-arrays-in.html
> So the UNNEST is a way of converting an array to a flattened "table" which 
> can then be filtered on, ordered, grouped, etc.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to