package arida.ufc.br.moap.db.postgres.imp;
import arida.ufc.br.moap.core.spi.Type;
import arida.ufc.br.moap.datamodelapi.instances.imp.Instance;
import arida.ufc.br.moap.datamodelapi.instances.imp.InstancesBasedModelImpl;
import arida.ufc.br.moap.importer.spi.ITranslater;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import org.openide.util.Exceptions;
/**
*
* GeneralTranslater Translate a query for a specific model
* InstancesBasedModelImpl is the model we use. This is a general model to work
* with a Database.
*
* @author franzejr
* @author igobrilhante
*/
public class GeneralTranslater implements ITranslater<InstancesBasedModelImpl> {
Connection connection;
ResultSet resultSet;
public GeneralTranslater(Connection connection) {
this.connection = connection;
}
@Override
public void translate(String query, InstancesBasedModelImpl model) {
try {
Statement statement = connection.createStatement();
resultSet = statement.executeQuery(query);
ResultSetMetaData rsmd = resultSet.getMetaData();
int databaseType[] = new int[rsmd.getColumnCount()];
String columnName[] = new String[rsmd.getColumnCount()];
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
databaseType[i - 1] = rsmd.getColumnType(i);
columnName[i - 1] = rsmd.getColumnName(i);
// TODO Verify the default value...
Type type = getType(databaseType[i - 1]);
model.addAttribute(columnName[i - 1], type);
}
while (resultSet.next()) {
Instance instance = new Instance(model);
int columns = rsmd.getColumnCount();
for (int i = 1; i <= columns; i++) {
instance.setValue(i - 1,
getValue(databaseType[i - 1], i, resultSet));
}
model.addInstance(instance);
}
} catch (SQLException ex) {
Exceptions.printStackTrace(ex);
}
}
/*
* Returns the name associated with a SQL type.
*
* @param type the SQL type
*
* @return the name of the type
*/
public static Object getValue(int type, int idx, ResultSet rs)
throws SQLException {
switch (type) {
case Types.BIGINT:
return rs.getLong(idx);
// case Types.BINARY:
// return (Double) object;
// case Types.BIT:
// return "BIT";
// case Types.CHAR:
// return "CHAR";
// case Types.DATE:
// return (Date) object;
case Types.DECIMAL:
return rs.getDouble(idx);
case Types.DOUBLE:
return rs.getDouble(idx);
case Types.FLOAT:
return rs.getFloat(idx);
case Types.INTEGER:
return rs.getInt(idx);
// case Types.LONGVARBINARY:
// return "LONGVARBINARY";
// case Types.LONGVARCHAR:
// return "LONGVARCHAR";
// case Types.NULL:
// return null;
case Types.NUMERIC:
return rs.getDouble(idx);
// case Types.OTHER:
// return "OTHER";
// case Types.REAL:
// return "REAL";
// case Types.SMALLINT:
// return "SMALLINT";
// case Types.TIME:
// return "TIME";
// case Types.TIMESTAMP:
// return "TIMESTAMP";
// case Types.TINYINT:
// return "TINYINT";
// case Types.VARBINARY:
// return "VARBINARY";
case Types.VARCHAR:
return rs.getString(idx);
default:
return rs.getString(idx);
}
}
public static Object getValue(int dbType, String idx, ResultSet rs)
throws SQLException {
switch (dbType) {
case Types.BIGINT:
return rs.getLong(idx);
// case Types.BINARY:
// return (Double) object;
// case Types.BIT:
// return "BIT";
// case Types.CHAR:
// return "CHAR";
// case Types.DATE:
// return (Date) object;
case Types.DECIMAL:
return rs.getDouble(idx);
case Types.DOUBLE:
return rs.getDouble(idx);
case Types.FLOAT:
return rs.getFloat(idx);
case Types.INTEGER:
return rs.getInt(idx);
// case Types.LONGVARBINARY:
// return "LONGVARBINARY";
// case Types.LONGVARCHAR:
// return "LONGVARCHAR";
// case Types.NULL:
// return null;
case Types.NUMERIC:
return rs.getDouble(idx);
// case Types.OTHER:
// return "OTHER";
// case Types.REAL:
// return "REAL";
// case Types.SMALLINT:
// return "SMALLINT";
// case Types.TIME:
// return "TIME";
// case Types.TIMESTAMP:
// return "TIMESTAMP";
// case Types.TINYINT:
// return "TINYINT";
// case Types.VARBINARY:
// return "VARBINARY";
case Types.VARCHAR:
return rs.getString(idx);
default:
return rs.getString(idx);
}
}
public static Type getType(int type) {
switch (type) {
case Types.BIGINT:
return Type.LONG;
// case Types.BINARY:
// return (Double) object;
// case Types.BIT:
// return "BIT";
// case Types.CHAR:
// return "CHAR";
// case Types.DATE:
// return (Date) object;
case Types.DECIMAL:
return Type.BIGDECIMAL;
case Types.DOUBLE:
return Type.DOUBLE;
case Types.FLOAT:
return Type.FLOAT;
case Types.INTEGER:
return Type.INT;
// case Types.LONGVARBINARY:
// return "LONGVARBINARY";
// case Types.LONGVARCHAR:
// return "LONGVARCHAR";
// case Types.NULL:
// return null;
case Types.NUMERIC:
return Type.DOUBLE;
// case Types.OTHER:
// return "OTHER";
// case Types.REAL:
// return "REAL";
// case Types.SMALLINT:
// return "SMALLINT";
// case Types.TIME:
// return "TIME";
// case Types.TIMESTAMP:
// return "TIMESTAMP";
// case Types.TINYINT:
// return "TINYINT";
// case Types.VARBINARY:
// return "VARBINARY";
case Types.VARCHAR:
return Type.STRING;
default:
return Type.STRING;
}
}
}