/*
* Apache License
* Version 2.0, January 2004
* http://www.apache.org/licenses/
*
* Copyright 2013 Aurelian Tutuianu
* Copyright 2014 Aurelian Tutuianu
* Copyright 2015 Aurelian Tutuianu
* Copyright 2016 Aurelian Tutuianu
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package rapaio.experiment;
import rapaio.data.*;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author <a href="mailto:padreati@yahoo.com">Aurelian Tutuianu</a>
*/
@Deprecated
public class JavaDBUtil {
private Connection conn;
public void connect() throws SQLException, ClassNotFoundException {
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
conn = DriverManager.getConnection("jdbc:derby:memory:m;create=true");
}
public void putFrame(Frame df, String tableName) throws SQLException {
String[] columns = df.varNames();
String[] types = new String[columns.length];
for (int i = 0; i < types.length; i++) {
if (df.var(i).type().isNumeric()) {
types[i] = "DOUBLE";
continue;
}
if (df.var(i).type().isNominal()) {
types[i] = "VARCHAR(8000)";
}
}
StringBuilder sb = new StringBuilder();
sb.append("CREATE TABLE ").append(tableName).append(" (");
for (int i = 0; i < columns.length; i++) {
sb.append(columns[i]).append(" ").append(types[i]);
if (i != columns.length - 1) {
sb.append(", ");
}
}
sb.append(")");
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate(sb.toString());
}
sb = new StringBuilder();
sb.append("INSERT INTO ").append(tableName).append(" (");
for (int i = 0; i < columns.length; i++) {
sb.append(columns[i]);
if (i != columns.length - 1) {
sb.append(",");
}
}
sb.append(") VALUES (");
for (int i = 0; i < columns.length; i++) {
sb.append("?");
if (i != columns.length - 1) {
sb.append(",");
}
}
sb.append(")");
try (PreparedStatement ps = conn.prepareStatement(sb.toString())) {
for (int i = 0; i < df.rowCount(); i++) {
for (int j = 0; j < types.length; j++) {
switch (types[j]) {
case "VARCHAR(8000)":
ps.setString(j + 1, df.label(i, j));
break;
case "DOUBLE":
ps.setDouble(j + 1, df.value(i, j));
break;
}
}
ps.execute();
}
}
}
public Frame getFrame(String query) throws SQLException {
Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery(query);
ResultSetMetaData md = rs.getMetaData();
List<String> colNames = new ArrayList<>();
List<List<Object>> lists = new ArrayList<>();
for (int i = 0; i < md.getColumnCount(); i++) {
colNames.add(md.getColumnLabel(i + 1));
lists.add(new ArrayList<>());
}
while (rs.next()) {
for (int i = 0; i < md.getColumnCount(); i++) {
String sqlTypeName = md.getColumnTypeName(i + 1);
switch (sqlTypeName) {
case "DOUBLE":
case "INTEGER":
lists.get(i).add(rs.getDouble(i + 1));
break;
default:
lists.get(i).add(rs.getString(i + 1));
}
}
}
List<Var> vars = new ArrayList<>();
for (int i = 0; i < md.getColumnCount(); i++) {
String sqlTypeName = md.getColumnTypeName(i + 1);
switch (sqlTypeName) {
case "DOUBLE":
case "INTEGER":
Numeric v1 = Numeric.empty(lists.get(i).size());
for (int j = 0; j < lists.get(i).size(); j++) {
v1.setValue(j, (Double) lists.get(i).get(j));
}
vars.add(v1);
break;
default:
ArrayList<String> dict = new ArrayList<>();
for (int j = 0; j < lists.get(i).size(); j++) {
dict.add((String) lists.get(i).get(j));
}
Nominal v2 = Nominal.empty(lists.get(i).size(), dict);
for (int j = 0; j < lists.get(i).size(); j++) {
v2.setLabel(j, (String) lists.get(i).get(j));
}
vars.add(v2);
}
}
for (int i = 0; i < vars.size(); i++) {
vars.get(i).withName(colNames.get(i));
}
return SolidFrame.byVars(lists.get(0).size(), vars);
}
}