package org.openlca.core.database.usage;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.openlca.core.database.IDatabase;
import org.openlca.core.model.Flow;
import org.openlca.core.model.FlowPropertyFactor;
import org.openlca.core.model.ModelType;
import org.openlca.core.model.descriptors.CategorizedDescriptor;
/**
* Searches for the usage of flow property factors of a given flow in other
* entities of the database.
*/
public class FlowPropertyFactorUseSearch {
private IDatabase database;
private Flow flow;
public FlowPropertyFactorUseSearch(Flow flow, IDatabase database) {
this.flow = flow;
this.database = database;
}
public List<CategorizedDescriptor> findUses(FlowPropertyFactor factor) {
if (flow == null || factor == null || database == null)
return Collections.emptyList();
List<CategorizedDescriptor> results = new ArrayList<>();
// only exchange and impact factor are relevant, because all others can
// only refer to units that are used in one of them
Set<Long> categoryIds = Search.on(database).queryForIds(
getImpactCategoryQuery(factor));
results.addAll(Search.on(database).queryFor(ModelType.IMPACT_METHOD,
"f_impact_method", "tbl_impact_categories", categoryIds, "id"));
results.addAll(Search.on(database).queryFor(ModelType.PROCESS,
getProcessQuery(factor)));
return results;
}
private String getImpactCategoryQuery(FlowPropertyFactor factor) {
StringBuilder query = new StringBuilder();
query.append("SELECT DISTINCT f_impact_category FROM tbl_impact_factors");
query.append(" WHERE f_flow = " + flow.getId());
query.append(" AND f_flow_property_factor = " + factor.getId());
return query.toString();
}
private String getProcessQuery(FlowPropertyFactor factor) {
StringBuilder query = new StringBuilder();
query.append("SELECT DISTINCT f_owner FROM tbl_exchanges");
query.append(" WHERE f_flow = " + flow.getId());
query.append(" AND f_flow_property_factor = " + factor.getId());
return query.toString();
}
}