JointResultMetadata jrm = getJointResultMetadata( left, right );
initialize( dataEngine, appContext );  JointResultMetadata jrm = getJointResultMetadata( left.getResultMetaData( ), right.getResultMetaData( ) );
		protected org.eclipse.birt.data.engine.odi.IResultIterator executeOdiQuery(				IEventHandler eventHandler ) throws DataException		{			if ( doesLoadFromCache( ) == true )			{				DataSourceQuery dsQuery = new DataSourceQuery( );								JointDataSetQuery jointQuery = (JointDataSetQuery) odiQuery;				dsQuery.setExprProcessor( jointQuery.getExprProcessor( ) );				List fetchEvents = jointQuery.getFetchEvents( );				if ( fetchEvents != null )					for ( int i = 0; i < fetchEvents.size( ); i++ )						dsQuery.addOnFetchEvent( (IResultObjectEvent) fetchEvents.get( i ) );				dsQuery.setMaxRows( jointQuery.getMaxRows( ) );				dsQuery.setOrdering( toList( jointQuery.getOrdering( ) ) );				dsQuery.setGrouping( toList( jointQuery.getGrouping( ) ) );								return dsQuery.execute( eventHandler );			}						JointResultMetadata jrm = getJointResultMetadata( left, right );			resultClass = jrm.getResultClass( );			populator = JointDataSetPopulatorFactory.getBinaryTreeDataSetPopulator( left.getOdiResult( ),					right.getOdiResult( ),					jrm,					matcher,					joinType );						if ( doesSaveToCache( ) == false )				return new CachedResultSet( (BaseQuery) this.odiQuery,						resultClass,						populator,						eventHandler );			else				return new CachedResultSet( (BaseQuery) this.odiQuery,						resultClass,						new DataSetResultCache( populator, resultClass ),						eventHandler );		}