Skip to content

Commit

Permalink
further work on cleaning up the data wrappers
Browse files Browse the repository at this point in the history
  • Loading branch information
lwhite1 committed Aug 17, 2018
1 parent 73b40c8 commit 6b5c7e8
Show file tree
Hide file tree
Showing 25 changed files with 60,002 additions and 59,924 deletions.
3 changes: 1 addition & 2 deletions core/src/examples/java/tech/tablesaw/TornadoExample.java
Expand Up @@ -34,8 +34,7 @@ public static void main(String[] args) throws Exception {

Table structure = tornadoes.structure();
out(structure);
out(structure.where(
structure.stringColumn("Column Type").isEqualTo("DOUBLE")));
out(structure.where(structure.stringColumn("Column Type").isEqualTo("DOUBLE")));

tornadoes.setName("tornadoes");

Expand Down
Expand Up @@ -9,6 +9,7 @@
import tech.tablesaw.api.DateTimeColumn;
import tech.tablesaw.api.NumberColumn;
import tech.tablesaw.columns.Column;
import tech.tablesaw.columns.numbers.DoubleColumnType;

import java.time.LocalDate;
import java.time.LocalDateTime;
Expand Down Expand Up @@ -108,7 +109,7 @@ public Double summarize(BooleanColumn column) {

@Override
public Double summarize(NumberColumn column) {
return column.isEmpty() ? NumberColumn.MISSING_VALUE : column.getDouble(0);
return column.isEmpty() ? DoubleColumnType.missingValueIndicator() : column.getDouble(0);
}
};

Expand All @@ -119,7 +120,7 @@ public Double summarize(NumberColumn column) {

@Override
public Double summarize(NumberColumn column) {
return column.isEmpty() ? NumberColumn.MISSING_VALUE : column.getDouble(column.size() - 1);
return column.isEmpty() ? DoubleColumnType.missingValueIndicator() : column.getDouble(column.size() - 1);
}
};

Expand All @@ -130,7 +131,7 @@ public Double summarize(NumberColumn column) {

@Override
public Double summarize(NumberColumn column) {
return column.size() < 2 ? NumberColumn.MISSING_VALUE : column.getDouble(column.size() - 1) - column.getDouble(0);
return column.size() < 2 ? DoubleColumnType.missingValueIndicator() : column.getDouble(column.size() - 1) - column.getDouble(0);
}
};

Expand All @@ -141,7 +142,7 @@ public Double summarize(NumberColumn column) {

@Override
public Double summarize(NumberColumn column) {
return column.size() < 2 ? NumberColumn.MISSING_VALUE : (column.getDouble(column.size() - 1) - column.getDouble(0)) / column.getDouble(0);
return column.size() < 2 ? DoubleColumnType.missingValueIndicator() : (column.getDouble(column.size() - 1) - column.getDouble(0)) / column.getDouble(0);
}
};

Expand Down
4 changes: 3 additions & 1 deletion core/src/main/java/tech/tablesaw/api/DateColumn.java
Expand Up @@ -317,7 +317,9 @@ public DateColumn append(LocalDate value) {

@Override
public DateColumn appendObj(Object obj) {
if (!(obj instanceof LocalDate)) {
if (obj == null) {
return appendMissing();
} else if (!(obj instanceof LocalDate)) {
throw new IllegalArgumentException();
}
return append((LocalDate) obj);
Expand Down
23 changes: 15 additions & 8 deletions core/src/main/java/tech/tablesaw/api/NumberColumn.java
Expand Up @@ -55,13 +55,11 @@
import java.util.function.ToDoubleFunction;

import static tech.tablesaw.aggregate.AggregateFunctions.*;
import static tech.tablesaw.api.ColumnType.DOUBLE;
import static tech.tablesaw.api.ColumnType.*;
import static tech.tablesaw.columns.numbers.NumberPredicates.*;

public class NumberColumn extends AbstractColumn<Double> implements NumberMapFunctions, NumberFilters, NumberFillers<NumberColumn>, CategoricalColumn<Double> {

public static double MISSING_VALUE = (Double) DOUBLE.getMissingValueIndicator();

private NumericDataWrapper data;

private NumberColumnFormatter printFormatter = new NumberColumnFormatter();
Expand All @@ -84,18 +82,18 @@ private NumberColumn(final String name, final DoubleArrayList data) {
}

private NumberColumn(final String name, final FloatArrayList data) {
super(DOUBLE, name);
super(FLOAT, name);
setDataWrapper(new FloatDataWrapper(data));
}

private NumberColumn(final String name, IntArrayList data) {
super(DOUBLE, name);
super(INTEGER, name);
this.printFormatter = NumberColumnFormatter.ints();
setDataWrapper(new IntDataWrapper(data));
}

private NumberColumn(final String name, final NumericDataWrapper data) {
super(DOUBLE, name);
super(data.type(), name);
setDataWrapper(data);
}

Expand Down Expand Up @@ -254,7 +252,7 @@ public double firstElement() {
if (size() > 0) {
return getDouble(0);
}
return MISSING_VALUE;
return data.missingValueIndicator();
}

/**
Expand Down Expand Up @@ -358,8 +356,17 @@ public NumberColumn appendCell(final String object) {

@Override
public NumberColumn appendCell(final String object, StringParser parser) {
// TODO: Move this into the data wrappers and avoid the branching logic
try {
append(parser.parseDouble(object));
if (type().equals(ColumnType.INTEGER)) {
append(parser.parseInt(object));
} else if (type().equals(ColumnType.FLOAT)) {
append(parser.parseFloat(object));
} else if (type().equals(ColumnType.DOUBLE)) {
append(parser.parseDouble(object));
} else {
throw new IllegalArgumentException("Unknown numeric type");
}
} catch (final NumberFormatException e) {
throw new NumberFormatException(name() + ": " + e.getMessage());
}
Expand Down
4 changes: 4 additions & 0 deletions core/src/main/java/tech/tablesaw/columns/StringParser.java
Expand Up @@ -44,6 +44,10 @@ public byte parseByte(String s) {
throw new UnsupportedOperationException(this.getClass().getSimpleName() + " doesn't support parsing to booleans");
}

public int parseInt(String s) {
throw new UnsupportedOperationException(this.getClass().getSimpleName() + " doesn't support parsing to booleans");
}

public double parseDouble(String s) {
throw new UnsupportedOperationException(this.getClass().getSimpleName() + " doesn't support parsing to doubles");
}
Expand Down
Expand Up @@ -23,6 +23,7 @@
import tech.tablesaw.api.TimeColumn;
import tech.tablesaw.columns.Column;
import tech.tablesaw.columns.datetimes.PackedLocalDateTime;
import tech.tablesaw.columns.numbers.DoubleColumnType;
import tech.tablesaw.columns.numbers.NumberColumnFormatter;

import java.time.LocalDate;
Expand Down Expand Up @@ -63,7 +64,7 @@ default NumberColumn dayOfMonth() {
for (int r = 0; r < this.size(); r++) {
int c1 = this.getIntInternal(r);
if (DateColumn.valueIsMissing(c1)) {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
} else {
newColumn.append(PackedLocalDate.getDayOfMonth(c1));
}
Expand All @@ -76,7 +77,7 @@ default NumberColumn dayOfYear() {
for (int r = 0; r < this.size(); r++) {
int c1 = this.getIntInternal(r);
if (DateColumn.valueIsMissing(c1)) {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
} else {
newColumn.append((short) PackedLocalDate.getDayOfYear(c1));
}
Expand All @@ -90,7 +91,7 @@ default NumberColumn monthValue() {
for (int r = 0; r < this.size(); r++) {
int c1 = this.getIntInternal(r);
if (DateColumn.valueIsMissing(c1)) {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
} else {
newColumn.append(PackedLocalDate.getMonthValue(c1));
}
Expand All @@ -117,7 +118,7 @@ default NumberColumn year() {
for (int r = 0; r < this.size(); r++) {
int c1 = this.getIntInternal(r);
if (DateColumn.valueIsMissing(c1)) {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
} else {
newColumn.append(PackedLocalDate.getYear(c1));
}
Expand Down Expand Up @@ -226,7 +227,7 @@ default NumberColumn dayOfWeekValue() {
for (int r = 0; r < this.size(); r++) {
int c1 = this.getIntInternal(r);
if (DateColumn.valueIsMissing(c1)) {
newColumn.set(r, NumberColumn.MISSING_VALUE);
newColumn.set(r, DoubleColumnType.missingValueIndicator());
} else {
newColumn.append((short) PackedLocalDate.getDayOfWeek(c1).getValue());
}
Expand Down Expand Up @@ -260,7 +261,7 @@ default NumberColumn timeUntil(DateColumn end, ChronoUnit unit) {
int c1 = getIntInternal(r);
int c2 = end.getIntInternal(r);
if (valueIsMissing(c1) || valueIsMissing(c2)) {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
} else {
switch (unit) {
case DAYS:
Expand Down
Expand Up @@ -17,6 +17,7 @@
import com.google.common.base.Strings;
import com.google.common.primitives.Ints;
import tech.tablesaw.api.DateColumn;
import tech.tablesaw.columns.numbers.IntColumnType;

import java.time.DayOfWeek;
import java.time.LocalDate;
Expand All @@ -32,7 +33,6 @@
import static java.time.DayOfWeek.*;
import static java.time.Month.*;
import static java.time.temporal.ChronoField.*;
import static tech.tablesaw.api.NumberColumn.MISSING_VALUE;
import static tech.tablesaw.columns.DateAndTimePredicates.*;

/**
Expand Down Expand Up @@ -68,7 +68,7 @@ public static short getYear(int date) {
}

public static LocalDate asLocalDate(int date) {
if (date == MISSING_VALUE) {
if (date == IntColumnType.missingValueIndicator()) {
return null;
}

Expand Down
Expand Up @@ -22,6 +22,7 @@
import tech.tablesaw.api.TimeColumn;
import tech.tablesaw.columns.Column;
import tech.tablesaw.columns.dates.PackedLocalDate;
import tech.tablesaw.columns.numbers.DoubleColumnType;
import tech.tablesaw.columns.numbers.NumberColumnFormatter;

import java.time.LocalDateTime;
Expand Down Expand Up @@ -65,7 +66,7 @@ default NumberColumn difference(DateTimeColumn column2, ChronoUnit unit) {
long c1 = this.getLongInternal(r);
long c2 = column2.getLongInternal(r);
if (c1 == MISSING_VALUE || c2 == MISSING_VALUE) {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
} else {
LocalDateTime value1 = asLocalDateTime(c1);
LocalDateTime value2 = asLocalDateTime(c2);
Expand All @@ -86,7 +87,7 @@ default NumberColumn hour() {
if (c1 != MISSING_VALUE) {
newColumn.append(getHour(c1));
} else {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
}
}
return newColumn;
Expand All @@ -99,7 +100,7 @@ default NumberColumn minuteOfDay() {
if (c1 != MISSING_VALUE) {
newColumn.append((short) getMinuteOfDay(c1));
} else {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
}
}
return newColumn;
Expand All @@ -112,7 +113,7 @@ default NumberColumn secondOfDay() {
if (c1 != MISSING_VALUE) {
newColumn.append(getSecondOfDay(c1));
} else {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
}
}
return newColumn;
Expand Down Expand Up @@ -149,7 +150,7 @@ default NumberColumn monthValue() {
for (int r = 0; r < this.size(); r++) {
long c1 = getLongInternal(r);
if (DateTimeColumn.valueIsMissing(c1)) {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
} else {
newColumn.append((short) getMonthValue(c1));
}
Expand Down Expand Up @@ -313,7 +314,7 @@ default NumberColumn year() {
for (int r = 0; r < this.size(); r++) {
long c1 = getLongInternal(r);
if (DateTimeColumn.valueIsMissing(c1)) {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
} else {
newColumn.append(PackedLocalDate.getYear(PackedLocalDateTime.date(c1)));
}
Expand All @@ -339,7 +340,7 @@ default NumberColumn dayOfWeekValue() {
for (int r = 0; r < this.size(); r++) {
long c1 = this.getLongInternal(r);
if (DateTimeColumn.valueIsMissing(c1)) {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
} else {
newColumn.append((short) getDayOfWeek(c1).getValue());
}
Expand All @@ -352,7 +353,7 @@ default NumberColumn dayOfYear() {
for (int r = 0; r < this.size(); r++) {
long c1 = this.getLongInternal(r);
if (DateTimeColumn.valueIsMissing(c1)) {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
} else {
newColumn.append((short) getDayOfYear(c1));
}
Expand All @@ -365,7 +366,7 @@ default NumberColumn dayOfMonth() {
for (int r = 0; r < this.size(); r++) {
long c1 = this.getLongInternal(r);
if (DateTimeColumn.valueIsMissing(c1)) {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
} else {
newColumn.append(getDayOfMonth(c1));
}
Expand Down Expand Up @@ -425,7 +426,7 @@ default NumberColumn minute() {
if (!DateTimeColumn.valueIsMissing(c1)) {
newColumn.append(getMinute(c1));
} else {
newColumn.append(NumberColumn.MISSING_VALUE);
newColumn.append(DoubleColumnType.missingValueIndicator());
}
}
return newColumn;
Expand Down
Expand Up @@ -11,8 +11,6 @@
import java.util.Arrays;
import java.util.Iterator;

import static tech.tablesaw.api.NumberColumn.MISSING_VALUE;

public class DoubleDataWrapper implements NumericDataWrapper {

private static final ColumnType COLUMN_TYPE = ColumnType.DOUBLE;
Expand Down Expand Up @@ -128,7 +126,7 @@ public NumericDataWrapper lag(int n) {
final int length = n >= 0 ? size() - n : size() + n;

for (int i = 0; i < size(); i++) {
dest[i] = MISSING_VALUE;
dest[i] = DoubleColumnType.missingValueIndicator();
}

double[] array = data.toDoubleArray();
Expand Down Expand Up @@ -177,4 +175,14 @@ public void appendMissing() {
public byte[] asBytes(int rowNumber) {
return ByteBuffer.allocate(COLUMN_TYPE.byteSize()).putDouble(getDouble(rowNumber)).array();
}

@Override
public double missingValueIndicator() {
return DoubleColumnType.missingValueIndicator();
}

@Override
public DoubleColumnType type() {
return ColumnType.DOUBLE;
}
}
Expand Up @@ -125,7 +125,7 @@ public NumericDataWrapper lag(int n) {
final int length = n >= 0 ? size() - n : size() + n;

for (int i = 0; i < size(); i++) {
dest[i] = Float.NaN;
dest[i] = FloatColumnType.missingValueIndicator();
}

float[] array = data.toFloatArray();
Expand Down Expand Up @@ -163,4 +163,14 @@ public float getFloat(int index) {
public byte[] asBytes(int rowNumber) {
return ByteBuffer.allocate(COLUMN_TYPE.byteSize()).putFloat(getFloat(rowNumber)).array();
}

@Override
public ColumnType type() {
return ColumnType.FLOAT;
}

@Override
public double missingValueIndicator() {
return FloatColumnType.missingValueIndicator();
}
}

0 comments on commit 6b5c7e8

Please sign in to comment.