package org.openlca.core.results;
import java.util.ArrayList;
import java.util.List;
import org.openlca.core.database.EntityCache;
import org.openlca.core.matrix.FlowIndex;
import org.openlca.core.model.descriptors.FlowDescriptor;
import org.openlca.core.model.descriptors.ImpactCategoryDescriptor;
import org.openlca.core.model.descriptors.ProcessDescriptor;
public class ContributionResultProvider<T extends ContributionResult> extends
SimpleResultProvider<T> {
public ContributionResultProvider(T result, EntityCache cache) {
super(result, cache);
}
/**
* Get the single flow results for the process with the given ID.
*/
public List<FlowResult> getSingleFlowResults(ProcessDescriptor process) {
FlowIndex index = result.flowIndex;
List<FlowResult> results = new ArrayList<>();
for (FlowDescriptor flow : getFlowDescriptors()) {
double val = result.getSingleFlowResult(process.getId(),
flow.getId());
val = adoptFlowResult(val, flow.getId());
FlowResult r = new FlowResult();
r.flow = flow;
r.input = index.isInput(flow.getId());
r.value = val;
results.add(r);
}
return results;
}
public FlowResult getSingleFlowResult(ProcessDescriptor process,
FlowDescriptor flow) {
double val = result.getSingleFlowResult(process.getId(), flow.getId());
val = adoptFlowResult(val, flow.getId());
FlowResult r = new FlowResult();
r.flow = flow;
FlowIndex index = result.flowIndex;
r.input = index.isInput(flow.getId());
r.value = val;
return r;
}
/**
* Get the single contributions of the processes to the total result of the
* given flow.
*/
public ContributionSet<ProcessDescriptor> getProcessContributions(
FlowDescriptor flow) {
final long flowId = flow.getId();
double total = adoptFlowResult(result.getTotalFlowResult(flowId),
flowId);
return Contributions.calculate(getProcessDescriptors(), total,
process -> {
double val = result.getSingleFlowResult(
process.getId(), flowId);
return adoptFlowResult(val, flowId);
});
}
/**
* Get the single impact results for the process with the given ID.
*/
public List<ImpactResult> getSingleImpactResults(ProcessDescriptor process) {
List<ImpactResult> results = new ArrayList<>();
for (ImpactCategoryDescriptor impact : getImpactDescriptors())
results.add(getSingleImpactResult(process, impact));
return results;
}
public ImpactResult getSingleImpactResult(ProcessDescriptor process,
ImpactCategoryDescriptor impact) {
double val = result.getSingleImpactResult(process.getId(),
impact.getId());
ImpactResult r = new ImpactResult();
r.impactCategory = impact;
r.value = val;
return r;
}
/**
* Get the single contributions of the processes to the total result of the
* given LCIA category.
*/
public ContributionSet<ProcessDescriptor> getProcessContributions(
ImpactCategoryDescriptor impact) {
double total = result.getTotalImpactResult(impact.getId());
return Contributions.calculate(getProcessDescriptors(), total,
process -> result.getSingleImpactResult(process.getId(), impact.getId()));
}
public List<FlowResult> getSingleFlowImpacts(ImpactCategoryDescriptor impact) {
List<FlowResult> results = new ArrayList<>();
for (FlowDescriptor flow : getFlowDescriptors()) {
FlowResult r = getSingleFlowImpact(flow, impact);
results.add(r);
}
return results;
}
private FlowResult getSingleFlowImpact(FlowDescriptor flow,
ImpactCategoryDescriptor impact) {
FlowIndex index = result.flowIndex;
double val = result.getSingleFlowImpact(flow.getId(), impact.getId());
FlowResult r = new FlowResult();
r.flow = flow;
r.input = index.isInput(flow.getId());
r.value = val;
return r;
}
/**
* Get the single contributions of the flows to the total result of the
* given LCIA category.
*/
public ContributionSet<FlowDescriptor> getFlowContributions(
final ImpactCategoryDescriptor impact) {
double total = result.getTotalImpactResult(impact.getId());
return Contributions.calculate(getFlowDescriptors(), total,
flow -> result.getSingleFlowImpact(flow.getId(), impact.getId()));
}
public double getSingleCostResult(ProcessDescriptor process) {
return result.getSingleCostResult(process.getId());
}
public ContributionSet<ProcessDescriptor> getProcessCostContributions() {
return Contributions.calculate(
getProcessDescriptors(),
result.totalCostResult,
process -> result.getSingleCostResult(process.getId()));
}
}