/** * Evaluates a value path against a set of results, returning the resolved result for each trade. * * @param valuePath the value path * @param results the calculation results * @return the list of resolved results for each trade */ public static List<Result<?>> evaluate(String valuePath, ReportCalculationResults results) { List<String> tokens = tokenize(valuePath); if (tokens.size() < 1) { return Collections.nCopies( results.getTargets().size(), Result.failure(FailureReason.INVALID, "Column expressions must not be empty")); } CalculationFunctions functions = results.getCalculationFunctions(); int rowCount = results.getCalculationResults().getRowCount(); return IntStream.range(0, rowCount) .mapToObj(rowIndex -> evaluate(functions, tokens, RootEvaluator.INSTANCE, new ResultsRow(results, rowIndex))) .collect(toImmutableList()); }
@Override public TradeReport runReport(ReportCalculationResults results, TradeReportTemplate reportTemplate) { ImmutableTable.Builder<Integer, Integer, Result<?>> resultTable = ImmutableTable.builder(); for (int reportColumnIdx = 0; reportColumnIdx < reportTemplate.getColumns().size(); reportColumnIdx++) { TradeReportColumn reportColumn = reportTemplate.getColumns().get(reportColumnIdx); List<Result<?>> columnResults; if (reportColumn.getValue().isPresent()) { columnResults = ValuePathEvaluator.evaluate(reportColumn.getValue().get(), results); } else { columnResults = IntStream.range(0, results.getTargets().size()) .mapToObj(i -> Result.failure(FailureReason.INVALID, "No value specified in report template")) .collect(toImmutableList()); } int rowCount = results.getCalculationResults().getRowCount(); for (int rowIdx = 0; rowIdx < rowCount; rowIdx++) { resultTable.put(rowIdx, reportColumnIdx, columnResults.get(rowIdx)); } } return TradeReport.builder() .runInstant(Instant.now()) .valuationDate(results.getValuationDate()) .columns(reportTemplate.getColumns()) .data(resultTable.build()) .build(); }
@Override public Report runReport(ReportCalculationResults calculationResults, CashFlowReportTemplate reportTemplate) { int tradeCount = calculationResults.getCalculationResults().getRowCount(); if (tradeCount == 0) { throw new IllegalArgumentException("Calculation results is empty"); } if (tradeCount > 1) { throw new IllegalArgumentException( Messages.format("Unable to show cashflow report for {} trades at once. " + "Please filter the portfolio to a single trade.", tradeCount)); } int columnIdx = calculationResults.getColumns().indexOf(Column.of(Measures.EXPLAIN_PRESENT_VALUE)); if (columnIdx == -1) { throw new IllegalArgumentException( Messages.format("Unable to find column for required measure '{}' in calculation results", Measures.EXPLAIN_PRESENT_VALUE)); } Result<?> result = calculationResults.getCalculationResults().get(0, columnIdx); if (result.isFailure()) { throw new IllegalArgumentException( Messages.format("Failure result found for required measure '{}': {}", Measures.EXPLAIN_PRESENT_VALUE, result.getFailure().getMessage())); } ExplainMap explainMap = (ExplainMap) result.getValue(); return runReport(explainMap, calculationResults.getValuationDate()); }