if ( aggrInfo.func.getType( ) == IAggregation.SUMMARY_AGGR )
if ( aggrInfo.aggregation.getType( ) == IAggregation.SUMMARY_AGGR )
	Object getAggregateValue( int aggrIndex ) throws DataException	{		logger.entering( AggregateCalculator.class.getName( ),				"getAggregateValue",				new Integer( aggrIndex ) );		assert aggrIndex >= 0 && aggrIndex < this.aggrCount;		AggregateTable.AggrExprInfo aggrInfo = aggrTable.getAggrInfo( aggrIndex );		if ( !hasOdiResultDataRows )		{			if ( ( aggrInfo.func  ).getName( ).equalsIgnoreCase( "COUNT" ) )				return new Integer( 0 );			else				return null;		}		try		{			/*			 * if ( aggrInfo.afterGroup ) { if ( odiResult.getEndingGroupLevel() >			 * aggrInfo.groupLevel ) { // Caller has broken the contract that			 * this aggregate can only be // requested at the end of a			 * group.Even though we can furnish the // result given current			 * implementation, the API requires that we // throw an error			 * DataException e = new DataException(			 * ResourceConstants.NOT_END_GROUP ); logger.logp( Level.FINE ,			 * DataEngineImpl.class.getName( ), "getAggregateValue", "This			 * aggregate expression is only available at the end of a group", e );			 * throw e; } }			 */			int groupIndex;			if ( aggrInfo.func.getType( ) == IAggregation.SUMMARY_AGGR )			{				if ( aggrInfo.groupLevel == 0 )					// Aggregate on the whole list: there is only one group					groupIndex = 0;				else					groupIndex = odiResult.getCurrentGroupIndex( aggrInfo.groupLevel );			}			else				groupIndex = odiResult.getCurrentResultIndex( );			Object value = this.aggrValues[aggrIndex].get( groupIndex );			logger.exiting( AggregateCalculator.class.getName( ),					"getAggregateValue",					value );					return value;		}		catch ( DataException e )		{			throw e;		}	}