You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by Dave Mansfield <dm...@sbcglobal.net> on 2011/03/22 05:43:28 UTC

Using Datacontext.performIteratedQuery() and ResultIterator

Hello -

I'm having a tough time understanding how to use the ResultItator 
properly.  Reading the 3.0.1 Javadocs, it reports:

Result "rows", depending on the query, may be represented as scalar 
values, DataRows, or Object[] arrays containing a mix of scalars and 
DataRows.

In the performance tuning example, the guide shows:

// ResultIterator operations all throw checked CayenneException
try {
   // special "performIteratedQuery" method is used
   it = context.performIteratedQuery(q);

   while(it.hasNextRow()) {
      // ResultIterator always returns data rows 
      Map row = (Map) it.nextRow();
      
      // do something with the row...
      ...
   }
}


How can one pre-determine the object context being returned from a 
ResultIterator.nextRow() call?  My code depends on a base class applying 
object-specific behavior to serialize queries to another context.. One 
pass a scalar is returned; yet another pass I have a Map returned..

Tks!

Code snippet:

      ResultIterator resultIter = null;
      query.setPageSize(mPageSize);
      query.setFetchingDataRows(true);
      long rowCnt = 0;
      try {
         resultIter = mDataCtx.performIteratedQuery(query);
      } catch (CayenneException e) {
         mLogger.log(Level.FATAL, "Query failed!", e);
         return;
      }
      boolean needHeader = true;
      try {
         while ( resultIter.hasNextRow() ) {
            DataRow row = (DataRow)resultIter.nextRow();
            rowCnt++;
            if ( needHeader ) {
               this.writeHeader(row, errors);
            }
            this.writeLine(row, errors);
         }
         resultIter.close();
      } catch (CayenneException e) {
         mLogger.log(Level.FATAL, "Iterating through query failed!", e);
         return;
      }
      finally {
         try { if ( resultIter != null ) { resultIter.close(); } } catch 
(CayenneException e) { /* nothing */ }
      }
   }


Re: Using Datacontext.performIteratedQuery() and ResultIterator

Posted by Dave Mansfield <dm...@sbcglobal.net>.
Hi Andrus:

Andrus Adamchik wrote:
> Hi Dave,
>
> By "object context" you don't mean ObjectContext, but rather the type of the result, right?
>   
Yes, this is correct.
> If you need to determine result type dynamically, you can look at query metadata:
>
> QueryMetadata md = query.getMetaData(context.getEntityResolver());
> List<Object> rsMapping = md.getResultSetMapping();
>
> The returned list contains instances of EntityResultSegment or ScalarResultSegment, so you ca make sense of the result format. Not sure if this was your question here? 
>   
I believe so: My problem arises from a base class for "serializing" 
database entities, and the kids being responsible (via the writeheader() 
and writeline() methods - which are abstract at the base class level) 
for handling the specifics of dealing with particular DB entities. As 
long as the queries are small, no problem. When they get huge, I have to 
fallback to retrieving datarows, then converting to per-DB-entity types 
of objects.

I delegated the initial, "convert from datarow to dataobject" at the 
base class level - that's where I hit the snag of some query results 
returning scalars, DataRows or Object[]. I will factor your info into my 
design and see how it works out.

thank you for the feedback!

