Skip to content

Commit

Permalink
Refactor instant datetime columns (#38)
Browse files Browse the repository at this point in the history
* Correct error message in InstantColumn (see jtablesaw#1241)

* TemporalMapFunctions parameterized with column

* Move plusXXX() methods not supported by Instants to DateTimeMapFunctions

* Remove tests not feasible on InstantColumn

* DateTime and Instant Fillers testing

* TemporalMapFunctions testing for Instants

* Additional testing for DateTime and Instant columns

* Correct comparison for millisecond precision
  • Loading branch information
ccleva authored Dec 26, 2024
1 parent 6210834 commit 05310d2
Show file tree
Hide file tree
Showing 10 changed files with 509 additions and 199 deletions.
9 changes: 5 additions & 4 deletions core/src/main/java/tech/tablesaw/api/DateTimeColumn.java
Original file line number Diff line number Diff line change
Expand Up @@ -221,18 +221,19 @@ public void setPrintFormatter(DateTimeColumnFormatter formatter) {
/** {@inheritDoc} */
@Override
public DateTimeColumn lag(int n) {
final int size = size();
int srcPos = n >= 0 ? 0 : -n;
long[] dest = new long[size()];
long[] dest = new long[size];
int destPos = Math.max(n, 0);
int length = n >= 0 ? size() - n : size() + n;
int length = n >= 0 ? size - n : size + n;

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

System.arraycopy(data.toLongArray(), srcPos, dest, destPos, length);

DateTimeColumn copy = emptyCopy(size());
DateTimeColumn copy = emptyCopy(size);
copy.data = new LongArrayList(dest);
copy.setName(name() + " lag(" + n + ")");
return copy;
Expand Down
15 changes: 8 additions & 7 deletions core/src/main/java/tech/tablesaw/api/InstantColumn.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,10 @@
import tech.tablesaw.columns.Column;
import tech.tablesaw.columns.instant.InstantColumnFormatter;
import tech.tablesaw.columns.instant.InstantColumnType;
import tech.tablesaw.columns.instant.InstantMapFunctions;
import tech.tablesaw.columns.instant.PackedInstant;
import tech.tablesaw.columns.temporal.TemporalFillers;
import tech.tablesaw.columns.temporal.TemporalFilters;
import tech.tablesaw.columns.temporal.TemporalMapFunctions;
import tech.tablesaw.selection.Selection;

/**
Expand All @@ -58,7 +58,7 @@
* instances of {@link java.time.Instant}, which have nanosecond precision
*/
public class InstantColumn extends AbstractColumn<InstantColumn, Instant>
implements InstantMapFunctions,
implements TemporalMapFunctions<InstantColumn, Instant>,
TemporalFillers<Instant, InstantColumn>,
TemporalFilters<Instant>,
CategoricalColumn<Instant> {
Expand Down Expand Up @@ -218,18 +218,19 @@ public void setPrintFormatter(InstantColumnFormatter formatter) {
/** {@inheritDoc} */
@Override
public InstantColumn lag(int n) {
final int size = size();
int srcPos = n >= 0 ? 0 : -n;
long[] dest = new long[size()];
long[] dest = new long[size];
int destPos = Math.max(n, 0);
int length = n >= 0 ? size() - n : size() + n;
int length = n >= 0 ? size - n : size + n;

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

System.arraycopy(data.toLongArray(), srcPos, dest, destPos, length);

InstantColumn copy = emptyCopy(size());
InstantColumn copy = emptyCopy(size);
copy.data = new LongArrayList(dest);
copy.setName(name() + " lag(" + n + ")");
return copy;
Expand Down Expand Up @@ -273,7 +274,7 @@ public InstantColumn appendObj(Object obj) {
return append(timestamp.toInstant());
}
throw new IllegalArgumentException(
"Cannot append " + obj.getClass().getName() + " to DateTimeColumn");
"Cannot append " + obj.getClass().getName() + " to InstantColumn");
}

/** {@inheritDoc} */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
import tech.tablesaw.columns.temporal.TemporalMapFunctions;
import tech.tablesaw.columns.times.TimeColumnType;

public interface DateTimeMapFunctions extends TemporalMapFunctions<LocalDateTime> {
public interface DateTimeMapFunctions extends TemporalMapFunctions<DateTimeColumn, LocalDateTime> {

default IntColumn hour() {
IntColumn newColumn = IntColumn.create(name() + "[" + "hour" + "]");
Expand Down Expand Up @@ -91,16 +91,6 @@ default IntColumn secondOfDay() {
return newColumn;
}

@Override
default DateTimeColumn lead(int n) {
DateTimeColumn column = lag(-n);
column.setName(name() + " lead(" + n + ")");
return column;
}

@Override
DateTimeColumn lag(int n);

/** Returns a TimeColumn containing the time portion of each dateTime in this DateTimeColumn */
default TimeColumn time() {
TimeColumn newColumn = TimeColumn.create(this.name() + " time");
Expand Down Expand Up @@ -164,54 +154,6 @@ default StringColumn yearQuarter() {
return newColumn;
}

@Override
DateTimeColumn plus(long amountToAdd, ChronoUnit unit);

@Override
default DateTimeColumn plusYears(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.YEARS);
}

@Override
default DateTimeColumn plusMonths(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.MONTHS);
}

@Override
default DateTimeColumn plusWeeks(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.WEEKS);
}

@Override
default DateTimeColumn plusDays(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.DAYS);
}

@Override
default DateTimeColumn plusHours(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.HOURS);
}

@Override
default DateTimeColumn plusMinutes(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.MINUTES);
}

@Override
default DateTimeColumn plusSeconds(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.SECONDS);
}

@Override
default DateTimeColumn plusMillis(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.MILLIS);
}

@Override
default DateTimeColumn plusMicros(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.MICROS);
}

