/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame.marketdata;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
import org.threeten.bp.LocalDate;
import com.google.common.collect.ImmutableMap;
import com.opengamma.core.historicaltimeseries.HistoricalTimeSeries;
import com.opengamma.core.historicaltimeseries.HistoricalTimeSeriesSource;
import com.opengamma.engine.marketdata.spec.FixedHistoricalMarketDataSpecification;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.result.FailureStatus;
import com.opengamma.util.result.Result;
/**
* Market data factory backed by a historical time series source.
*/
public class HistoricalMarketDataFactory implements MarketDataFactory<FixedHistoricalMarketDataSpecification> {
private final HistoricalTimeSeriesSource _timeSeriesSource;
private final String _dataSource;
private final String _dataProvider;
/**
* @param timeSeriesSource a source of historical time series
* @param dataSource the data source name used when looking up time series
* @param dataProvider the data provider name used when looking up time series, possibly null
*/
public HistoricalMarketDataFactory(HistoricalTimeSeriesSource timeSeriesSource,
String dataSource,
@Nullable String dataProvider) {
_timeSeriesSource = ArgumentChecker.notNull(timeSeriesSource, "timeSeriesSource");
_dataSource = ArgumentChecker.notEmpty(dataSource, "dataSource");
_dataProvider = dataProvider;
}
@Override
public Class<FixedHistoricalMarketDataSpecification> getSpecificationType() {
return FixedHistoricalMarketDataSpecification.class;
}
@Override
public MarketDataSource create(FixedHistoricalMarketDataSpecification spec) {
final LocalDate date = spec.getSnapshotDate();
return new DataSource(date);
}
/**
* Simple data source implementation that gets data for a single date from a time series source.
*/
private class DataSource implements MarketDataSource {
/** The date used for looking up data. */
private final LocalDate _date;
private DataSource(LocalDate date) {
_date = date;
}
@Override
public Map<MarketDataRequest, Result<?>> get(Set<MarketDataRequest> requests) {
ImmutableMap.Builder<MarketDataRequest, Result<?>> builder = ImmutableMap.builder();
for (MarketDataRequest request : requests) {
HistoricalTimeSeries timeSeries =
_timeSeriesSource.getHistoricalTimeSeries(request.getId(), _dataSource, _dataProvider,
request.getFieldName().getName(), _date, true, _date, true);
if (timeSeries != null) {
Double value = timeSeries.getTimeSeries().getValue(_date);
if (value != null) {
builder.put(request, Result.success(value));
} else {
builder.put(request, Result.failure(FailureStatus.MISSING_DATA, "No data available for {}/{}/{}/{}/{}",
request.getId(), request.getFieldName().getName(),
_date, _dataSource, _dataProvider));
}
}
}
return builder.build();
}
}
}