}
@Override
protected void doRun() {
try {
final HistoricalTimeSeriesMaster htsMaster = getToolContext().getHistoricalTimeSeriesMaster();
final HistoricalTimeSeriesGetFilter filter = new HistoricalTimeSeriesGetFilter();
filter.setMaxPoints(-1);
final LocalDate now = LocalDate.now();
final Random rnd = new Random();
int pointsAdded = 0;
int timeSeriesUpdated = 0;
_feedback.workRequired(_data.getFinishValues().size());
for (Map.Entry<Pair<ExternalId, String>, Double> centreValue : _data.getFinishValues().entrySet()) {
s_logger.debug("Updating TS points for {}/{}", centreValue.getKey().getFirst(), centreValue.getKey().getSecond());
final HistoricalTimeSeriesInfoSearchRequest searchRequest = new HistoricalTimeSeriesInfoSearchRequest();
searchRequest.addExternalId(centreValue.getKey().getFirst());
searchRequest.setDataField(centreValue.getKey().getSecond());
searchRequest.setDataProvider(SimulatedHistoricalData.OG_DATA_PROVIDER);
searchRequest.setDataSource(SimulatedHistoricalData.OG_DATA_SOURCE);
final HistoricalTimeSeriesInfoSearchResult searchResult = htsMaster.search(searchRequest);
if (searchResult.getDocuments().isEmpty()) {
s_logger.warn("No time series for {}/{}", centreValue.getKey().getFirst(), centreValue.getKey().getSecond());
} else {
for (HistoricalTimeSeriesInfoDocument infoDoc : searchResult.getDocuments()) {
s_logger.debug("Updating {}", infoDoc.getUniqueId());
final ManageableHistoricalTimeSeries hts = htsMaster.getTimeSeries(infoDoc.getUniqueId(), filter);
final LocalDateDoubleTimeSeries ldts = hts.getTimeSeries();
LocalDate pointDate = ldts.getLatestTime();
if (pointDate.isBefore(now)) {
final double centre = centreValue.getValue();
double pointValue = ldts.getLatestValueFast();
pointDate = DateUtils.nextWeekDay(pointDate);
List<LocalDate> dates = new ArrayList<LocalDate>();
List<Double> values = new ArrayList<Double>();
while (pointDate.isBefore(now)) {
pointValue = SimulatedHistoricalData.wiggleValue(rnd, pointValue, centre);
dates.add(pointDate);
values.add(pointValue);
pointDate = DateUtils.nextWeekDay(pointDate);
}
if (!dates.isEmpty()) {
s_logger.debug("Adding {} new points to {}", dates.size(), infoDoc.getUniqueId());
htsMaster.updateTimeSeriesDataPoints(infoDoc, ImmutableLocalDateDoubleTimeSeries.of(dates, values));
pointsAdded += dates.size();
timeSeriesUpdated++;
if ((timeSeriesUpdated % 100) == 0) {
GUIFeedback.say("Updated " + timeSeriesUpdated + " of " + _data.getFinishValues().size() + " time series");
}