/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame.engine;
import java.util.List;
import java.util.Map;
import org.threeten.bp.Instant;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Table;
import com.google.common.collect.TreeBasedTable;
import com.opengamma.sesame.trace.CallGraph;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.result.Failure;
import com.opengamma.util.result.FailureStatus;
import com.opengamma.util.result.Result;
/**
* Mutable builder for the immutable {@link Results} class.
*/
final class ResultBuilder {
private final Table<Integer, Integer, ResultItem> _table = TreeBasedTable.create();
private final List<?> _inputs;
private final List<String> _columnNames;
private final Map<String, ResultItem> _nonPortfolioResults = Maps.newHashMap();
private boolean _isPendingMarketData;
ResultBuilder(List<?> inputs, List<String> columnNames) {
_inputs = inputs;
_columnNames = columnNames;
}
void add(int rowIndex, int columnIndex, Result<?> result, CallGraph callGraph) {
_table.put(rowIndex, columnIndex, new ResultItem(result, callGraph));
checkForPendingData(result);
}
void add(String outputName, Result<?> result, CallGraph callGraph) {
_nonPortfolioResults.put(ArgumentChecker.notEmpty(outputName, "outputName"), new ResultItem(result, callGraph));
checkForPendingData(result);
}
private void checkForPendingData(Result<?> result) {
if (!_isPendingMarketData && !result.isSuccess()) {
for (Failure failure : result.getFailures()) {
if (failure.getStatus() == FailureStatus.PENDING_DATA) {
_isPendingMarketData = true;
return;
}
}
}
}
Results build(Instant start, long startExecution, long startInitialization, long startResultsBuild) {
Map<Integer, Map<Integer, ResultItem>> rowMap = _table.rowMap();
List<ResultRow> rows = Lists.newArrayListWithCapacity(rowMap.size());
int index = 0;
for (Map<Integer, ResultItem> row : rowMap.values()) {
rows.add(new ResultRow(_inputs.get(index++), Lists.newArrayList(row.values())));
}
ViewTimer timer = new ViewTimer(start, startInitialization, startExecution, startResultsBuild, System.nanoTime());
return new Results(_columnNames, rows, _nonPortfolioResults, _isPendingMarketData, timer);
}
}