package edu.isi.karma.imp.database;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import edu.isi.karma.imp.Import;
import edu.isi.karma.rep.HNode;
import edu.isi.karma.rep.HNode.HNodeType;
import edu.isi.karma.rep.HTable;
import edu.isi.karma.rep.Row;
import edu.isi.karma.rep.Table;
import edu.isi.karma.rep.Worksheet;
import edu.isi.karma.rep.Workspace;
import edu.isi.karma.rep.metadata.SourceInformation;
import edu.isi.karma.rep.metadata.SourceInformation.InfoAttribute;
import edu.isi.karma.rep.metadata.WorksheetProperties.Property;
import edu.isi.karma.rep.metadata.WorksheetProperties.SourceTypes;
import edu.isi.karma.util.AbstractJDBCUtil;
import edu.isi.karma.util.DBType;
import edu.isi.karma.util.JDBCUtilFactory;
import edu.isi.karma.webserver.KarmaException;
public class SQLImport extends Import {
private DBType dbType;
private String hostname;
private int portnumber;
private String username;
private String password;
private String dBorSIDName;
private String query;
private Workspace workspace;
private String encoding;
//private static Logger logger = LoggerFactory.getLogger(DatabaseTableImport.class);
public SQLImport(DBType dbType, String hostname, int portnumber,
String username, String password, String dBorSIDName,
String query, Workspace workspace, String encoding) {
super(query, workspace, encoding);
this.dbType = dbType;
this.hostname = hostname;
this.portnumber = portnumber;
this.username = username;
this.password = password;
this.dBorSIDName = dBorSIDName;
this.query = query;
this.workspace = workspace;
this.encoding = encoding;
}
public SQLImport duplicate() {
return new SQLImport(dbType, hostname, portnumber, username, password, dBorSIDName, query, workspace, encoding);
}
@Override
public Worksheet generateWorksheet() throws KarmaException {
/**
* Get the data from the database table *
*/
AbstractJDBCUtil dbUtil = JDBCUtilFactory.getInstance(dbType);
// TODO Limiting the number of rows to 1000 for now to avoid all data in memory
ArrayList<ArrayList<String>> data;
try {
data = dbUtil.getSQLQueryDataForLimitedRows(dbType, hostname,
portnumber, username, password, query, dBorSIDName, 1000);
return generateWorksheet(dbUtil, data);
} catch (SQLException | ClassNotFoundException e) {
//If data could not be imported, delete the empty worksheet
Worksheet ws = getWorksheet();
if(ws != null)
workspace.removeWorksheet(ws.getId());
throw new KarmaException("Unable to get data for the SQL Query: " + e.getMessage());
}
}
public Worksheet generateWorksheetForAllRows() throws SQLException, ClassNotFoundException {
/**
* Get the data from the database table *
*/
AbstractJDBCUtil dbUtil = JDBCUtilFactory.getInstance(dbType);
ArrayList<ArrayList<String>> data = dbUtil.getDataForQuery(dbType, hostname,
portnumber, username, password, query, dBorSIDName);
return generateWorksheet(dbUtil, data);
}
private Worksheet generateWorksheet(AbstractJDBCUtil dbUtil, ArrayList<ArrayList<String>> data)
{
/**
* Add the headers *
*/
HTable headers = getWorksheet().getHeaders();
List<String> headersList = new ArrayList<>();
for (int i = 0; i < data.get(0).size(); i++)
{
HNode hNode;
hNode = headers.addHNode(data.get(0).get(i), HNodeType.Regular, getWorksheet(), getFactory());
headersList.add(hNode.getId());
}
/**
* Add the data *
*/
Table dataTable = getWorksheet().getDataTable();
for (int i = 1; i < data.size(); i++)
{
Row row = dataTable.addRow(getFactory());
ArrayList<String> rowData = data.get(i);
for (int j = 0; j < rowData.size(); j++)
{
row.setValue(headersList.get(j), rowData.get(j), getFactory());
}
}
/**
* Save the db info in the source information part of worksheet's
* metadata *
*/
SourceInformation srcInfo = new SourceInformation();
srcInfo.setAttributeValue(InfoAttribute.dbType, dbType.name());
srcInfo.setAttributeValue(InfoAttribute.hostname, hostname);
srcInfo.setAttributeValue(InfoAttribute.portnumber, String.valueOf(portnumber));
srcInfo.setAttributeValue(InfoAttribute.username, username);
srcInfo.setAttributeValue(InfoAttribute.dBorSIDName, dBorSIDName);
srcInfo.setAttributeValue(InfoAttribute.query, query);
getWorksheet().getMetadataContainer().setSourceInformation(srcInfo);
getWorksheet().getMetadataContainer().getWorksheetProperties().setPropertyValue(Property.sourceType, SourceTypes.DB.toString());
return getWorksheet();
}
}