Skip to content

add a function numOfCol() to get col number of a col name #118

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions src/main/java/joinery/DataFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,33 @@ private DataFrame(final Index index, final Index columns, final BlockManager<V>
this.groups = groups;
}

/**
* Get the col number of a col Name
*
* columns is a private member of DataFrame
* provider a interface, so that users can get col number
*
* <pre> {@code
* > DataFrame<Object> df = new DataFrame<>("name", "age", "value");
* > df.append(Arrays.asList("one", 10, 1));
* > df.append(Arrays.asList("two", 20, 2));
* > df.numOfCol("age")
* 1 }</pre>
*
* @param name the column name
* @return the col number of given column name
* */
// CS304 Issue link: https://github.com/cardillo/joinery/issues/74
public int numOfCol(String name) {
String[] colNames = (String[]) this.columns().toArray(new String[0]);
for (int i = 0; i < colNames.length; i++){
if (name.equals(colNames[i])){
return i;
}
}
return -1;
}

/**
* Add new columns to the data frame.
*
Expand Down Expand Up @@ -2263,6 +2290,8 @@ public static final DataFrame<Object> readSql(final Connection c, final String s

/**
* Read data from the provided query results into a new data frame.
* If the query results are types of Integer, Double or Date, the type will
* be preserved in the data frame.
*
* @param rs the query results
* @return a new data frame
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/joinery/impl/Serialization.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -435,6 +436,27 @@ public static DataFrame<Object> readSql(final ResultSet rs)
List<Object> row = new ArrayList<>(columns.size());
while (rs.next()) {
for (String c : columns) {
// For issue #92, preserve the data type and put data into dataframe.
// Object rowElement=null;
// try {
// rowElement=Integer.parseInt(rs.getString(c));
// }catch (NumberFormatException e) {
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// try {
// rowElement = sdf.parse(rs.getString(c));
// } catch (ParseException parseException) {
// SimpleDateFormat sdf_md = new SimpleDateFormat("MM-dd");
// try {
// rowElement = sdf_md.parse(rs.getString(c));
// } catch (ParseException exception) {
// try {
// rowElement = Double.parseDouble(rs.getString(c));
// } catch (NumberFormatException e2) {
// rowElement = rs.getString(c);
// }
// }
// }
// }
row.add(rs.getString(c));
}
df.append(row);
Expand Down
41 changes: 41 additions & 0 deletions src/test/java/joinery/impl/DataFrameOfColTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package joinery.impl;

import joinery.DataFrame;
import org.junit.Test;

import java.util.Arrays;

import static org.junit.Assert.assertEquals;

public class DataFrameOfColTest {
// issue #74, Use numOfCol() to get the col number of a col Name, the type obtained is int.
//CS304 (manually written) https://github.com/cardillo/joinery/issues/74
@Test
public void testColNum(){
DataFrame<Object> df = new DataFrame<>("name", "age", "value");
df.append(Arrays.asList("one", 10, 1.0));
df.append(Arrays.asList("two", 20, 2.3));
df.append(Arrays.asList("three", 30, 3.9));
df.append(Arrays.asList("four", 40, 4.5));
System.out.println(df.columns());
assertEquals(0, df.numOfCol("name"));
assertEquals(1, df.numOfCol("age"));
assertEquals(2, df.numOfCol("value"));
// System.out.println(df.row(1));
}

// issue #74, Use numOfCol() to get the col number of a col Name, the type obtained is int.
//CS304 (manually written) https://github.com/cardillo/joinery/issues/74
@Test
public void test2ColNum(){
DataFrame<Object> df = new DataFrame<>("name", "price", "onSale");
df.append(Arrays.asList("bag1", 30, true));
df.append(Arrays.asList("bag2", 25, false));
df.append(Arrays.asList("bag3", 20, false));
df.append(Arrays.asList("bag4", 15, true));
System.out.println(df.columns());
assertEquals(-1, df.numOfCol("pri"));
assertEquals(-1, df.numOfCol("on_Sale"));
// System.out.println(df.row(1));
}
}
44 changes: 44 additions & 0 deletions src/test/java/joinery/impl/SerializationTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//package joinery.impl;
//
//import joinery.DataFrame;
//import junit.framework.TestCase;
//import org.junit.Test;
//
//import javax.xml.crypto.Data;
//import java.sql.Connection;
//import java.sql.Date;
//import java.sql.DriverManager;
//import java.sql.SQLException;
//
//public class SerializationTest extends TestCase {
//
// // issue #92, Use readsql() to read data from the database, the types obtained are not all strings, can be numbers, dates, etc.
// public void testReadSql() throws SQLException {
// Connection c = DriverManager.getConnection("jdbc:derby:memory:testdb;create=true");
// c.createStatement().executeUpdate("create table data2 (a varchar (20), b double )");
// c.createStatement().executeUpdate("insert into data2 values ('2022-04-24', 20.02)");
// c.createStatement().executeUpdate("insert into data2 values ('2022-04-25', 40.44)");
//// List<Object> other = DataFrame.readSql(c, "select * from data").flatten();
// DataFrame<Object> other = DataFrame.readSql(c, "select * from data2");
// assertTrue(other.get(0, 0) instanceof Date);
// assertTrue(other.get(1, 0) instanceof Date);
// assertTrue(other.get(0, 1) instanceof Double);
// assertTrue(other.get(1, 1) instanceof Double);
// }
//
// // issue #92, Use readsql() to read data from the database, the types obtained are not all strings, can be numbers, dates, etc.
// public void testReadSql2() throws SQLException {
// Connection c = DriverManager.getConnection("jdbc:derby:memory:testdb;create=true");
// c.createStatement().executeUpdate("create table data (a varchar (20), b varchar(10) )");
// c.createStatement().executeUpdate("insert into data values ('04-24', '20')");
// c.createStatement().executeUpdate("insert into data values ('04-25', '40')");
// c.createStatement().executeUpdate("insert into data values ('4-40', '60')");
//// List<Object> other = DataFrame.readSql(c, "select * from data").flatten();
// DataFrame<Object> other = DataFrame.readSql(c, "select * from data");
// assertTrue(other.get(0, 0) instanceof Date);
// assertTrue(other.get(1, 0) instanceof Date);
// assertTrue(other.get(2, 0) instanceof Date);
// assertTrue(other.get(0, 1) instanceof Integer);
// assertTrue(other.get(1, 1) instanceof Integer);
// }
//}