/*
* 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 com.google.common.base.Strings;
import com.google.common.collect.Lists;
import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.List;
import static org.obiba.magma.datasource.jdbc.JdbcValueTableSettings.ENTITY_ID_COLUMN;
public class JdbcValueTableSettingsFactory {
//
// Instance Variables
//
private String sqlTableName;
private String magmaTableName;
/**
* Partitioning criteria: distinct values will be used as where statements for building {@link JdbcValueTableSettings}.
*/
private String tablePartitionColumn;
private String entityType;
private String entityIdentifierColumn;
/**
* If provided, a column with this name will be populated with creation timestamps.
*/
private String createdTimestampColumnName;
/**
* If provided, a column with this name will be populated with last update timestamps.
*/
private String updatedTimestampColumnName;
private String entityIdentifiersWhere;
private String excludedColumns;
private String includedColumns;
private boolean multilines;
//
// Constructors
//
private JdbcValueTableSettingsFactory(String sqlTableName, String tablePartitionColumn) {
if(Strings.isNullOrEmpty(sqlTableName)) {
throw new IllegalArgumentException("null or empty sqlTableName");
}
if(Strings.isNullOrEmpty(tablePartitionColumn)) {
throw new IllegalArgumentException("null or empty tablePartitionColumn");
}
this.sqlTableName = sqlTableName;
this.tablePartitionColumn = tablePartitionColumn;
this.entityType = "Participant";
this.entityIdentifierColumn = ENTITY_ID_COLUMN;
}
//
// Methods
//
@NotNull
public Collection<JdbcValueTableSettings> createSettings(List<String> partitionCriteria, JdbcDatasource datasource) {
List<JdbcValueTableSettings> settings = Lists.newArrayList();
if (partitionCriteria == null || partitionCriteria.isEmpty()) return settings;
for (String filter : partitionCriteria) {
// build the where criteria
String where = datasource.escapeColumnName(tablePartitionColumn) + " = '" + filter + "'";
if (!Strings.isNullOrEmpty(entityIdentifiersWhere)) where = where + " AND " + entityIdentifiersWhere;
settings.add(JdbcValueTableSettings.newSettings(sqlTableName)
.tableName(Strings.isNullOrEmpty(magmaTableName) ? filter : magmaTableName + filter)
.entityType(entityType).createdTimestampColumn(createdTimestampColumnName)
.updatedTimestampColumn(updatedTimestampColumnName).entityIdentifierColumn(entityIdentifierColumn)
.excludedColumns(excludedColumns).includedColumns(includedColumns).multilines(multilines)
.entityIdentifiersWhere(where).build());
}
return settings;
}
public String getSqlTableName() {
return sqlTableName;
}
public String getTablePartitionColumn() {
return tablePartitionColumn;
}
public boolean hasMagmaTableName() {
return !Strings.isNullOrEmpty(magmaTableName);
}
public String getMagmaTableName() {
return magmaTableName;
}
public String getEntityType() {
return entityType;
}
public String getEntityIdentifierColumn() {
return entityIdentifierColumn;
}
public String getCreatedTimestampColumnName() {
return createdTimestampColumnName;
}
public boolean hasCreatedTimestampColumnName() {
return !Strings.isNullOrEmpty(createdTimestampColumnName);
}
public String getUpdatedTimestampColumnName() {
return updatedTimestampColumnName;
}
public boolean hasUpdatedTimestampColumnName() {
return !Strings.isNullOrEmpty(updatedTimestampColumnName);
}
public boolean hasEntityIdentifiersWhere() {
return !Strings.isNullOrEmpty(entityIdentifiersWhere);
}
public String getEntityIdentifiersWhere() {
return entityIdentifiersWhere;
}
public String getExcludedColumns() {
return excludedColumns;
}
public boolean hasExcludedColumns() {
return !Strings.isNullOrEmpty(excludedColumns);
}
public String getIncludedColumns() {
return includedColumns;
}
public boolean hasIncludedColumns() {
return !Strings.isNullOrEmpty(includedColumns);
}
public boolean isMultilines() {
return multilines;
}
public static Builder newSettings(String sqlTableName, String entityIdentifiersFilterColumn) {
return new Builder(sqlTableName, entityIdentifiersFilterColumn);
}
public static class Builder {
private JdbcValueTableSettingsFactory factory;
private Builder(String name, String tablePartitionColumn) {
this.factory = new JdbcValueTableSettingsFactory(name, tablePartitionColumn);
}
public Builder tableName(String name) {
factory.magmaTableName = Strings.isNullOrEmpty(name) ? factory.sqlTableName : name;
return this;
}
public Builder entityType(String entityType) {
factory.entityType = entityType;
return this;
}
public Builder createdTimestampColumn(String name) {
factory.createdTimestampColumnName = name;
return this;
}
public Builder updatedTimestampColumn(String name) {
factory.updatedTimestampColumnName = name;
return this;
}
public Builder entityIdentifierColumn(String name) {
factory.entityIdentifierColumn = Strings.isNullOrEmpty(name) ? ENTITY_ID_COLUMN : name;
return this;
}
public Builder entityIdentifiersWhere(String where) {
factory.entityIdentifiersWhere = where;
return this;
}
public Builder excludedColumns(String name) {
factory.excludedColumns = name;
return this;
}
public Builder includedColumns(String name) {
factory.includedColumns = name;
return this;
}
public Builder multilines() {
return multilines(true);
}
public Builder multilines(boolean multilines) {
factory.multilines = multilines;
return this;
}
public JdbcValueTableSettingsFactory build() {
return factory;
}
}
}