protected ValueExtractor fetch ( long startTime, long endTime, long resolution, int reduceFactor ) throws IOException, RrdException
	{
		if ( rrd == null )
			openRrd();

		int dsSize				= 0;
		String[] dsNames, vNames;

		long rrdStep			= rrdDef.getStep();
		FetchData[] result		= new FetchData[datasources.length];
		
		String[] names 			= new String[numSources];
		int tblPos		= 0;
		
		for (int i = 0; i < datasources.length; i++)
		{
			dsSize				= datasources[i].size();

			if ( dsSize > 0 )
			{
				// Set the list of ds names
				dsNames 	= new String[ dsSize ];
				vNames		= new String[ dsSize ];
				
				for (int j = 0; j < dsSize; j++ ) {
					String[] spair	= (String[]) datasources[i].get(j);
					dsNames[j]	 	= spair[0];
					vNames[j]		= spair[1];
				}
				
				// Fetch datasources
				FetchRequest request		= rrd.createFetchRequest( cfNames[i], startTime, endTime, resolution );
				request.setFilter( dsNames );

				FetchData data				= request.fetchData();

				for (int j = 0; j < dsSize; j++)
					names[ data.getDsIndex(dsNames[j]) + tblPos ] = vNames[j];
				tblPos						+= dsSize; 
				
				result[i]					= data;
			}
		}
		
		return new ValueExtractor( names, result, reduceFactor );
	}