Skip to content

Commit d110771

Browse files
authored
Merge pull request #11 from nRo/develop
Develop
2 parents 634c8a1 + 3b5adc2 commit d110771

File tree

9 files changed

+71
-27
lines changed

9 files changed

+71
-27
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Add this to you pom.xml
2424
<dependency>
2525
<groupId>de.unknownreality</groupId>
2626
<artifactId>dataframe</artifactId>
27-
<version>0.7.5</version>
27+
<version>0.7.5.1</version>
2828
</dependency>
2929
...
3030
</dependencies>
@@ -52,7 +52,7 @@ To build the library from sources:
5252
<dependency>
5353
<groupId>de.unknownreality</groupId>
5454
<artifactId>dataframe</artifactId>
55-
<version>0.7.5-SNAPSHOT</version>
55+
<version>0.7.5.1-SNAPSHOT</version>
5656
</dependency>
5757
...
5858
</dependencies>

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>de.unknownreality</groupId>
88
<artifactId>dataframe</artifactId>
9-
<version>0.7.5-SNAPSHOT</version>
9+
<version>0.7.5.1-SNAPSHOT</version>
1010
<properties>
1111
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1212
<maven.compiler.source>1.8</maven.compiler.source>

src/main/java/de/unknownreality/dataframe/ColumnSelection.java

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
import de.unknownreality.dataframe.filter.FilterPredicate;
44