-- Dave
> Andrus
>
>
> On Mar 22, 2011, at 6:43 AM, Dave Mansfield wrote:
>
>   
>> Hello -
>>
>> I'm having a tough time understanding how to use the ResultItator properly.  Reading the 3.0.1 Javadocs, it reports:
>>
>> Result "rows", depending on the query, may be represented as scalar values, DataRows, or Object[] arrays containing a mix of scalars and DataRows.
>>
>> In the performance tuning example, the guide shows:
>>
>> // ResultIterator operations all throw checked CayenneException
>> try {
>>  // special "performIteratedQuery" method is used
>>  it = context.performIteratedQuery(q);
>>
>>  while(it.hasNextRow()) {
>>     // ResultIterator always returns data rows      Map row = (Map) it.nextRow();
>>          // do something with the row...
>>     ...
>>  }
>> }
>>
>>
>> How can one pre-determine the object context being returned from a ResultIterator.nextRow() call?  My code depends on a base class applying object-specific behavior to serialize queries to another context.. One pass a scalar is returned; yet another pass I have a Map returned..
>>
>> Tks!
>>
>> Code snippet:
>>
>>     ResultIterator resultIter = null;
>>     query.setPageSize(mPageSize);
>>     query.setFetchingDataRows(true);
>>     long rowCnt = 0;
>>     try {
>>        resultIter = mDataCtx.performIteratedQuery(query);
>>     } catch (CayenneException e) {
>>        mLogger.log(Level.FATAL, "Query failed!", e);
>>        return;
>>     }
>>     boolean needHeader = true;
>>     try {
>>        while ( resultIter.hasNextRow() ) {
>>           DataRow row = (DataRow)resultIter.nextRow();
>>           rowCnt++;
>>           if ( needHeader ) {
>>              this.writeHeader(row, errors);
>>           }
>>           this.writeLine(row, errors);
>>        }
>>        resultIter.close();
>>     } catch (CayenneException e) {
>>        mLogger.log(Level.FATAL, "Iterating through query failed!", e);
>>        return;
>>     }
>>     finally {
>>        try { if ( resultIter != null ) { resultIter.close(); } } catch (CayenneException e) { /* nothing */ }
>>     }
>>  }
>>
>>
>>     
>
>
>   

Re: Using Datacontext.performIteratedQuery() and ResultIterator

Posted by Andrus Adamchik <an...@objectstyle.org>.
Hi Dave,

By "object context" you don't mean ObjectContext, but rather the type of the result, right?

If you need to determine result type dynamically, you can look at query metadata:

QueryMetadata md = query.getMetaData(context.getEntityResolver());
List<Object> rsMapping = md.getResultSetMapping();

The returned list contains instances of EntityResultSegment or ScalarResultSegment, so you ca make sense of the result format. Not sure if this was your question here? 

Andrus


On Mar 22, 2011, at 6:43 AM, Dave Mansfield wrote:

> Hello -
> 
> I'm having a tough time understanding how to use the ResultItator properly.  Reading the 3.0.1 Javadocs, it reports:
> 
> Result "rows", depending on the query, may be represented as scalar values, DataRows, or Object[] arrays containing a mix of scalars and DataRows.
> 
> In the performance tuning example, the guide shows:
> 
> // ResultIterator operations all throw checked CayenneException
> try {
>  // special "performIteratedQuery" method is used
>  it = context.performIteratedQuery(q);
> 
>  while(it.hasNextRow()) {
>     // ResultIterator always returns data rows      Map row = (Map) it.nextRow();
>          // do something with the row...
>     ...
>  }
> }
> 
> 
> How can one pre-determine the object context being returned from a ResultIterator.nextRow() call?  My code depends on a base class applying object-specific behavior to serialize queries to another context.. One pass a scalar is returned; yet another pass I have a Map returned..
> 
> Tks!
> 
> Code snippet:
> 
>     ResultIterator resultIter = null;
>     query.setPageSize(mPageSize);
>     query.setFetchingDataRows(true);
>     long rowCnt = 0;
>     try {
>        resultIter = mDataCtx.performIteratedQuery(query);
>     } catch (CayenneException e) {
>        mLogger.log(Level.FATAL, "Query failed!", e);
>        return;
>     }
>     boolean needHeader = true;
>     try {
>        while ( resultIter.hasNextRow() ) {
>           DataRow row = (DataRow)resultIter.nextRow();
>           rowCnt++;
>           if ( needHeader ) {
>              this.writeHeader(row, errors);
>           }
>           this.writeLine(row, errors);
>        }
>        resultIter.close();
>     } catch (CayenneException e) {
>        mLogger.log(Level.FATAL, "Iterating through query failed!", e);
>        return;
>     }
>     finally {
>        try { if ( resultIter != null ) { resultIter.close(); } } catch (CayenneException e) { /* nothing */ }
>     }
>  }
> 
>