/*
* Copyright (c) 2017 OBiBa. All rights reserved.
*
* This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.obiba.magma.datasource.jdbc;
import org.obiba.magma.Initialisable;
import org.obiba.magma.VariableEntity;
import org.obiba.magma.support.AbstractVariableEntityProvider;
import org.obiba.magma.support.VariableEntityBean;
import javax.validation.constraints.NotNull;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
class JdbcVariableEntityProvider extends AbstractVariableEntityProvider implements Initialisable {
private final JdbcValueTable valueTable;
private Set<VariableEntity> entities = new LinkedHashSet<>();
private boolean multilines = false;
JdbcVariableEntityProvider(JdbcValueTable valueTable) {
super(valueTable.getEntityType());
this.valueTable = valueTable;
}
@Override
public void initialise() {
JdbcDatasource datasource = valueTable.getDatasource();
String whereStatement = valueTable.getSettings().hasEntityIdentifiersWhere() ? "WHERE " + valueTable.getSettings().getEntityIdentifiersWhere() : "";
entities = new LinkedHashSet<>();
initialiseMultilines(datasource, whereStatement);
// get the distinct list of entity identifiers
List<VariableEntity> results = datasource.getJdbcTemplate().query(String
.format("SELECT DISTINCT %s FROM %s %s",
valueTable.getEntityIdentifierColumnSql(),
datasource.escapeTableName(valueTable.getSqlName()),
whereStatement),
(rs, rowNum) -> new VariableEntityBean(valueTable.getEntityType(), valueTable.extractEntityIdentifier(rs)));
entities.addAll(results);
}
@NotNull
@Override
public Set<VariableEntity> getVariableEntities() {
return Collections.unmodifiableSet(entities);
}
public boolean isMultilines() {
return multilines;
}
//
// Private methods
//
/**
* Detect if there are multiple lines per entity.
*
* @param datasource
* @param whereStatement
*/
private void initialiseMultilines(JdbcDatasource datasource, String whereStatement) {
long count = datasource.getJdbcTemplate().queryForObject(String.format("SELECT COUNT(%s) FROM %s %s",
valueTable.getEntityIdentifierColumnSql(),
datasource.escapeTableName(valueTable.getSqlName()),
whereStatement), Long.class);
long distinctCount = datasource.getJdbcTemplate().queryForObject(String.format("SELECT COUNT(DISTINCT %s) FROM %s %s",
valueTable.getEntityIdentifierColumnSql(),
datasource.escapeTableName(valueTable.getSqlName()),
whereStatement), Long.class);
multilines = count > distinctCount;
}
}