package org.openlca.core.matrix.cache;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import org.openlca.core.database.IDatabase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import gnu.trove.impl.Constants;
import gnu.trove.map.hash.TLongDoubleHashMap;
/**
* A table that contains the conversion factors for units and flow property
* factors. (Note: A flow can have multiple flow properties and a flow property
* factor describes the flow specific conversion of a flow property to the
* reference flow property of a flow).
*/
public class ConversionTable {
private IDatabase database;
// primitive maps for the factors: no-key: 0, default conversion factors: 1
private TLongDoubleHashMap unitFactors = new TLongDoubleHashMap(
Constants.DEFAULT_CAPACITY, Constants.DEFAULT_LOAD_FACTOR, 0L, 1d);
private TLongDoubleHashMap propertyFactors = new TLongDoubleHashMap(
Constants.DEFAULT_CAPACITY, Constants.DEFAULT_LOAD_FACTOR, 0L, 1d);
public static ConversionTable create(IDatabase database) {
ConversionTable table = new ConversionTable(database);
table.init();
return table;
}
private ConversionTable(IDatabase database) {
this.database = database;
}
public void reload() {
unitFactors.clear();
propertyFactors.clear();
init();
}
private void init() {
try (Connection con = database.createConnection()) {
loadFactors(con, "tbl_units", unitFactors);
loadFactors(con, "tbl_flow_property_factors", propertyFactors);
} catch (Exception e) {
Logger log = LoggerFactory.getLogger(getClass());
log.error("failed to initialize conversion table", e);
}
}
private void loadFactors(Connection con, String table,
TLongDoubleHashMap map) throws Exception {
Statement statement = con.createStatement();
String query = "select id, conversion_factor from " + table;
ResultSet set = statement.executeQuery(query);
while (set.next()) {
long id = set.getLong("id");
double factor = set.getDouble("conversion_factor");
map.put(id, factor);
}
statement.close();
set.close();
}
/**
* Get the conversion factor of the unit with the given ID to the reference
* unit of the unit group to which this unit belongs.
*/
public double getUnitFactor(long unitId) {
return unitFactors.get(unitId);
}
/**
* Get the conversion factor of the given flow property factor to the
* reference flow property factor of a flow.
*/
public double getPropertyFactor(long flowPropertyFactorId) {
return propertyFactors.get(flowPropertyFactorId);
}
}