/*
* Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.calc.runner;
import static com.opengamma.strata.collect.Guavate.toImmutableList;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import com.google.common.collect.ImmutableList;
import com.opengamma.strata.basics.CalculationTarget;
import com.opengamma.strata.calc.Column;
import com.opengamma.strata.calc.ColumnHeader;
import com.opengamma.strata.calc.Results;
import com.opengamma.strata.collect.result.Result;
/**
* Calculation listener that receives the results of individual calculations and builds a set of {@link Results}.
*/
public final class ResultsListener extends AggregatingCalculationListener<Results> {
/** Comparator for sorting the results by row and then column. */
private static final Comparator<CalculationResult> COMPARATOR =
Comparator.comparingInt(CalculationResult::getRowIndex)
.thenComparingInt(CalculationResult::getColumnIndex);
/** List that is populated with the results as they arrive. */
private final List<CalculationResult> results = new ArrayList<>();
/** The columns that define what values are calculated. */
private List<Column> columns;
/**
* Creates a new instance.
*/
public ResultsListener() {
}
@Override
public void calculationsStarted(List<CalculationTarget> targets, List<Column> columns) {
this.columns = ImmutableList.copyOf(columns);
}
@Override
public void resultReceived(CalculationTarget target, CalculationResult result) {
results.add(result);
}
@Override
protected Results createAggregateResult() {
results.sort(COMPARATOR);
return buildResults(results, columns);
}
/**
* Builds a set of results from the results of the individual calculations.
*
* @param calculationResults the results of the individual calculations
* @param columns the columns that define what values are calculated
* @return the results
*/
private static Results buildResults(List<CalculationResult> calculationResults, List<Column> columns) {
List<Result<?>> results = calculationResults.stream()
.map(CalculationResult::getResult)
.collect(toImmutableList());
List<ColumnHeader> headers = columns.stream()
.map(Column::toHeader)
.collect(toImmutableList());
return Results.of(headers, results);
}
}