📄 databaseloader.java
字号:
//System.err.println("byte --> numeric"); attributeTypes[i - 1] = Attribute.NUMERIC; break; case DatabaseConnection.SHORT: //System.err.println("short --> numeric"); attributeTypes[i - 1] = Attribute.NUMERIC; break; case DatabaseConnection.INTEGER: //System.err.println("int --> numeric"); attributeTypes[i - 1] = Attribute.NUMERIC; break; case DatabaseConnection.LONG: //System.err.println("long --> numeric"); attributeTypes[i - 1] = Attribute.NUMERIC; break; case DatabaseConnection.FLOAT: //System.err.println("float --> numeric"); attributeTypes[i - 1] = Attribute.NUMERIC; break; case DatabaseConnection.DATE: attributeTypes[i - 1] = Attribute.DATE; break; default: //System.err.println("Unknown column type"); attributeTypes[i - 1] = Attribute.STRING; } } 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); for (int n = 0; n < m_nominalStrings[i].size(); n++) { att.addStringValue((String) m_nominalStrings[i].elementAt(n)); } attribInfo.addElement(att); break; case Attribute.DATE: attribInfo.addElement(new Attribute(attribName, (String)null)); break; default: throw new IOException("Unknown attribute type"); } } m_structure = new Instances(endOfQuery(true), attribInfo,0); //get rid of m_idColumn if(m_DataBaseConnection.getUpperCase()) m_idColumn = m_idColumn.toUpperCase(); //System.out.println(m_structure.attribute(0).name().equals(idColumn)); if(m_structure.attribute(0).name().equals(m_idColumn)){ m_oldStructure = new Instances(m_structure,0); m_oldStructure.deleteAttributeAt(0); //System.out.println(m_structure); } else m_oldStructure = new Instances(m_structure,0); } else{ if(m_oldStructure == null) m_oldStructure = new Instances(m_structure,0); } m_DataBaseConnection.disconnectFromDatabase(); } catch(Exception ex) { ex.printStackTrace(); printException(ex); } return m_oldStructure; } /** * Return the full data set in batch mode (header and all intances at once). * * @return the structure of the data set as an empty set of Instances * @throws IOException if there is no source or parsing fails */ public Instances getDataSet() throws IOException { if (m_DataBaseConnection == null) { throw new IOException("No source database has been specified"); } if (getRetrieval() == INCREMENTAL) { throw new IOException("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 DatabaseConnection.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 DatabaseConnection.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 DatabaseConnection.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 DatabaseConnection.DOUBLE: //System.err.println("BigDecimal --> numeric"); attributeTypes[i - 1] = Attribute.NUMERIC; break; case DatabaseConnection.BYTE: //System.err.println("byte --> numeric"); attributeTypes[i - 1] = Attribute.NUMERIC; break; case DatabaseConnection.SHORT: //System.err.println("short --> numeric"); attributeTypes[i - 1] = Attribute.NUMERIC; break; case DatabaseConnection.INTEGER: //System.err.println("int --> numeric"); attributeTypes[i - 1] = Attribute.NUMERIC; break; case DatabaseConnection.LONG: //System.err.println("long --> numeric"); attributeTypes[i - 1] = Attribute.NUMERIC; break; case DatabaseConnection.FLOAT: //System.err.println("float --> numeric"); attributeTypes[i - 1] = Attribute.NUMERIC; break; case DatabaseConnection.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 DatabaseConnection.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 DatabaseConnection.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 DatabaseConnection.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 DatabaseConnection.DOUBLE: double dd = rs.getDouble(i); if (rs.wasNull()) { vals[i - 1] = Instance.missingValue(); } else { vals[i - 1] = dd; } break; case DatabaseConnection.BYTE: byte by = rs.getByte(i); if (rs.wasNull()) { vals[i - 1] = Instance.missingValue(); } else { vals[i - 1] = (double)by; } break; case DatabaseConnection.SHORT: short sh = rs.getByte(i); if (rs.wasNull()) { vals[i - 1] = Instance.missingValue(); } else { vals[i - 1] = (double)sh; } break; case DatabaseConnection.INTEGER: int in = rs.getInt(i); if (rs.wasNull()) { vals[i - 1] = Instance.missingValue(); } else { vals[i - 1] = (double)in; } break; case DatabaseConnection.LONG: long lo = rs.getLong(i); if (rs.wasNull()) { vals[i - 1] = Instance.missingValue(); } else { vals[i - 1] = (double)lo; } break; case DatabaseConnection.FLOAT: float fl = rs.getFloat(i); if (rs.wasNull()) { vals[i - 1] = Instance.missingValue(); } else { vals[i - 1] = (double)fl; } break; case DatabaseConnection.DATE: Date date = rs.getDate(i); if (rs.wasNull()) { vals[i - 1] = Instance.missingValue(); } else { // TODO: Do a value check here. vals[i - 1] = (double)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")){ text.append("\n\nDatabaseLoader options:\n"); Enumeration enumi = listOptions(); while (enumi.hasMoreElements()) { Option option = (Option)enumi.nextElement(); text.append(option.synopsis()+'\n'); text.append(option.description()+'\n'); } System.out.println(text); } } //System.out.println(result); return result; } /** * Reads an instance from a database. * * @param rs the ReusltSet to load * @throws Exception if instance cannot be read * @return an instance read from the database */ private Instance readInstance(ResultSet rs) throws Exception{ ResultSetMetaData md = rs.getMetaData(); int numAttributes = md.getColumnCount(); double[] vals = new double[numAttributes]; m_structure.delete(); for(int i = 1; i <= numAttributes; i++) { switch (m_DataBaseConnection.translateDBColumnType(md.getColumnTypeName(i))) { case DatabaseConnection.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 DatabaseConnection.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)); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -