You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by Maryann Xue <ma...@gmail.com> on 2015/04/03 21:39:45 UTC

Question about CalciteResultSet

Hi,

We implemented a sub-class of Enumerator<Object[]> to convert a Phoenix
ResultIterator to an Enumerator, but hit a problem when selecting only one
column in the query. While calling resultSet.getObject(1), the entire
object array is returned instead of the first element in the array.
Debugged and found that the below method of CalciteResultSet was the cause.
So does this look like a bug, or should we implement the enumerator
differently?

  private Cursor createCursor(ColumnMetaData.AvaticaType elementType,

      Iterable iterable) {

    final Enumerator enumerator = Linq4j.iterableEnumerator(iterable);

    //noinspection unchecked

    return !(elementType instanceof ColumnMetaData.StructType)

        || ((ColumnMetaData.StructType) elementType).columns.size() == 1

        ? new ObjectEnumeratorCursor(enumerator)

        : new ArrayEnumeratorCursor(enumerator);

  }



Thanks,

Maryann

Re: Question about CalciteResultSet

Posted by Maryann Xue <ma...@gmail.com>.
Thanks for explanation, Julian! Got that fixed on the calcite branch.

On Fri, Apr 3, 2015 at 4:12 PM, Julian Hyde <ju...@hydromatic.net> wrote:

> I think you are generating code for a RelNode in Enumerable convention, so
> you need to adhere to that convention -- an Enumerable that contains arrays
> for 2 or more columns, singleton values for 1 column, or possibly a
> synthetic class if you specify an element type. So it's an
> Enumerable<Object> rather than an Enumerable<Object[]>.
>
> Other people who are just implementing a provider for Avatica should
> provide an Iterable<Object[]>. Rows will be arrays even if they only have
> one column.
>
> Julian
>
>
>
> > On Apr 3, 2015, at 12:39 PM, Maryann Xue <ma...@gmail.com> wrote:
> >
> > Hi,
> >
> > We implemented a sub-class of Enumerator<Object[]> to convert a Phoenix
> > ResultIterator to an Enumerator, but hit a problem when selecting only
> one
> > column in the query. While calling resultSet.getObject(1), the entire
> > object array is returned instead of the first element in the array.
> > Debugged and found that the below method of CalciteResultSet was the
> cause.
> > So does this look like a bug, or should we implement the enumerator
> > differently?
> >
> > private Cursor createCursor(ColumnMetaData.AvaticaType elementType,
> >
> >    Iterable iterable) {
> >
> >  final Enumerator enumerator = Linq4j.iterableEnumerator(iterable);
> >
> >  //noinspection unchecked
> >
> >  return !(elementType instanceof ColumnMetaData.StructType)
> >
> >      || ((ColumnMetaData.StructType) elementType).columns.size() == 1
> >
> >      ? new ObjectEnumeratorCursor(enumerator)
> >
> >      : new ArrayEnumeratorCursor(enumerator);
> >
> > }
> >
> >
> >
> > Thanks,
> >
> > Maryann
>
>

Re: Question about CalciteResultSet

Posted by Julian Hyde <ju...@hydromatic.net>.
I think you are generating code for a RelNode in Enumerable convention, so you need to adhere to that convention -- an Enumerable that contains arrays for 2 or more columns, singleton values for 1 column, or possibly a synthetic class if you specify an element type. So it's an Enumerable<Object> rather than an Enumerable<Object[]>.

Other people who are just implementing a provider for Avatica should provide an Iterable<Object[]>. Rows will be arrays even if they only have one column.

Julian



> On Apr 3, 2015, at 12:39 PM, Maryann Xue <ma...@gmail.com> wrote:
> 
> Hi,
> 
> We implemented a sub-class of Enumerator<Object[]> to convert a Phoenix
> ResultIterator to an Enumerator, but hit a problem when selecting only one
> column in the query. While calling resultSet.getObject(1), the entire
> object array is returned instead of the first element in the array.
> Debugged and found that the below method of CalciteResultSet was the cause.
> So does this look like a bug, or should we implement the enumerator
> differently?
> 
> private Cursor createCursor(ColumnMetaData.AvaticaType elementType,
> 
>    Iterable iterable) {
> 
>  final Enumerator enumerator = Linq4j.iterableEnumerator(iterable);
> 
>  //noinspection unchecked
> 
>  return !(elementType instanceof ColumnMetaData.StructType)
> 
>      || ((ColumnMetaData.StructType) elementType).columns.size() == 1
> 
>      ? new ObjectEnumeratorCursor(enumerator)
> 
>      : new ArrayEnumeratorCursor(enumerator);
> 
> }
> 
> 
> 
> Thanks,
> 
> Maryann