"Cannot mix getting Instances in both incremental and batch modes");
}
setRetrieval(BATCH);
connectToDatabase();
Instances result = null;
try {
if (m_DataBaseConnection.execute(m_query) == false) {
throw new Exception("Query didn't produce results");
}
ResultSet rs = m_DataBaseConnection.getResultSet();
ResultSetMetaData md = rs.getMetaData();
// Determine structure of the instances
int numAttributes = md.getColumnCount();
int[] attributeTypes = new int[numAttributes];
m_nominalIndexes = new Hashtable[numAttributes];
m_nominalStrings = new FastVector[numAttributes];
for (int i = 1; i <= numAttributes; i++) {
switch (m_DataBaseConnection.translateDBColumnType(
md.getColumnTypeName(i))) {
case DatabaseUtils.STRING:
ResultSet rs1;
String columnName = md.getColumnName(i);
if (m_DataBaseConnection.getUpperCase()) {
columnName = columnName.toUpperCase();
}
String end = endOfQuery(false);
m_nominalIndexes[i - 1] = new Hashtable();
m_nominalStrings[i - 1] = new FastVector();
if (m_DataBaseConnection.execute(
"SELECT DISTINCT ( " + columnName + " ) FROM " + end)
== false) {
throw new Exception("Nominal values cannot be retrieved");
}
rs1 = m_DataBaseConnection.getResultSet();
attributeTypes[i - 1] = Attribute.NOMINAL;
stringToNominal(rs1, i);
rs1.close();
break;
case DatabaseUtils.TEXT:
columnName = md.getColumnName(i);
if (m_DataBaseConnection.getUpperCase()) {
columnName = columnName.toUpperCase();
}
end = endOfQuery(false);
m_nominalIndexes[i - 1] = new Hashtable();
m_nominalStrings[i - 1] = new FastVector();
if (m_DataBaseConnection.execute(
"SELECT DISTINCT ( " + columnName + " ) FROM " + end)
== false) {
throw new Exception("Nominal values cannot be retrieved");
}
rs1 = m_DataBaseConnection.getResultSet();
attributeTypes[i - 1] = Attribute.STRING;
stringToNominal(rs1, i);
rs1.close();
break;
case DatabaseUtils.BOOL:
// System.err.println("boolean --> nominal");
attributeTypes[i - 1] = Attribute.NOMINAL;
m_nominalIndexes[i - 1] = new Hashtable();
m_nominalIndexes[i - 1].put("false", new Double(0));
m_nominalIndexes[i - 1].put("true", new Double(1));
m_nominalStrings[i - 1] = new FastVector();
m_nominalStrings[i - 1].addElement("false");
m_nominalStrings[i - 1].addElement("true");
break;
case DatabaseUtils.DOUBLE:
// System.err.println("BigDecimal --> numeric");
attributeTypes[i - 1] = Attribute.NUMERIC;
break;
case DatabaseUtils.BYTE:
// System.err.println("byte --> numeric");
attributeTypes[i - 1] = Attribute.NUMERIC;
break;
case DatabaseUtils.SHORT:
// System.err.println("short --> numeric");
attributeTypes[i - 1] = Attribute.NUMERIC;
break;
case DatabaseUtils.INTEGER:
// System.err.println("int --> numeric");
attributeTypes[i - 1] = Attribute.NUMERIC;
break;
case DatabaseUtils.LONG:
// System.err.println("long --> numeric");
attributeTypes[i - 1] = Attribute.NUMERIC;
break;
case DatabaseUtils.FLOAT:
// System.err.println("float --> numeric");
attributeTypes[i - 1] = Attribute.NUMERIC;
break;
case DatabaseUtils.DATE:
attributeTypes[i - 1] = Attribute.DATE;
break;
default:
// System.err.println("Unknown column type");
attributeTypes[i - 1] = Attribute.STRING;
}
}
// Step through the tuples
// System.err.println("Creating instances...");
FastVector instances = new FastVector();
while (rs.next()) {
double[] vals = new double[numAttributes];
for (int i = 1; i <= numAttributes; i++) {
switch (m_DataBaseConnection.translateDBColumnType(
md.getColumnTypeName(i))) {
case DatabaseUtils.STRING:
String str = rs.getString(i);
if (rs.wasNull()) {
vals[i - 1] = Instance.missingValue();
} else {
Double index = (Double) m_nominalIndexes[i - 1].get(
str);
if (index == null) {
index = new Double(
m_structure.attribute(i - 1).addStringValue(
str));
}
vals[i - 1] = index.doubleValue();
}
break;
case DatabaseUtils.TEXT:
str = rs.getString(i);
if (rs.wasNull()) {
vals[i - 1] = Instance.missingValue();
} else {
Double index = (Double) m_nominalIndexes[i - 1].get(
str);
if (index == null) {
index = new Double(
m_structure.attribute(i - 1).addStringValue(
str));
}
vals[i - 1] = index.doubleValue();
}
break;
case DatabaseUtils.BOOL:
boolean boo = rs.getBoolean(i);
if (rs.wasNull()) {
vals[i - 1] = Instance.missingValue();
} else {
vals[i - 1] = (boo ? 1.0 : 0.0);
}
break;
case DatabaseUtils.DOUBLE:
double dd = rs.getDouble(i);
if (rs.wasNull()) {
vals[i - 1] = Instance.missingValue();
} else {
vals[i - 1] = dd;
}
break;
case DatabaseUtils.BYTE:
byte by = rs.getByte(i);
if (rs.wasNull()) {
vals[i - 1] = Instance.missingValue();
} else {
vals[i - 1] = by;
}
break;
case DatabaseUtils.SHORT:
short sh = rs.getByte(i);
if (rs.wasNull()) {
vals[i - 1] = Instance.missingValue();
} else {
vals[i - 1] = sh;
}
break;
case DatabaseUtils.INTEGER:
int in = rs.getInt(i);
if (rs.wasNull()) {
vals[i - 1] = Instance.missingValue();
} else {
vals[i - 1] = in;
}
break;
case DatabaseUtils.LONG:
long lo = rs.getLong(i);
if (rs.wasNull()) {
vals[i - 1] = Instance.missingValue();
} else {
vals[i - 1] = lo;
}
break;
case DatabaseUtils.FLOAT:
float fl = rs.getFloat(i);
if (rs.wasNull()) {
vals[i - 1] = Instance.missingValue();
} else {
vals[i - 1] = fl;
}
break;
case DatabaseUtils.DATE:
Date date = rs.getDate(i);
if (rs.wasNull()) {
vals[i - 1] = Instance.missingValue();
} else {
// TODO: Do a value check here.
vals[i - 1] = date.getTime();
}
break;
default:
vals[i - 1] = Instance.missingValue();
}
}
Instance newInst;
newInst = new Instance(1.0, vals);
instances.addElement(newInst);
}
// Create the header and add the instances to the dataset
// System.err.println("Creating header...");
FastVector attribInfo = new FastVector();
for (int i = 0; i < numAttributes; i++) {
/* Fix for databases that uppercase column names */
// String attribName = attributeCaseFix(md.getColumnName(i + 1));
String attribName = md.getColumnName(i + 1);
switch (attributeTypes[i]) {
case Attribute.NOMINAL:
attribInfo.addElement(
new Attribute(attribName, m_nominalStrings[i]));
break;
case Attribute.NUMERIC:
attribInfo.addElement(new Attribute(attribName));
break;
case Attribute.STRING:
Attribute att = new Attribute(attribName, (FastVector) null);
attribInfo.addElement(att);
for (int n = 0; n < m_nominalStrings[i].size(); n++) {
att.addStringValue(
(String) m_nominalStrings[i].elementAt(n));
}
break;
case Attribute.DATE:
attribInfo.addElement(
new Attribute(attribName, (String) null));
break;
default:
throw new IOException("Unknown attribute type");
}
}
result = new Instances(endOfQuery(true), attribInfo,
instances.size());
for (int i = 0; i < instances.size(); i++) {
result.add((Instance) instances.elementAt(i));
}
rs.close();
m_DataBaseConnection.disconnectFromDatabase();
// get rid of m_idColumn
if (m_DataBaseConnection.getUpperCase()) {
m_idColumn = m_idColumn.toUpperCase();
}
if (result.attribute(0).name().equals(m_idColumn)) {
result.deleteAttributeAt(0);
}
m_structure = new Instances(result, 0);
} catch (Exception ex) {
printException(ex);
StringBuffer text = new StringBuffer();
if (m_query.equals("Select * from Results0")) {