/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.bbg.loader.hts; import static com.opengamma.bbg.BloombergConstants.BLOOMBERG_DATA_SOURCE_NAME; import static com.opengamma.util.time.DateUtils.previousWeekDay; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.threeten.bp.DayOfWeek; import org.threeten.bp.LocalDate; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.opengamma.bbg.BloombergConstants; import com.opengamma.bbg.BloombergIdentifierProvider; import com.opengamma.bbg.util.MockReferenceDataProvider; import com.opengamma.core.historicaltimeseries.HistoricalTimeSeries; import com.opengamma.core.id.ExternalSchemes; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.ExternalIdBundleWithDates; import com.opengamma.id.ExternalIdWithDates; import com.opengamma.id.UniqueId; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoDocument; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesMaster; import com.opengamma.master.historicaltimeseries.ManageableHistoricalTimeSeriesInfo; import com.opengamma.master.historicaltimeseries.impl.InMemoryHistoricalTimeSeriesMaster; import com.opengamma.provider.historicaltimeseries.HistoricalTimeSeriesProvider; import com.opengamma.provider.historicaltimeseries.HistoricalTimeSeriesProviderGetRequest; import com.opengamma.provider.historicaltimeseries.HistoricalTimeSeriesProviderGetResult; import com.opengamma.provider.historicaltimeseries.impl.AbstractHistoricalTimeSeriesProvider; import com.opengamma.timeseries.date.localdate.ImmutableLocalDateDoubleTimeSeries; import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeries; import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeriesBuilder; import com.opengamma.util.MapUtils; import com.opengamma.util.time.LocalDateRange; import com.opengamma.util.tuple.Pair; import com.opengamma.util.tuple.Pairs; /** * */ public abstract class AbstractBloombergHTSTest { private static final Logger s_logger = LoggerFactory.getLogger(AbstractBloombergHTSTest.class); protected static final String[] DATA_FIELDS = new String[] {"PX_LAST", "VOLUME"}; protected static final String[] DATA_PROVIDERS = new String[] {"UNKNOWN", "CMPL", "CMPT", "DEFAULT"}; protected static final String[] DATA_SOURCES = new String[] {BLOOMBERG_DATA_SOURCE_NAME, "REUTERS", "JPM"}; protected static final int TS_DATASET_SIZE = 2; protected static final Map<String, String> s_provider2ObservationTime = ImmutableMap.of("UNKNOWN", "UNKNOWN", "CMPL", "LONDON_CLOSE", "CMPT", "TOKYO_CLOSE", "DEFAULT", "DEFAULT"); private HistoricalTimeSeriesMaster _htsMaster; private BloombergHTSMasterUpdater _htsMasterUpdater; private BloombergHistoricalTimeSeriesLoader _loader; private HistoricalTimeSeriesProvider _historicalTimeSeriesProvider; /** * Creates an instance. */ public AbstractBloombergHTSTest() { super(); } //------------------------------------------------------------------------- @BeforeMethod(alwaysRun = true) protected void doSetUp() { _htsMaster = new InMemoryHistoricalTimeSeriesMaster(); _historicalTimeSeriesProvider = new UnitTestHistoricalTimeSeriesProvider(); BloombergIdentifierProvider idProvider = new BloombergIdentifierProvider(new MockReferenceDataProvider()); _htsMasterUpdater = new BloombergHTSMasterUpdater(_htsMaster, _historicalTimeSeriesProvider, idProvider); _loader = new BloombergHistoricalTimeSeriesLoader(_htsMaster, _historicalTimeSeriesProvider, idProvider); } @AfterMethod(alwaysRun = true) protected void doTearDown() { _htsMaster = null; } //------------------------------------------------------------------------- private static class UnitTestHistoricalTimeSeriesProvider extends AbstractHistoricalTimeSeriesProvider { //keep track of start date to use the same for reloading Map<ExternalIdBundle, LocalDate> _startDateMap = new HashMap<ExternalIdBundle, LocalDate>(); @Override protected HistoricalTimeSeriesProviderGetResult doBulkGet(HistoricalTimeSeriesProviderGetRequest request) { Map<ExternalIdBundle, LocalDateDoubleTimeSeries> tsMap = Maps.newHashMap(); LocalDate start = request.getDateRange().getStartDateInclusive(); LocalDate end = request.getDateRange().getEndDateInclusive(); s_logger.debug("producing TS for startDate={} endDate={}", start, end); for (ExternalIdBundle identifiers : request.getExternalIdBundles()) { LocalDate cachedStart = MapUtils.putIfAbsentGet(_startDateMap, identifiers, start); if (start.isBefore(cachedStart)) { start = cachedStart; } if (end.equals(LocalDate.MAX)) { end = previousWeekDay(); } LocalDateDoubleTimeSeries timeSeries = makeRandomTimeSeries(start, end); tsMap.put(identifiers, timeSeries); } return new HistoricalTimeSeriesProviderGetResult(tsMap); } private LocalDateDoubleTimeSeries makeRandomTimeSeries(LocalDate start, LocalDate end) { LocalDateDoubleTimeSeriesBuilder tsMap = ImmutableLocalDateDoubleTimeSeries.builder(); LocalDate current = start; tsMap.put(current, Math.random()); while (current.isBefore(end)) { current = current.plusDays(1); if (isWeekday(current)) { tsMap.put(current, Math.random()); } } return tsMap.build(); } private boolean isWeekday(LocalDate day) { return (day.getDayOfWeek() != DayOfWeek.SATURDAY && day.getDayOfWeek() != DayOfWeek.SUNDAY); } } protected List<Pair<HistoricalTimeSeriesInfoDocument, HistoricalTimeSeries>> addTimeSeries() { List<Pair<HistoricalTimeSeriesInfoDocument, HistoricalTimeSeries>> result = Lists.newArrayList(); for (int i = 0; i < TS_DATASET_SIZE; i++) { LocalDate end = previousWeekDay().minusWeeks(1); LocalDate start = end.minusWeeks(2); for (String dataSource : DATA_SOURCES) { for (String dataProvider : DATA_PROVIDERS) { for (String dataField : DATA_FIELDS) { ManageableHistoricalTimeSeriesInfo info = new ManageableHistoricalTimeSeriesInfo(); info.setName(dataField + " " + dataSource); info.setDataField(dataField); info.setDataProvider(dataProvider); info.setDataSource(dataSource); info.setObservationTime(s_provider2ObservationTime.get(dataProvider)); ExternalId ticker = ExternalSchemes.bloombergTickerSecurityId("ticker" + i); ExternalId buid = ExternalSchemes.bloombergBuidSecurityId("buid" + i); final ExternalIdBundleWithDates bundleWithDates = ExternalIdBundleWithDates.of(ExternalIdWithDates.of(ticker), ExternalIdWithDates.of(buid)); info.setExternalIdBundle(bundleWithDates); HistoricalTimeSeriesInfoDocument added = _htsMaster.add(new HistoricalTimeSeriesInfoDocument(info)); assertNotNull(added); assertNotNull(added.getUniqueId()); Map<ExternalIdBundle, LocalDateDoubleTimeSeries> resultMap = _historicalTimeSeriesProvider.getHistoricalTimeSeries( Collections.singleton(bundleWithDates.toBundle()), BloombergConstants.BLOOMBERG_DATA_SOURCE_NAME, dataProvider, dataField, LocalDateRange.of(start, end, true)); LocalDateDoubleTimeSeries timeSeries = resultMap.get(bundleWithDates.toBundle()); UniqueId tsUid = _htsMaster.updateTimeSeriesDataPoints(added.getInfo().getTimeSeriesObjectId(), timeSeries); HistoricalTimeSeries hts = _htsMaster.getTimeSeries(tsUid); assertNotNull(hts); assertEquals(timeSeries, hts.getTimeSeries()); result.add(Pairs.of(added, hts)); } } } } return result; } /** * Gets the htsMasterUpdater. * @return the htsMasterUpdater */ protected BloombergHTSMasterUpdater getHtsMasterUpdater() { return _htsMasterUpdater; } /** * Gets the loader. * @return the loader */ protected BloombergHistoricalTimeSeriesLoader getLoader() { return _loader; } /** * Gets the htsMaster. * @return the htsMaster */ protected HistoricalTimeSeriesMaster getHtsMaster() { return _htsMaster; } }