/**
* Returns a StringColumn with the year and month from this column concatenated into a String that
* will sort lexicographically in temporal order.
Expand Down Expand Up @@ -443,4 +385,17 @@ default IntColumn minute() {
default LongColumn timeWindow(ChronoUnit unit, int n) {
return timeWindow(unit, n, min());
}

default DateTimeColumn plusYears(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.YEARS);
}

default DateTimeColumn plusMonths(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.MONTHS);
}

default DateTimeColumn plusWeeks(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.WEEKS);
}

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,21 @@
import tech.tablesaw.columns.Column;
import tech.tablesaw.columns.booleans.BooleanColumnType;

public interface TemporalMapFunctions<T extends Temporal> extends TemporalColumn<T> {
public interface TemporalMapFunctions<C extends TemporalColumn<T>, T extends Temporal> extends TemporalColumn<T> {

T min();

TemporalColumn<T> emptyCopy();
C emptyCopy();

@Override
C lag(int n);

@Override
default C lead(int n) {
C column = lag(-n);
column.setName(name() + " lead(" + n + ")");
return column;
}

default LongColumn differenceInMilliseconds(TemporalColumn<T> column2) {
return difference(column2, ChronoUnit.MILLIS);
Expand Down Expand Up @@ -78,41 +88,29 @@ default LongColumn difference(TemporalColumn<T> column2, ChronoUnit unit) {
return newColumn;
}

Column<T> plus(long amountToAdd, ChronoUnit unit);

default Column<T> plusYears(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.YEARS);
}

default Column<T> plusMonths(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.MONTHS);
}

default Column<T> plusWeeks(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.WEEKS);
}
C plus(long amountToAdd, ChronoUnit unit);

default Column<T> plusDays(long amountToAdd) {
default C plusDays(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.DAYS);
}

default Column<T> plusHours(long amountToAdd) {
default C plusHours(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.HOURS);
}

default Column<T> plusMinutes(long amountToAdd) {
default C plusMinutes(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.MINUTES);
}

default Column<T> plusSeconds(long amountToAdd) {
default C plusSeconds(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.SECONDS);
}

default Column<T> plusMillis(long amountToAdd) {
default C plusMillis(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.MILLIS);
}

default Column<T> plusMicros(long amountToAdd) {
default C plusMicros(long amountToAdd) {
return plus(amountToAdd, ChronoUnit.MICROS);
}

Expand Down
Loading

0 comments on commit 05310d2

Please sign in to comment.