5-
public class ColumnSelection<T extends DataFrame> {
5+
public class ColumnSelection{
66
private DataFrameColumn[] columns;
7-
private T dataFrame;
7+
private DataFrame dataFrame;
88

9-
public ColumnSelection(T dataFrame, DataFrameColumn... columns){
9+
public ColumnSelection(DataFrame dataFrame, DataFrameColumn... columns){
1010
this.dataFrame = dataFrame;
1111
this.columns = columns;
1212
}
@@ -19,7 +19,7 @@ public ColumnSelection(T dataFrame, DataFrameColumn... columns){
1919
* @param value input value
2020
* @return new dataframe
2121
*/
22-
public T where(String colName, Comparable value){
22+
public DataFrame where(String colName, Comparable value){
2323
DataRows rows = dataFrame.selectRows(colName,value);
2424
return createDataFrame(rows);
2525
}
@@ -31,7 +31,7 @@ public T where(String colName, Comparable value){
3131
* @param predicate input predicate
3232
* @return new dataframe
3333
*/
34-
public T where(FilterPredicate predicate){
34+
public DataFrame where(FilterPredicate predicate){
3535
DataRows rows = dataFrame.selectRows(predicate);
3636
return createDataFrame(rows);
3737
}
@@ -43,7 +43,7 @@ public T where(FilterPredicate predicate){
4343
* @param predicateString input predicate string
4444
* @return new dataframe
4545
*/
46-
public T where(String predicateString){
46+
public DataFrame where(String predicateString){
4747
DataRows rows = dataFrame.selectRows(predicateString);
4848
return createDataFrame(rows);
4949
}
@@ -56,7 +56,7 @@ public T where(String predicateString){
5656
* @param values index values
5757
* @return new dataframe
5858
*/
59-
public T whereIndex(String indexName, Comparable... values){
59+
public DataFrame whereIndex(String indexName, Comparable... values){
6060
DataRows rows = dataFrame.selectRowsByIndex(indexName, values);
6161
return createDataFrame(rows);
6262
}
@@ -66,19 +66,14 @@ public T whereIndex(String indexName, Comparable... values){
6666
*
6767
* @return new dataframe
6868
*/
69-
public T allRows(){
69+
public DataFrame allRows(){
7070
DataRows rows = dataFrame.getRows();
7171
return createDataFrame(rows);
7272
}
7373

7474
@SuppressWarnings("unchecked")
75-
private T createDataFrame(DataRows rows){
76-
T df;
77-
try {
78-
df = (T)dataFrame.getClass().newInstance();
79-
} catch (Exception e) {
80-
throw new DataFrameRuntimeException("error creating dataframe instance",e);
81-
}
75+
private DataFrame createDataFrame(DataRows rows){
76+
DataFrame df = new DefaultDataFrame();
8277
for(DataFrameColumn column : columns){
8378
df.addColumn(column.copyEmpty());
8479
}

src/main/java/de/unknownreality/dataframe/DataFrame.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public interface DataFrame extends DataContainer<DataFrameHeader, DataRow> {
8989
* @param columnNames selected columns
9090
* @return {@link ColumnSelection} for row selection
9191
*/
92-
ColumnSelection<? extends DataFrame> selectColumns(String... columnNames);
92+
ColumnSelection selectColumns(String... columnNames);
9393

9494
/**
9595
* Returns a {@link ColumnSelection} for the selected columns.
@@ -98,7 +98,7 @@ public interface DataFrame extends DataContainer<DataFrameHeader, DataRow> {
9898
* @param columns selected columns
9999
* @return {@link ColumnSelection} for row selection
100100
*/
101-
ColumnSelection<? extends DataFrame> selectColumns(DataFrameColumn... columns);
101+
ColumnSelection selectColumns(DataFrameColumn... columns);
102102

103103
/**
104104
* Adds a column to the data frame.

src/main/java/de/unknownreality/dataframe/DataRow.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ public int size() {
5454
*/
5555
@Override
5656
public boolean isCompatible(Comparable value, String headerName) {
57+
if(value == null || value instanceof Values.NA){
58+
return true;
59+
}
5760
Class<? extends Comparable> type = getHeader().getType(headerName);
5861
if(Number.class.isAssignableFrom(type)){
5962
return Number.class.isAssignableFrom(value.getClass());

src/main/java/de/unknownreality/dataframe/DefaultDataFrame.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public DefaultDataFrame replaceColumn(DataFrameColumn existing, DataFrameColumn
148148

149149
@Override
150150
@SuppressWarnings("unchecked")
151-
public ColumnSelection<DefaultDataFrame> selectColumns(String... columnNames) {
151+
public ColumnSelection selectColumns(String... columnNames) {
152152
DataFrameColumn[] columns = new DataFrameColumn[columnNames.length];
153153
for (int i = 0; i < columnNames.length; i++) {
154154
columns[i] = getColumn(columnNames[i]);
@@ -158,14 +158,19 @@ public ColumnSelection<DefaultDataFrame> selectColumns(String... columnNames) {
158158

159159
@Override
160160
@SuppressWarnings("unchecked")
161-
public ColumnSelection<DefaultDataFrame> selectColumns(DataFrameColumn... columns) {
161+
public ColumnSelection selectColumns(DataFrameColumn... columns) {
162162
return new ColumnSelection(this, columns);
163163
}
164164

165165

166166
@Override
167167
@SuppressWarnings("unchecked")
168168
public DefaultDataFrame addColumn(DataFrameColumn column) {
169+
if(column.size() == 0 && size != 0){
170+
column.appendAll(
171+
Arrays.asList(new Values.NA[size])
172+
);
173+
}
169174
if (columns != null && column.size() != size) {
170175
throw new DataFrameRuntimeException("column lengths must be equal");
171176
}
@@ -1142,7 +1147,7 @@ public void setValue(int col, int row, Comparable newValue) {
11421147
if (col >= columns.length || row > size) {
11431148
throw new DataFrameRuntimeException("index out of bounds");
11441149
}
1145-
if (newValue == Values.NA) {
1150+
if (newValue == null || newValue == Values.NA) {
11461151
columns[col].setNA(row);
11471152
} else {
11481153
columns[col].set(row, newValue);

src/main/java/de/unknownreality/dataframe/column/BasicColumn.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import de.unknownreality.dataframe.DataFrameRuntimeException;
3030
import de.unknownreality.dataframe.MapFunction;
3131
import de.unknownreality.dataframe.Values;
32+
import de.unknownreality.dataframe.common.ValueComparator;
3233

3334
import java.lang.reflect.Array;
3435
import java.util.*;
@@ -82,13 +83,14 @@ protected void doSort(Comparator<T> comparator) {
8283

8384
@Override
8485
protected void doSort() {
85-
Arrays.sort(values, 0, size());
86+
Arrays.sort(values,0,size(), ValueComparator.COMPARATOR);
87+
8688
}
8789

8890

8991
@Override
9092
protected void doSet(int index, T value) {
91-
if (value == Values.NA) {
93+
if (value == null || value == Values.NA) {
9294
doSetNA(index);
9395
return;
9496
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package de.unknownreality.dataframe.common;
2+
3+
import java.util.Comparator;
4+
5+
public class ValueComparator implements Comparator<Comparable> {
6+
7+
public final static ValueComparator COMPARATOR = new ValueComparator(1);
8+
private int naOrder = 1;
9+
10+
public ValueComparator(int naOrder){
11+
this.naOrder = naOrder;
12+
}
13+
14+
@Override
15+
public int compare(Comparable o1, Comparable o2) {
16+
if(o1 == null && o2 == null){
17+
return 0;
18+
}
19+
if(o1 == null) {
20+
return -1*naOrder;
21+
}
22+
if(o2 == null){
23+
return 1*naOrder;
24+
}
25+
return o1.compareTo(o2);
26+
}
27+
}

src/test/java/de/unknownreality/dataframe/frame/DataFrameTest.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,11 @@ public void testCreation() {
9393

9494
}
9595
dataFrame = dataFrame.concat(dataFrame2);
96+
dataFrame.addStringColumn("null_test");
9697
Assert.assertEquals(2, dataFrame.size());
9798
Assert.assertEquals(2d, dataFrame.getRow(1).toDouble("value"), 0d);
99+
Assert.assertEquals("NA", dataFrame.getRow(1).getString("null_test"));
100+
Assert.assertEquals(true, dataFrame.getRow(1).isNA("null_test"));
98101

99102

100103
Assert.assertEquals(valueColumn, dataFrame2.getDoubleColumn("value"));
@@ -176,10 +179,13 @@ public void testReader() throws IOException {
176179

177180
DataRow row = df.getRow(1);
178181
row.set("A", 999);
179-
df.update(row);
180182

181-
Assert.assertEquals(new Integer(999), df.getRow(1).getInteger("A"));
183+
Assert.assertEquals(Integer.valueOf(999), df.getRow(1).getInteger("A"));
184+
row.set("A", null);
185+
Assert.assertEquals(true, df.getRow(1).isNA("A"));
182186

187+
row.set("A", Values.NA);
188+
Assert.assertEquals(true, df.getRow(1).isNA("A"));
183189
df.getColumn("A").sort();
184190
}
185191

@@ -371,7 +377,13 @@ public void testNA() throws IOException {
371377
DataFrame df = DataFrameLoader.load(csv,csvReader);
372378
List<DataRow> r = df.getRows();
373379
int i = 0;
380+
df.addStringColumn("test");
381+
df.addDoubleColumn("test2");
382+
374383
for (DataRow row : df.rows()) {
384+
Assert.assertEquals(Values.NA, row.get("test"));
385+
Assert.assertEquals(Values.NA, row.get("test2"));
386+
375387
if (i == 2) {
376388
Assert.assertEquals(true, row.isNA("B"));
377389
} else {

0 commit comments

Comments
 (0)