package org.openlca.core.results; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.openlca.core.database.EntityCache; import org.openlca.core.matrix.FlowIndex; import org.openlca.core.matrix.LongIndex; import org.openlca.core.matrix.TechIndex; import org.openlca.core.model.descriptors.FlowDescriptor; import org.openlca.core.model.descriptors.ImpactCategoryDescriptor; import org.openlca.core.model.descriptors.ProcessDescriptor; public class BaseResultProvider<T extends BaseResult> implements IResultProvider { public final T result; public final EntityCache cache; public BaseResultProvider(T result, EntityCache cache) { this.result = result; this.cache = cache; } @Override public boolean hasImpactResults() { return result.hasImpactResults(); } @Override public boolean hasCostResults() { return result.hasCostResults; } @Override public Set<ProcessDescriptor> getProcessDescriptors() { TechIndex index = result.productIndex; if (index == null) return Collections.emptySet(); Map<Long, ProcessDescriptor> values = cache.getAll( ProcessDescriptor.class, index.getProcessIds()); HashSet<ProcessDescriptor> descriptors = new HashSet<>(); descriptors.addAll(values.values()); return descriptors; } @Override public Set<FlowDescriptor> getFlowDescriptors() { FlowIndex index = result.flowIndex; if (index == null) return Collections.emptySet(); List<Long> ids = new ArrayList<>(index.size()); for (long id : index.getFlowIds()) ids.add(id); Map<Long, FlowDescriptor> values = cache.getAll(FlowDescriptor.class, ids); HashSet<FlowDescriptor> descriptors = new HashSet<>(); descriptors.addAll(values.values()); return descriptors; } @Override public Set<ImpactCategoryDescriptor> getImpactDescriptors() { LongIndex index = result.impactIndex; if (index == null) return Collections.emptySet(); List<Long> ids = new ArrayList<>(index.size()); for (long id : index.getKeys()) ids.add(id); Map<Long, ImpactCategoryDescriptor> values = cache.getAll( ImpactCategoryDescriptor.class, ids); HashSet<ImpactCategoryDescriptor> descriptors = new HashSet<>(); descriptors.addAll(values.values()); return descriptors; } @Override public boolean isInput(FlowDescriptor flow) { if (flow == null || result.flowIndex == null) return false; return result.flowIndex.isInput(flow.getId()); } }