/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame.marketdata;
import org.threeten.bp.LocalDate;
import com.opengamma.financial.analytics.ircurve.strips.CurveNodeWithIdentifier;
import com.opengamma.financial.analytics.ircurve.strips.PointsCurveNodeWithIdentifier;
import com.opengamma.financial.currency.CurrencyPair;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.sesame.Environment;
import com.opengamma.timeseries.date.DateTimeSeries;
import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeries;
import com.opengamma.util.result.FailureStatus;
import com.opengamma.util.result.Result;
import com.opengamma.util.time.LocalDateRange;
/**
* Default implementation of {@link HistoricalMarketDataFn}.
*/
public class DefaultHistoricalMarketDataFn implements HistoricalMarketDataFn {
@Override
public Result<LocalDateDoubleTimeSeries> getCurveNodeValues(Environment env,
CurveNodeWithIdentifier node,
LocalDateRange dateRange) {
ExternalIdBundle id = node.getIdentifier().toBundle();
FieldName fieldName = FieldName.of(node.getDataField());
return get(env, id, fieldName, dateRange);
}
@Override
public Result<LocalDateDoubleTimeSeries> getCurveNodeUnderlyingValue(Environment env,
PointsCurveNodeWithIdentifier node,
LocalDateRange dateRange) {
ExternalIdBundle id = node.getUnderlyingIdentifier().toBundle();
FieldName fieldName = FieldName.of(node.getUnderlyingDataField());
return get(env, id, fieldName, dateRange);
}
@Override
public Result<LocalDateDoubleTimeSeries> getMarketValues(Environment env,
ExternalIdBundle id,
LocalDateRange dateRange) {
return get(env, id, MarketDataUtils.MARKET_VALUE, dateRange);
}
@Override
public Result<LocalDateDoubleTimeSeries> getValues(Environment env,
ExternalIdBundle id,
FieldName fieldName,
LocalDateRange dateRange) {
return get(env, id, fieldName, dateRange);
}
@Override
public Result<LocalDateDoubleTimeSeries> getFxRates(Environment env,
CurrencyPair currencyPair,
LocalDateRange dateRange) {
FxRateId rateId = FxRateId.of(currencyPair.getBase(), currencyPair.getCounter());
Result<DateTimeSeries<LocalDate, Double>> result = env.getMarketDataBundle().get(rateId, Double.class, dateRange);
if (!result.isSuccess()) {
return Result.failure(result);
} else {
return Result.success(MarketDataUtils.asLocalDateDoubleTimeSeries(result.getValue()));
}
}
private Result<LocalDateDoubleTimeSeries> get(Environment env,
ExternalIdBundle id,
FieldName fieldName,
LocalDateRange dateRange) {
RawId<Double> key = RawId.of(id, fieldName);
Result<DateTimeSeries<LocalDate, Double>> timeSeriesResult =
env.getMarketDataBundle().get(key, Double.class, dateRange);
if (!timeSeriesResult.isSuccess()) {
return Result.failure(timeSeriesResult);
}
LocalDateDoubleTimeSeries timeSeries = MarketDataUtils.asLocalDateDoubleTimeSeries(timeSeriesResult.getValue());
if (timeSeries.isEmpty()) {
return Result.failure(FailureStatus.MISSING_DATA, "Empty time series found for {}/{}", id, fieldName);
} else {
return Result.success(timeSeries);
}
}
}