package org.nextprot.api.etl.service.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.nextprot.api.commons.spring.jdbc.DataSourceServiceLocator;
import org.nextprot.api.etl.service.StatementLoaderService;
import org.nextprot.commons.statements.Statement;
import org.nextprot.commons.statements.StatementField;
import org.nextprot.commons.statements.constants.NextProtSource;
import org.nextprot.commons.statements.constants.StatementTableNames;
import org.nextprot.commons.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class JDBCStatementLoaderServiceImpl implements StatementLoaderService {
@Autowired private DataSourceServiceLocator dataSourceServiceLocator = null;
private String entryTable = StatementTableNames.ENTRY_TABLE;
private String rawTable = StatementTableNames.RAW_TABLE;
@Override
public void loadRawStatementsForSource(Set<Statement> statements, NextProtSource source) throws SQLException {
load(statements, rawTable, source);
}
@Override
public void loadStatementsMappedToEntrySpecAnnotationsForSource(Set<Statement> statements, NextProtSource source) throws SQLException {
load(statements, entryTable, source);
}
private void load(Set<Statement> statements, String tableName, NextProtSource source) throws SQLException {
java.sql.Statement deleteStatement = null;
PreparedStatement pstmt = null;
try (Connection conn = dataSourceServiceLocator.getStatementsDataSource().getConnection()) {
deleteStatement = conn.createStatement();
deleteStatement.addBatch("DELETE FROM nxflat." + tableName + " WHERE SOURCE = '" + source.getSourceName() + "'");
String columnNames = StringUtils.mkString(StatementField.values(), "", ",", "");
List<String> bindVariablesList = new ArrayList<>();
for (int i=0 ; i<StatementField.values().length; i++) {
bindVariablesList.add("?");
}
String bindVariables = StringUtils.mkString(bindVariablesList, "",",", "");
pstmt = conn.prepareStatement(
"INSERT INTO nxflat." + tableName + " (" + columnNames + ") VALUES ( " + bindVariables + ")"
);
for (Statement s : statements) {
for (int i = 0; i < StatementField.values().length; i++) {
StatementField sf = StatementField.values()[i];
String value = null;
if(StatementField.SOURCE.equals(sf)){
value = source.getSourceName();
}else value = s.getValue(sf);
if (value != null) {
pstmt.setString(i + 1, value.replace("'", "''"));
} else {
pstmt.setNull(i + 1, java.sql.Types.VARCHAR);
}
}
pstmt.addBatch();
}
deleteStatement.executeBatch();
pstmt.executeBatch();
} finally {
if(deleteStatement != null){
deleteStatement.close();
}
if(pstmt != null){
pstmt.close();
}
}
}
}