Skip to content
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

ISO Support for Time Grains #1739

Closed
wants to merge 11 commits into from
Closed
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,13 @@
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;

/**
* Time Grain class for Day.
*/
public class Day extends Date {
public class Day extends Date implements TimeGrainFormatter {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is a Day an instance of TimeGrainFormatter? Can we remove this association?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeGrainFormatter has common logic that will be used by all the Grains for ISO handling. So instead of creating a Util class with that supporting method, we went the implement/interface route.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe DaySerde can implement it instead of Day.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are calling a static method on the interface. Technically nothing needs to implement it. DaySerde would make more sense though if we do.


public static final String FORMAT = "yyyy-MM-dd";
private static final SimpleDateFormat FORMATTER = new SimpleDateFormat(FORMAT);
Expand All @@ -34,14 +33,13 @@ public Day deserialize(Object val) {

try {
if (val instanceof String) {
date = new Day(new Timestamp(FORMATTER.parse((String) val).getTime()));
} else {
date = new Day(FORMATTER.parse(FORMATTER.format(val)));
date = new Day(TimeGrainFormatter.formatDateString(FORMATTER, (String) val));
}
date = new Day(FORMATTER.parse(FORMATTER.format(val)));
moizarafat marked this conversation as resolved.
Show resolved Hide resolved
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't we still need the else case? Otherwise this line stomps on line 36.

} 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;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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((String) val).getTime());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You don't need to cast val here as a String.

} catch (ParseException pe) {
return new Timestamp(ISO_FORMATTER.parse((String) val).getTime());
}
}
}