diff --git a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Day.java b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Day.java index 827e07cb60..eceb34dcce 100644 --- a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Day.java +++ b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Day.java @@ -9,7 +9,6 @@ import com.yahoo.elide.core.utils.coerce.converters.Serde; import java.sql.Date; -import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -26,7 +25,7 @@ public Day(java.util.Date date) { } @ElideTypeConverter(type = Day.class, name = "Day") - static public class DaySerde implements Serde { + static public class DaySerde implements Serde, TimeGrainFormatter { @Override public Day deserialize(Object val) { @@ -34,14 +33,14 @@ public Day deserialize(Object val) { try { if (val instanceof String) { - date = new Day(new Timestamp(FORMATTER.parse((String) val).getTime())); + date = new Day(TimeGrainFormatter.formatDateString(FORMATTER, (String) val)); } else { date = new Day(FORMATTER.parse(FORMATTER.format(val))); } } catch (ParseException e) { - throw new IllegalArgumentException("String must be formatted as " + FORMAT); + throw new IllegalArgumentException("String must be formatted as " + FORMAT + + " or " + TimeGrainFormatter.ISO_FORMAT); } - return date; } diff --git a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Hour.java b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Hour.java index e94801d7da..dca40fd0a2 100644 --- a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Hour.java +++ b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Hour.java @@ -25,7 +25,7 @@ public Hour(java.util.Date date) { } @ElideTypeConverter(type = Hour.class, name = "Hour") - static public class HourSerde implements Serde { + static public class HourSerde implements Serde, TimeGrainFormatter { @Override public Hour deserialize(Object val) { @@ -33,12 +33,13 @@ public Hour deserialize(Object val) { try { if (val instanceof String) { - date = new Hour(new Timestamp(FORMATTER.parse((String) val).getTime())); + date = new Hour(TimeGrainFormatter.formatDateString(FORMATTER, (String) val)); } else { date = new Hour(FORMATTER.parse(FORMATTER.format(val))); } } catch (ParseException e) { - throw new IllegalArgumentException("String must be formatted as " + FORMAT); + throw new IllegalArgumentException("String must be formatted as " + FORMAT + + " or " + TimeGrainFormatter.ISO_FORMAT); } return date; diff --git a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/ISOWeek.java b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/ISOWeek.java index 90cab888fa..a6e8aa6ca7 100644 --- a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/ISOWeek.java +++ b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/ISOWeek.java @@ -9,7 +9,6 @@ import com.yahoo.elide.core.utils.coerce.converters.Serde; import java.sql.Date; -import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -26,7 +25,7 @@ public ISOWeek(java.util.Date date) { } @ElideTypeConverter(type = ISOWeek.class, name = "ISOWeek") - static public class ISOWeekSerde implements Serde { + static public class ISOWeekSerde implements Serde, TimeGrainFormatter { private static final SimpleDateFormat WEEKDATE_FORMATTER = new SimpleDateFormat("u"); @Override @@ -36,12 +35,13 @@ public ISOWeek deserialize(Object val) { try { if (val instanceof String) { - date = new ISOWeek(new Timestamp(FORMATTER.parse((String) val).getTime())); + date = new ISOWeek(TimeGrainFormatter.formatDateString(FORMATTER, (String) val)); } else { date = new ISOWeek(FORMATTER.parse(FORMATTER.format(val))); } } catch (ParseException e) { - throw new IllegalArgumentException("String must be formatted as " + FORMAT); + throw new IllegalArgumentException("String must be formatted as " + FORMAT + + " or " + TimeGrainFormatter.ISO_FORMAT); } if (!WEEKDATE_FORMATTER.format(date).equals("1")) { diff --git a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Minute.java b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Minute.java index a2cb1dc5d5..a7813e3f8b 100644 --- a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Minute.java +++ b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Minute.java @@ -25,7 +25,7 @@ public Minute(java.util.Date date) { } @ElideTypeConverter(type = Minute.class, name = "Minute") - static public class MinuteSerde implements Serde { + static public class MinuteSerde implements Serde, TimeGrainFormatter { @Override public Minute deserialize(Object val) { @@ -33,12 +33,13 @@ public Minute deserialize(Object val) { try { if (val instanceof String) { - date = new Minute(new Timestamp(FORMATTER.parse((String) val).getTime())); + date = new Minute(TimeGrainFormatter.formatDateString(FORMATTER, (String) val)); } else { date = new Minute(FORMATTER.parse(FORMATTER.format(val))); } } catch (ParseException e) { - throw new IllegalArgumentException("String must be formatted as " + FORMAT); + throw new IllegalArgumentException("String must be formatted as " + FORMAT + + " or " + TimeGrainFormatter.ISO_FORMAT); } return date; diff --git a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Month.java b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Month.java index 7cfd4ce190..ffde2e19f7 100644 --- a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Month.java +++ b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Month.java @@ -9,7 +9,6 @@ import com.yahoo.elide.core.utils.coerce.converters.Serde; import java.sql.Date; -import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -26,7 +25,7 @@ public Month(java.util.Date date) { } @ElideTypeConverter(type = Month.class, name = "Month") - static public class MonthSerde implements Serde { + static public class MonthSerde implements Serde, TimeGrainFormatter { @Override public Month deserialize(Object val) { @@ -34,12 +33,13 @@ public Month deserialize(Object val) { try { if (val instanceof String) { - date = new Month(new Timestamp(FORMATTER.parse((String) val).getTime())); + date = new Month(TimeGrainFormatter.formatDateString(FORMATTER, (String) val)); } else { date = new Month(FORMATTER.parse(FORMATTER.format(val))); } } catch (ParseException e) { - throw new IllegalArgumentException("String must be formatted as " + FORMAT); + throw new IllegalArgumentException("String must be formatted as " + FORMAT + + " or " + TimeGrainFormatter.ISO_FORMAT); } return date; diff --git a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Quarter.java b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Quarter.java index 8e460b2a06..0cce95fee3 100644 --- a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Quarter.java +++ b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Quarter.java @@ -9,7 +9,6 @@ import com.yahoo.elide.core.utils.coerce.converters.Serde; import java.sql.Date; -import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; @@ -29,7 +28,7 @@ public Quarter(java.util.Date date) { } @ElideTypeConverter(type = Quarter.class, name = "Quarter") - static public class QuarterSerde implements Serde { + static public class QuarterSerde implements Serde, TimeGrainFormatter { private static final SimpleDateFormat MONTH_FORMATTER = new SimpleDateFormat("M"); private static final Set QUARTER_MONTHS = new HashSet<>(Arrays.asList("1", "4", "7", "10")); @@ -40,12 +39,13 @@ public Quarter deserialize(Object val) { try { if (val instanceof String) { - date = new Quarter(new Timestamp(FORMATTER.parse((String) val).getTime())); + date = new Quarter(TimeGrainFormatter.formatDateString(FORMATTER, (String) val)); } else { date = new Quarter(FORMATTER.parse(FORMATTER.format(val))); } } catch (ParseException e) { - throw new IllegalArgumentException("String must be formatted as " + FORMAT); + throw new IllegalArgumentException("String must be formatted as " + FORMAT + + " or " + TimeGrainFormatter.ISO_FORMAT); } if (!QUARTER_MONTHS.contains(MONTH_FORMATTER.format(date))) { diff --git a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Second.java b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Second.java index 58495bf891..0e8f23476b 100644 --- a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Second.java +++ b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Second.java @@ -31,7 +31,7 @@ public String toString() { } @ElideTypeConverter(type = Second.class, name = "Second") - static public class SecondSerde implements Serde { + static public class SecondSerde implements Serde, TimeGrainFormatter { @Override public Second deserialize(Object val) { @@ -39,12 +39,13 @@ public Second deserialize(Object val) { try { if (val instanceof String) { - date = new Second(new Timestamp(FORMATTER.parse((String) val).getTime())); + date = new Second(TimeGrainFormatter.formatDateString(FORMATTER, (String) val)); } else { date = new Second(FORMATTER.parse(FORMATTER.format(val))); } } catch (ParseException e) { - throw new IllegalArgumentException("String must be formatted as " + FORMAT); + throw new IllegalArgumentException("String must be formatted as " + FORMAT + + " or " + TimeGrainFormatter.ISO_FORMAT); } return date; diff --git a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/TimeGrainFormatter.java b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/TimeGrainFormatter.java new file mode 100644 index 0000000000..f90ae39ebd --- /dev/null +++ b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/TimeGrainFormatter.java @@ -0,0 +1,25 @@ +/* + * Copyright 2020, Yahoo Inc. + * Licensed under the Apache License, Version 2.0 + * See LICENSE file in project root for terms. + */ +package com.yahoo.elide.datastores.aggregation.timegrains; + +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; + +/** Interface for ISO timegrain Support. */ +public interface TimeGrainFormatter { + + String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'"; + SimpleDateFormat ISO_FORMATTER = new SimpleDateFormat(ISO_FORMAT); + + static Timestamp formatDateString(SimpleDateFormat formatter, String val) throws ParseException { + try { + return new Timestamp(formatter.parse(val).getTime()); + } catch (ParseException pe) { + return new Timestamp(ISO_FORMATTER.parse(val).getTime()); + } + } +} diff --git a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Week.java b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Week.java index ba5e3cc587..f023fb2e2f 100644 --- a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Week.java +++ b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Week.java @@ -9,7 +9,6 @@ import com.yahoo.elide.core.utils.coerce.converters.Serde; import java.sql.Date; -import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -26,7 +25,7 @@ public Week(java.util.Date date) { } @ElideTypeConverter(type = Week.class, name = "Week") - static public class WeekSerde implements Serde { + static public class WeekSerde implements Serde, TimeGrainFormatter { private static final SimpleDateFormat WEEKDATE_FORMATTER = new SimpleDateFormat("u"); @Override @@ -36,12 +35,13 @@ public Week deserialize(Object val) { try { if (val instanceof String) { - date = new Week(new Timestamp(FORMATTER.parse((String) val).getTime())); + date = new Week(TimeGrainFormatter.formatDateString(FORMATTER, (String) val)); } else { date = new Week(FORMATTER.parse(FORMATTER.format(val))); } } catch (ParseException e) { - throw new IllegalArgumentException("String must be formatted as " + FORMAT); + throw new IllegalArgumentException("String must be formatted as " + FORMAT + + " or " + TimeGrainFormatter.ISO_FORMAT); } if (!WEEKDATE_FORMATTER.format(date).equals("7")) { diff --git a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Year.java b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Year.java index 350f06e008..9cc7197c9e 100644 --- a/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Year.java +++ b/elide-datastore/elide-datastore-aggregation/src/main/java/com/yahoo/elide/datastores/aggregation/timegrains/Year.java @@ -9,7 +9,6 @@ import com.yahoo.elide.core.utils.coerce.converters.Serde; import java.sql.Date; -import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -34,12 +33,13 @@ public Year deserialize(Object val) { try { if (val instanceof String) { - date = new Year(new Timestamp(FORMATTER.parse((String) val).getTime())); + date = new Year(TimeGrainFormatter.formatDateString(FORMATTER, (String) val)); } else { date = new Year(FORMATTER.parse(FORMATTER.format(val))); } } catch (ParseException e) { - throw new IllegalArgumentException("String must be formatted as " + FORMAT); + throw new IllegalArgumentException("String must be formatted as " + FORMAT + + " or " + TimeGrainFormatter.ISO_FORMAT); } return date; diff --git a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/DaySerdeTest.java b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/DaySerdeTest.java index d2562f1358..2f5566a92d 100644 --- a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/DaySerdeTest.java +++ b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/DaySerdeTest.java @@ -7,6 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; + import com.yahoo.elide.core.utils.coerce.converters.Serde; import com.yahoo.elide.datastores.aggregation.timegrains.Day; import org.junit.jupiter.api.Test; @@ -17,6 +18,7 @@ public class DaySerdeTest { private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + private SimpleDateFormat isoFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); @Test public void testDateSerialize() throws ParseException { @@ -59,4 +61,14 @@ public void testDeserializeDateInvalidFormat() throws ParseException { serde.deserialize(dateInString); }); } + + @Test + public void testISODateString() throws ParseException { + String dateInString = "2020-01-01T00:00:00-0500"; + Day expectedDate = new Day(formatter.parse(dateInString)); + String actual = "2020-01-01"; + Serde serde = new Day.DaySerde(); + Object actualDate = serde.deserialize(actual); + assertEquals(expectedDate, actualDate); + } } diff --git a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/HourSerdeTest.java b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/HourSerdeTest.java index 2cfc2d7926..fbf23e244a 100644 --- a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/HourSerdeTest.java +++ b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/HourSerdeTest.java @@ -18,6 +18,7 @@ public class HourSerdeTest { private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH"); + private SimpleDateFormat isoFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); @Test public void testDateSerialize() throws ParseException { @@ -60,4 +61,14 @@ public void testDeserializeDateInvalidFormat() throws ParseException { serde.deserialize(dateInString); }); } + + @Test + public void testISODateString() throws ParseException { + String dateInString = "2021-01-12T08:00:00-0500"; + String expectedDate = new Hour(isoFormatter.parse(dateInString)).toString(); + Timestamp timestamp = new Timestamp(isoFormatter.parse(dateInString).getTime()); + Serde serde = new Hour.HourSerde(); + String actualDate = serde.deserialize(timestamp).toString(); + assertEquals(expectedDate, actualDate); + } } diff --git a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/ISOWeekSerdeTest.java b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/ISOWeekSerdeTest.java index fa5f7cb4f0..dd4a9377e7 100644 --- a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/ISOWeekSerdeTest.java +++ b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/ISOWeekSerdeTest.java @@ -18,6 +18,7 @@ public class ISOWeekSerdeTest { private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + private SimpleDateFormat isoFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); @Test public void testDateSerialize() throws ParseException { @@ -71,4 +72,14 @@ public void testDeserializeDateInvalidFormat() throws ParseException { serde.deserialize(dateInString); }); } + + @Test + public void testISODateString() throws ParseException { + String dateInString = "2020-01-06T00:00:00-0500"; + Date expectedDate = new Date(formatter.parse(dateInString).getTime()); + String actual = "2020-01-06"; + Serde serde = new ISOWeek.ISOWeekSerde(); + Object actualDate = serde.deserialize(actual); + assertEquals(expectedDate, actualDate); + } } diff --git a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/MinuteSerdeTest.java b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/MinuteSerdeTest.java index 383fcc4c6b..2f9550d56e 100644 --- a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/MinuteSerdeTest.java +++ b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/MinuteSerdeTest.java @@ -18,6 +18,7 @@ public class MinuteSerdeTest { private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm"); + private SimpleDateFormat isoFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); @Test public void testDateSerialize() throws ParseException { @@ -60,4 +61,14 @@ public void testDeserializeDateInvalidFormat() throws ParseException { serde.deserialize(dateInString); }); } + + @Test + public void testISODateString() throws ParseException { + String dateInString = "2020-01-01T01:18:00-0500"; + Date expectedDate = new Date(formatter.parse(dateInString).getTime()); + String actual = "2020-01-01T01:18"; + Serde serde = new Minute.MinuteSerde(); + Object actualDate = serde.deserialize(actual); + assertEquals(expectedDate, actualDate); + } } diff --git a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/MonthSerdeTest.java b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/MonthSerdeTest.java index 31ca919fdc..560a479f03 100644 --- a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/MonthSerdeTest.java +++ b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/MonthSerdeTest.java @@ -9,6 +9,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import com.yahoo.elide.core.utils.coerce.converters.Serde; import com.yahoo.elide.datastores.aggregation.timegrains.Month; + import org.junit.jupiter.api.Test; import java.sql.Timestamp; @@ -17,6 +18,7 @@ public class MonthSerdeTest { private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM"); + private SimpleDateFormat isoFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); @Test public void testDateSerialize() throws ParseException { @@ -59,4 +61,14 @@ public void testDeserializeDateInvalidFormat() throws ParseException { serde.deserialize(dateInString); }); } + + @Test + public void testISODateString() throws ParseException { + String dateInString = "2020-01-01T00:00:00-0500"; + Month expectedDate = new Month(formatter.parse(dateInString)); + String actual = "2020-01"; + Serde serde = new Month.MonthSerde(); + Object actualDate = serde.deserialize(actual); + assertEquals(expectedDate, actualDate); + } } diff --git a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/QuarterSerdeTest.java b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/QuarterSerdeTest.java index 6ff80f773c..f37ad30f99 100644 --- a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/QuarterSerdeTest.java +++ b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/QuarterSerdeTest.java @@ -17,6 +17,7 @@ public class QuarterSerdeTest { private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM"); + private SimpleDateFormat isoFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); @Test public void testDateSerialize() throws ParseException { @@ -70,4 +71,14 @@ public void testDeserializeDateInvalidFormat() throws ParseException { serde.deserialize(dateInString); }); } + + @Test + public void testISODateString() throws ParseException { + String dateInString = "2021-01-01T00:00:00-0500"; + Quarter expectedDate = new Quarter(formatter.parse(dateInString)); + String actual = "2021-01"; + Serde serde = new Quarter.QuarterSerde(); + Object actualDate = serde.deserialize(actual); + assertEquals(expectedDate, actualDate); + } } diff --git a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/SecondSerdeTest.java b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/SecondSerdeTest.java index ffaf29a2b1..b34f13fd0f 100644 --- a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/SecondSerdeTest.java +++ b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/SecondSerdeTest.java @@ -18,6 +18,7 @@ public class SecondSerdeTest { private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + private SimpleDateFormat isoFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); @Test public void testDateSerialize() throws ParseException { @@ -60,4 +61,14 @@ public void testDeserializeDateInvalidFormat() throws ParseException { serde.deserialize(dateInString); }); } + + @Test + public void testISODateString() throws ParseException { + String dateInString = "2020-01-01T01:18:19-0000"; + Date expectedDate = new Date(formatter.parse(dateInString).getTime()); + String actual = "2020-01-01T01:18:19"; + Serde serde = new Second.SecondSerde(); + Object actualDate = serde.deserialize(actual); + assertEquals(expectedDate, actualDate); + } } diff --git a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/WeekSerdeTest.java b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/WeekSerdeTest.java index 5cb770cfc1..9457773ff4 100644 --- a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/WeekSerdeTest.java +++ b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/WeekSerdeTest.java @@ -18,6 +18,7 @@ public class WeekSerdeTest { private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + private SimpleDateFormat isoFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); @Test public void testDateSerialize() throws ParseException { @@ -71,4 +72,14 @@ public void testDeserializeDateInvalidFormat() throws ParseException { serde.deserialize(dateInString); }); } + + @Test + public void testISODateString() throws ParseException { + String dateInString = "2021-01-10T00:00:00-0500"; + Date expectedDate = new Date(formatter.parse(dateInString).getTime()); + String actual = "2021-01-10"; + Serde serde = new Week.WeekSerde(); + Object actualDate = serde.deserialize(actual); + assertEquals(expectedDate, actualDate); + } } diff --git a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/YearSerdeTest.java b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/YearSerdeTest.java index 11d3728ef6..e461df87b6 100644 --- a/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/YearSerdeTest.java +++ b/elide-datastore/elide-datastore-aggregation/src/test/java/com/yahoo/elide/datastores/aggregation/timegrains/serde/YearSerdeTest.java @@ -17,6 +17,7 @@ public class YearSerdeTest { private SimpleDateFormat formatter = new SimpleDateFormat("yyyy"); + private SimpleDateFormat isoFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); @Test public void testDateSerialize() throws ParseException { @@ -59,4 +60,14 @@ public void testDeserializeDateInvalidFormat() throws ParseException { serde.deserialize(dateInString); }); } + + @Test + public void testISODateString() throws ParseException { + String dateInString = "2021-01-01T00:00:00-0500"; + Year expectedDate = new Year(formatter.parse(dateInString)); + String actual = "2021"; + Serde serde = new Year.YearSerde(); + Object actualDate = serde.deserialize(actual); + assertEquals(expectedDate, actualDate); + } }