package org.openlca.core.database.references;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.openlca.core.database.IDatabase;
import org.openlca.core.database.references.IReferenceSearch.Reference;
import org.openlca.core.model.AbstractEntity;
import org.openlca.core.model.Exchange;
import org.openlca.core.model.Flow;
import org.openlca.core.model.FlowPropertyFactor;
import org.openlca.core.model.Process;
import org.openlca.core.model.ProductSystem;
import org.openlca.core.model.Unit;
public class ExchangeReferenceSearch {
private final static Ref[] references = {
new Ref(Flow.class, "flow", "f_flow"),
new Ref(FlowPropertyFactor.class, "flowPropertyFactor", "f_flow_property_factor"),
new Ref(Unit.class, "unit", "f_unit")
};
private static final Map<Class<? extends AbstractEntity>, Map<Class<? extends AbstractEntity>, String>> nestedProperties = new HashMap<>();
static {
putNestedProperty(Process.class, "exchanges");
putNestedProperty(ProductSystem.class, "referenceExchange");
}
private static void putNestedProperty(
Class<? extends AbstractEntity> ownerType, String nestedProperty) {
for (Ref ref : references) {
Map<Class<? extends AbstractEntity>, String> inner = nestedProperties
.get(ownerType);
if (inner == null)
nestedProperties.put(ownerType, inner = new HashMap<>());
inner.put(ref.type, nestedProperty);
}
}
private final IDatabase database;
private final Map<Long, Class<? extends AbstractEntity>> ownerTypes;
private final Map<Long, Long> ownerIds;
public ExchangeReferenceSearch(IDatabase database) {
this(database, new HashMap<>(), new HashMap<>());
}
public ExchangeReferenceSearch(IDatabase database,
Map<Long, Class<? extends AbstractEntity>> ownerTypes,
Map<Long, Long> ownerIds) {
this.database = database;
this.ownerTypes = ownerTypes;
this.ownerIds = ownerIds;
}
public List<Reference> findReferences(Set<Long> ids) {
List<Reference> refs = Search.on(database, Exchange.class)
.findReferences("tbl_exchanges", "id", ids, references, true);
return Search.applyOwnerMaps(refs, ownerTypes, ownerIds, nestedProperties);
}
}