SQL: restore support for timezones in the DateTimeProcessor (elastic/x-pack-elasticsearch#2450)

The timezone handling seems to be lost in a merge conflict in elastic/x-pack-elasticsearch@20f41e2

Original commit: elastic/x-pack-elasticsearch@92c0ca3572
This commit is contained in:
Igor Motov 2017-09-10 17:44:45 -07:00 committed by GitHub
parent 664c087c3f
commit 6ef174aa19
4 changed files with 18 additions and 11 deletions

View File

@ -18,18 +18,22 @@ public class DateTimeProcessor implements ColumnProcessor {
public static final String NAME = "d"; public static final String NAME = "d";
private final DateTimeExtractor extractor; private final DateTimeExtractor extractor;
private final DateTimeZone timeZone;
public DateTimeProcessor(DateTimeExtractor extractor) { public DateTimeProcessor(DateTimeExtractor extractor, DateTimeZone timeZone) {
this.extractor = extractor; this.extractor = extractor;
this.timeZone = timeZone;
} }
DateTimeProcessor(StreamInput in) throws IOException { DateTimeProcessor(StreamInput in) throws IOException {
extractor = in.readEnum(DateTimeExtractor.class); extractor = in.readEnum(DateTimeExtractor.class);
timeZone = DateTimeZone.forID(in.readString());
} }
@Override @Override
public void writeTo(StreamOutput out) throws IOException { public void writeTo(StreamOutput out) throws IOException {
out.writeEnum(extractor); out.writeEnum(extractor);
out.writeString(timeZone.getID());
} }
@Override @Override
@ -43,14 +47,17 @@ public class DateTimeProcessor implements ColumnProcessor {
@Override @Override
public Object apply(Object l) { public Object apply(Object l) {
ReadableDateTime dt = null; ReadableDateTime dt;
// most dates are returned as long // most dates are returned as long
if (l instanceof Long) { if (l instanceof Long) {
dt = new DateTime((Long) l, DateTimeZone.UTC); dt = new DateTime(((Long) l).longValue(), DateTimeZone.UTC);
} }
else { else {
dt = (ReadableDateTime) l; dt = (ReadableDateTime) l;
} }
if (!timeZone.getID().equals("UTC")) {
dt = dt.toDateTime().withZone(timeZone);
}
return extractor.extract(dt); return extractor.extract(dt);
} }

View File

@ -86,7 +86,7 @@ public abstract class DateTimeFunction extends ScalarFunction implements TimeZon
@Override @Override
public final ColumnProcessor asProcessor() { public final ColumnProcessor asProcessor() {
return new DateTimeProcessor(extractor()); return new DateTimeProcessor(extractor(), timeZone);
} }
protected abstract DateTimeExtractor extractor(); protected abstract DateTimeExtractor extractor();

View File

@ -15,7 +15,7 @@ import java.io.IOException;
public class DateTimeProcessorTests extends AbstractWireSerializingTestCase<DateTimeProcessor> { public class DateTimeProcessorTests extends AbstractWireSerializingTestCase<DateTimeProcessor> {
public static DateTimeProcessor randomDateTimeProcessor() { public static DateTimeProcessor randomDateTimeProcessor() {
return new DateTimeProcessor(randomFrom(DateTimeExtractor.values())); return new DateTimeProcessor(randomFrom(DateTimeExtractor.values()), DateTimeZone.UTC);
} }
@Override @Override
@ -30,16 +30,17 @@ public class DateTimeProcessorTests extends AbstractWireSerializingTestCase<Date
@Override @Override
protected DateTimeProcessor mutateInstance(DateTimeProcessor instance) throws IOException { protected DateTimeProcessor mutateInstance(DateTimeProcessor instance) throws IOException {
return new DateTimeProcessor(randomValueOtherThan(instance.extractor(), () -> randomFrom(DateTimeExtractor.values()))); return new DateTimeProcessor(randomValueOtherThan(instance.extractor(), () -> randomFrom(DateTimeExtractor.values())),
DateTimeZone.UTC);
} }
public void testApply() { public void testApply() {
DateTimeProcessor proc = new DateTimeProcessor(DateTimeExtractor.YEAR); DateTimeProcessor proc = new DateTimeProcessor(DateTimeExtractor.YEAR, DateTimeZone.UTC);
assertEquals(1970, proc.apply(0L)); assertEquals(1970, proc.apply(0L));
assertEquals(1970, proc.apply(new DateTime(0L, DateTimeZone.UTC))); assertEquals(1970, proc.apply(new DateTime(0L, DateTimeZone.UTC)));
assertEquals(2017, proc.apply(new DateTime(2017, 01, 02, 10, 10, DateTimeZone.UTC))); assertEquals(2017, proc.apply(new DateTime(2017, 01, 02, 10, 10, DateTimeZone.UTC)));
proc = new DateTimeProcessor(DateTimeExtractor.DAY_OF_MONTH); proc = new DateTimeProcessor(DateTimeExtractor.DAY_OF_MONTH, DateTimeZone.UTC);
assertEquals(1, proc.apply(0L)); assertEquals(1, proc.apply(0L));
assertEquals(1, proc.apply(new DateTime(0L, DateTimeZone.UTC))); assertEquals(1, proc.apply(new DateTime(0L, DateTimeZone.UTC)));
assertEquals(2, proc.apply(new DateTime(2017, 01, 02, 10, 10, DateTimeZone.UTC))); assertEquals(2, proc.apply(new DateTime(2017, 01, 02, 10, 10, DateTimeZone.UTC)));

View File

@ -16,9 +16,8 @@ public class DayOfYearTests extends ESTestCase {
public void testAsColumnProcessor() { public void testAsColumnProcessor() {
assertEquals(1, extract(dateTime(0), UTC)); assertEquals(1, extract(dateTime(0), UTC));
// NOCOMMIT: these time zones are not getting resolved on mac and extract seems to ignore the timezone anyway assertEquals(1, extract(dateTime(0), DateTimeZone.forID("+01:00")));
// assertEquals(1, extract(dateTime(0), DateTimeZone.forID("GMT+1"))); assertEquals(365, extract(dateTime(0), DateTimeZone.forID("-01:00")));
// assertEquals(365, extract(dateTime(0), DateTimeZone.forID("GMT-1")));
} }
private DateTime dateTime(long millisSinceEpoch) { private DateTime dateTime(long millisSinceEpoch) {