package org.openlca.core.database;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.openlca.core.model.Category;
import org.openlca.core.model.Parameter;
import org.openlca.core.model.ParameterScope;
import org.openlca.core.model.descriptors.ParameterDescriptor;
import org.openlca.util.Strings;
import com.google.common.base.Optional;
public class ParameterDao extends
CategorizedEntityDao<Parameter, ParameterDescriptor> {
public ParameterDao(IDatabase database) {
super(Parameter.class, ParameterDescriptor.class, database);
}
public List<Parameter> getGlobalParameters() {
String jpql = "select p from Parameter p where p.scope = :scope";
Map<String, Object> args = new HashMap<>();
args.put("scope", ParameterScope.GLOBAL);
return getAll(jpql, args);
}
public List<ParameterDescriptor> getGlobalDescriptors() {
String sql = getDescriptorQuery();
List<Object> parameters = new ArrayList<>();
sql += " where scope = ?";
parameters.add(ParameterScope.GLOBAL.name());
List<Object[]> results = selectAll(sql, getDescriptorFields(),
parameters);
return createDescriptors(results);
}
@Override
public List<ParameterDescriptor> getDescriptors(Optional<Category> category) {
String sql = getDescriptorQuery();
List<Object> parameters = new ArrayList<>();
if (category.isPresent()) {
sql += " where f_category = ?";
parameters.add(category.get().getId());
} else {
sql += " where f_category is null";
}
sql += " and scope = ?";
parameters.add(ParameterScope.GLOBAL.name());
List<Object[]> results = selectAll(sql, getDescriptorFields(),
parameters);
return createDescriptors(results);
}
public List<ParameterDescriptor> getDescriptors(String[] names) {
return getDescriptors(names, null);
}
public List<ParameterDescriptor> getDescriptors(String[] names,
ParameterScope scope) {
if (names == null || names.length == 0)
return Collections.emptyList();
StringBuilder sql = new StringBuilder(getDescriptorQuery());
List<Object> parameters = new ArrayList<>();
String[] list = new String[names.length];
for (int i = 0; i < names.length; i++)
list[i] = "'" + names[i].toLowerCase() + "'";
sql.append(" WHERE lower(name) IN (" + Strings.join(list, ',') + ")");
if (scope != null) {
sql.append(" AND scope = ?");
parameters.add(scope.name());
}
List<Object[]> results = selectAll(sql.toString(),
getDescriptorFields(), parameters);
return createDescriptors(results);
}
public boolean existsGlobal(String name) {
if (name == null)
return false;
String jpql = "SELECT count(param) FROM Parameter param "
+ "WHERE lower(param.name) = :name "
+ "AND param.scope = :scope";
Map<String, Object> parameters = new HashMap<>();
parameters.put("name", name.toLowerCase());
parameters.put("scope", ParameterScope.GLOBAL);
return getCount(jpql, parameters) > 0;
}
}