package com.rapidminer.operator.io.test;
import static junit.framework.Assert.assertEquals;
import java.sql.SQLException;
import java.util.Iterator;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import com.rapidminer.example.Attribute;
import com.rapidminer.example.Example;
import com.rapidminer.example.ExampleSet;
import com.rapidminer.example.table.AttributeFactory;
import com.rapidminer.example.table.DoubleArrayDataRow;
import com.rapidminer.example.table.MemoryExampleTable;
import com.rapidminer.operator.OperatorCreationException;
import com.rapidminer.operator.OperatorException;
import com.rapidminer.operator.io.DatabaseDataReader;
import com.rapidminer.operator.io.DatabaseExampleSetWriter;
import com.rapidminer.repository.Entry;
import com.rapidminer.repository.IOObjectEntry;
import com.rapidminer.repository.RepositoryException;
import com.rapidminer.repository.RepositoryLocation;
import com.rapidminer.test.TestContext;
import com.rapidminer.test.utils.RapidAssert;
import com.rapidminer.tools.Ontology;
import com.rapidminer.tools.OperatorService;
import com.rapidminer.tools.jdbc.DatabaseHandler;
/**
*
* @author Simon Fischer
*
*/
public class DatabaseWriteTest {
private static final String TABLE_NAME = "unit_test_table";
private static final String TEST_DATA_LOCATION = "//Samples/data/Labor-Negotiations";
private static final String TEST_REPOS_DATE_LOCATION = "//Samples/data/";
/** The labor negotiations data set. */
private ExampleSet laborNegotiationsExampleSet;
/** Data set containing with infinite values. */
@SuppressWarnings("unused")
private ExampleSet infinityExampleSet;
private static class DatabaseRef {
private final String url, user, password;
private String driverClass;
private DatabaseRef(String url, String user, String password, String driverClass) {
super();
this.url = url;
this.user = user;
this.password = password;
this.setDriverClass(driverClass);
}
public String getUrl() {
return url;
}
public String getPassword() {
return password;
}
public String getUser() {
return user;
}
public void setDriverClass(String driverClass) {
this.driverClass = driverClass;
}
/** May be null for bundled drivers. */
public String getDriverClass() {
return driverClass;
}
}
private static final String TEST_DB_SERVER = "192.168.1.10";
private static final DatabaseRef DB_SQL_SERVER = new DatabaseRef("jdbc:jtds:sqlserver://"+TEST_DB_SERVER+":1433/junit", "junit", "junit", null);// "net.sourceforge.jtds.jdbc.Driver");
private static final DatabaseRef DB_MY_SQL = new DatabaseRef("jdbc:mysql://"+TEST_DB_SERVER+":3306/junit", "junit", "junit", null); // "com.mysql.jdbc.Driver");
private static final DatabaseRef DB_ORACLE = new DatabaseRef("jdbc:oracle:thin:@"+TEST_DB_SERVER+":1521: ", "junit", "junit", "oracle.jdbc.driver.OracleDriver");
private static final DatabaseRef DB_INGRES = new DatabaseRef("jdbc:ingres://192.168.1.7:28047/demodb", "ingres", "vw2010", null);
@Before
public void setUp() throws Exception {
TestContext.get().initRapidMiner(); // for read database operator
final Entry entry = new RepositoryLocation(TEST_DATA_LOCATION).locateEntry();
this.laborNegotiationsExampleSet = (ExampleSet) ((IOObjectEntry)entry).retrieveData(null);
Attribute pos = AttributeFactory.createAttribute("pos", Ontology.NUMERICAL);
Attribute neg = AttributeFactory.createAttribute("neg", Ontology.NUMERICAL);
Attribute nan = AttributeFactory.createAttribute("nan", Ontology.NUMERICAL);
Attribute one = AttributeFactory.createAttribute("one", Ontology.NUMERICAL);
MemoryExampleTable table = new MemoryExampleTable(pos, neg, nan, one);
table.addDataRow(new DoubleArrayDataRow(new double[] {Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN, 1d}));
infinityExampleSet = table.createExampleSet();
}
@Test//@Ignore
public void testCreateTableMicrosoftSQLServer() throws SQLException, OperatorException, ClassNotFoundException, OperatorCreationException {
testCreateTable(DB_SQL_SERVER);
}
@Test
public void testCreateTableMySQL() throws SQLException, OperatorException, ClassNotFoundException, OperatorCreationException {
testCreateTable(DB_MY_SQL);
}
@Test
public void testCreateTableOracle() throws SQLException, OperatorException, ClassNotFoundException, OperatorCreationException {
testCreateTable(DB_ORACLE);
}
@Test@Ignore
public void testCreateTableIngres() throws SQLException, OperatorException, ClassNotFoundException, OperatorCreationException {
testCreateTable(DB_INGRES);
}
@Test
public void testWriteOperator() throws OperatorCreationException, OperatorException {
DatabaseExampleSetWriter writer = OperatorService.createOperator(DatabaseExampleSetWriter.class);
writer.setParameter(DatabaseHandler.PARAMETER_DATABASE_SYSTEM, "MySQL");
writer.setParameter(DatabaseHandler.PARAMETER_DEFINE_CONNECTION, DatabaseHandler.CONNECTION_MODES[DatabaseHandler.CONNECTION_MODE_URL]);
writer.setParameter(DatabaseHandler.PARAMETER_DATABASE_URL, DB_MY_SQL.getUrl());
writer.setParameter(DatabaseHandler.PARAMETER_USERNAME, DB_MY_SQL.getUser());
writer.setParameter(DatabaseHandler.PARAMETER_PASSWORD, DB_MY_SQL.getPassword());
writer.setParameter(DatabaseExampleSetWriter.PARAMETER_OVERWRITE_MODE, DatabaseHandler.OVERWRITE_MODES[DatabaseHandler.OVERWRITE_MODE_OVERWRITE]);
writer.setParameter(DatabaseHandler.PARAMETER_TABLE_NAME, "LaborNegotiationOp");
writer.write(laborNegotiationsExampleSet);
}
@Test
public void testWriteOperatorGetGeneratedKeys() throws OperatorCreationException, OperatorException {
String testTableName = "test_get_gen_keys_back";
// Delete existing entries
DatabaseHandler handler;
try {
handler = DatabaseHandler.getConnectedDatabaseHandler(DB_MY_SQL.getUrl(), DB_MY_SQL.getUser(), DB_MY_SQL.getPassword());
handler.emptyTable(testTableName);
} catch (SQLException e1) {
throw new OperatorException("can not delete table", e1);
}
// Use Iris with out the id attribute
Entry entry =null;
ExampleSet eSet =null;
try {
entry = new RepositoryLocation(TEST_REPOS_DATE_LOCATION+"Iris").locateEntry();
eSet = (ExampleSet) ((IOObjectEntry)entry).retrieveData(null);
} catch (RepositoryException e) {
throw new OperatorException("can not access repository", e);
}
Attribute idAttribute = eSet.getAttributes().get("id");
// remove id attribute
eSet.getAttributes().remove(idAttribute);
DatabaseExampleSetWriter writer = OperatorService.createOperator(DatabaseExampleSetWriter.class);
writer.setParameter(DatabaseHandler.PARAMETER_DATABASE_SYSTEM, "MySQL");
writer.setParameter(DatabaseHandler.PARAMETER_DEFINE_CONNECTION, DatabaseHandler.CONNECTION_MODES[DatabaseHandler.CONNECTION_MODE_URL]);
writer.setParameter(DatabaseHandler.PARAMETER_DATABASE_URL, DB_MY_SQL.getUrl());
writer.setParameter(DatabaseHandler.PARAMETER_USERNAME, DB_MY_SQL.getUser());
writer.setParameter(DatabaseHandler.PARAMETER_PASSWORD, DB_MY_SQL.getPassword());
writer.setParameter(DatabaseHandler.PARAMETER_TABLE_NAME, testTableName);
writer.setParameter(DatabaseExampleSetWriter.PARAMETER_OVERWRITE_MODE, DatabaseHandler.OVERWRITE_MODES[DatabaseHandler.OVERWRITE_MODE_APPEND]);
writer.setParameter(DatabaseExampleSetWriter.PARAMETER_GET_GENERATED_PRIMARY_KEYS, Boolean.TRUE.toString());
writer.setParameter(DatabaseExampleSetWriter.PARAMETER_GENERATED_KEYS_ATTRIBUTE_NAME, "id");
ExampleSet result = writer.write(eSet);
DatabaseDataReader reader = OperatorService.createOperator(DatabaseDataReader.class);
reader.setParameter(DatabaseHandler.PARAMETER_DATABASE_SYSTEM, "MySQL");
reader.setParameter(DatabaseHandler.PARAMETER_DEFINE_CONNECTION, DatabaseHandler.CONNECTION_MODES[DatabaseHandler.CONNECTION_MODE_URL]);
reader.setParameter(DatabaseHandler.PARAMETER_DATABASE_URL, DB_MY_SQL.getUrl());
reader.setParameter(DatabaseHandler.PARAMETER_USERNAME, DB_MY_SQL.getUser());
reader.setParameter(DatabaseHandler.PARAMETER_PASSWORD, DB_MY_SQL.getPassword());
reader.setParameter(DatabaseHandler.PARAMETER_TABLE_NAME, testTableName);
reader.setParameter(DatabaseHandler.PARAMETER_DEFINE_QUERY, DatabaseHandler.QUERY_MODES[DatabaseHandler.QUERY_TABLE]);
ExampleSet dbSet = reader.read();
assertEquals(result.size(), dbSet.size());
Attribute resultAtt = result.getAttributes().get("id");
Attribute dbAtt = dbSet.getAttributes().get("id");
// compare results
Iterator<Example> resultIt = result.iterator();
Iterator<Example> dbSetIt = dbSet.iterator();
while (resultIt.hasNext()){
Example resultEx = resultIt.next();
Example dbEx = dbSetIt.next();
assertEquals(resultEx.getValue(resultAtt), dbEx.getValue(dbAtt));
}
}
@Test
public void testReadOperator() throws OperatorCreationException, OperatorException {
DatabaseDataReader reader = OperatorService.createOperator(DatabaseDataReader.class);
reader.setParameter(DatabaseHandler.PARAMETER_DATABASE_SYSTEM, "MySQL");
reader.setParameter(DatabaseHandler.PARAMETER_DEFINE_CONNECTION, DatabaseHandler.CONNECTION_MODES[DatabaseHandler.CONNECTION_MODE_URL]);
reader.setParameter(DatabaseHandler.PARAMETER_DATABASE_URL, DB_MY_SQL.getUrl());
reader.setParameter(DatabaseHandler.PARAMETER_USERNAME, DB_MY_SQL.getUser());
reader.setParameter(DatabaseHandler.PARAMETER_PASSWORD, DB_MY_SQL.getPassword());
reader.setParameter(DatabaseHandler.PARAMETER_DEFINE_QUERY, DatabaseHandler.QUERY_MODES[DatabaseHandler.QUERY_TABLE]);
reader.setParameter(DatabaseHandler.PARAMETER_TABLE_NAME, "LaborNegotiationOp");
ExampleSet exampleSet = reader.read();
assertEquals(40, exampleSet.size());
assertEquals(17, exampleSet.getAttributes().size());
RapidAssert.assertEquals("labor negotiations", exampleSet, laborNegotiationsExampleSet, -1);
}
private void testCreateTable(DatabaseRef connection) throws SQLException, OperatorException, ClassNotFoundException, OperatorCreationException {
testCreateTable(connection, laborNegotiationsExampleSet, "labor");
//testCreateTable(connection, infinityExampleSet, "infinity");
}
private void testCreateTable(DatabaseRef connection, ExampleSet testSet, String testSetName) throws SQLException, OperatorException, ClassNotFoundException, OperatorCreationException {
final String driverClass = connection.getDriverClass();
if (driverClass != null) {
Class.forName(driverClass);
}
DatabaseHandler handler = DatabaseHandler.getConnectedDatabaseHandler(connection.getUrl(), connection.getUser(), connection.getPassword());
String tableName = TABLE_NAME+"_"+testSetName;
try {
handler.dropTable(tableName);
} catch (SQLException e) {}
//statement.executeUpdate(statementCreator.makeDropStatement(tableName));
handler.createTable(testSet, tableName, DatabaseHandler.OVERWRITE_MODE_OVERWRITE, true, -1);
DatabaseDataReader readOp = OperatorService.createOperator(DatabaseDataReader.class);
readOp.setParameter(DatabaseHandler.PARAMETER_DEFINE_CONNECTION, DatabaseHandler.CONNECTION_MODES[DatabaseHandler.CONNECTION_MODE_URL]);
readOp.setParameter(DatabaseHandler.PARAMETER_DATABASE_URL, connection.getUrl());
readOp.setParameter(DatabaseHandler.PARAMETER_USERNAME, connection.getUser());
readOp.setParameter(DatabaseHandler.PARAMETER_PASSWORD, connection.getPassword());
readOp.setParameter(DatabaseHandler.PARAMETER_DEFINE_QUERY, DatabaseHandler.QUERY_MODES[DatabaseHandler.QUERY_TABLE]);
readOp.setParameter(DatabaseHandler.PARAMETER_TABLE_NAME, tableName);
ExampleSet result = readOp.read();
RapidAssert.assertEquals(testSetName, testSet, result, -1);
}
}