/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.master.historicaltimeseries.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.threeten.bp.LocalDate;
import com.opengamma.core.historicaltimeseries.impl.NonVersionedRedisHistoricalTimeSeriesSource;
import com.opengamma.core.value.MarketDataRequirementNames;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.id.ExternalIdBundleWithDates;
import com.opengamma.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolutionResult;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolver;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolverWithBasicChangeManager;
import com.opengamma.master.historicaltimeseries.ManageableHistoricalTimeSeriesInfo;
import com.opengamma.util.ArgumentChecker;
/**
* Implements {@link HistoricalTimeSeriesResolver} on top of any Redis HTS source.
*/
public class RedisSimulationSeriesResolver extends HistoricalTimeSeriesResolverWithBasicChangeManager {
private static final Logger s_logger = LoggerFactory.getLogger(RedisSimulationSeriesResolver.class);
private final NonVersionedRedisHistoricalTimeSeriesSource[] _redisSources;
public RedisSimulationSeriesResolver(NonVersionedRedisHistoricalTimeSeriesSource... redisSources) {
ArgumentChecker.notNull(redisSources, "sources");
ArgumentChecker.notNegativeOrZero(redisSources.length, "redisSources must not be empty");
_redisSources = redisSources;
}
@Override
public HistoricalTimeSeriesResolutionResult resolve(final ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, final String dataSource, final String dataProvider, final String dataField,
String resolutionKey) {
if (identifierBundle.isEmpty()) {
return null; // is this the correct action?
} else if (identifierBundle.size() > 1) {
s_logger.warn("Attempted to call RedisSimulationSeriesSource with bundle {}. Calls with more than 1 entry in ID bundle are probably misuse of this class.", identifierBundle);
}
ExternalId externalId = identifierBundle.getExternalIds().iterator().next();
if (!MarketDataRequirementNames.MARKET_VALUE.equals(dataField)) {
//TODO: Should store field name with the series so fields other than Market_Value can be used.
//s_logger.warn("Redis simulation asked for {} for {}, can only handle market value.", dataField, externalId);
return null;
}
final UniqueId uniqueId = UniqueId.of(externalId.getScheme().getName(), externalId.getValue());
boolean oneMatches = false;
for (NonVersionedRedisHistoricalTimeSeriesSource source : _redisSources) {
if (source.exists(uniqueId)) {
oneMatches = true;
break;
}
}
if (!oneMatches) {
return null;
}
ManageableHistoricalTimeSeriesInfo htsInfo = new ManageableHistoricalTimeSeriesInfo() {
private static final long serialVersionUID = 1L;
@Override
public UniqueId getUniqueId() {
return uniqueId;
}
@Override
public ExternalIdBundleWithDates getExternalIdBundle() {
return ExternalIdBundleWithDates.of(identifierBundle);
}
@Override
public String getName() {
throw new UnsupportedOperationException("Unsupported operation.");
}
@Override
public String getDataField() {
return dataField;
}
@Override
public String getDataSource() {
return dataSource;
}
@Override
public String getDataProvider() {
return dataProvider;
}
@Override
public String getObservationTime() {
return null;
}
@Override
public ObjectId getTimeSeriesObjectId() {
return uniqueId.getObjectId();
}
};
HistoricalTimeSeriesResolutionResult result = new HistoricalTimeSeriesResolutionResult(htsInfo);
return result;
}
}