You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by ga...@apache.org on 2011/01/20 19:58:07 UTC
svn commit: r1061456 - in /pig/trunk/contrib: ./
piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/
piggybank/java/src/test/java/org/apache/pig/piggybank/test/evaluation/datetime/truncate/
Author: gates
Date: Thu Jan 20 18:58:06 2011
New Revision: 1061456
URL: http://svn.apache.org/viewvc?rev=1061456&view=rev
Log:
PIG-1781: Piggybank: ISOToDay disregards timezone (should use ISODateTimeFormat instead of DateTime to parse)
Added:
pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOHelper.java
Modified:
pig/trunk/contrib/CHANGES.txt
pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToDay.java
pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToHour.java
pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToMinute.java
pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToMonth.java
pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToSecond.java
pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToWeek.java
pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToYear.java
pig/trunk/contrib/piggybank/java/src/test/java/org/apache/pig/piggybank/test/evaluation/datetime/truncate/TestTruncateDateTime.java
Modified: pig/trunk/contrib/CHANGES.txt
URL: http://svn.apache.org/viewvc/pig/trunk/contrib/CHANGES.txt?rev=1061456&r1=1061455&r2=1061456&view=diff
==============================================================================
--- pig/trunk/contrib/CHANGES.txt (original)
+++ pig/trunk/contrib/CHANGES.txt Thu Jan 20 18:58:06 2011
@@ -24,6 +24,9 @@ INCOMPATIBLE CHANGES
IMPROVEMENTS
+PIG-1781 Piggybank: ISOToDay disregards timezone (should use ISODateTimeFormat
+instead of DateTime to parse) (misterbeebee via gates)
+
PIG-1722 PiggyBank AllLoader - Load multiple file formats in one load
statement (gerritjw via gates)
Added: pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOHelper.java
URL: http://svn.apache.org/viewvc/pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOHelper.java?rev=1061456&view=auto
==============================================================================
--- pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOHelper.java (added)
+++ pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOHelper.java Thu Jan 20 18:58:06 2011
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pig.piggybank.evaluation.datetime.truncate;
+
+import org.apache.pig.data.Tuple;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.format.ISODateTimeFormat;
+import org.apache.pig.backend.executionengine.ExecException;
+
+/**
+ * ISOHelper provides helper methods for the other classes in this package.
+ *
+ * Jodatime: http://joda-time.sourceforge.net/
+ * ISO8601 Date Format: http://en.wikipedia.org/wiki/ISO_8601
+ * This class is public so that it can be tested in TestTruncateDateTime.
+ * Otherwise, it would have "package" visibility.
+ */
+public class ISOHelper {
+
+ /**
+ * Default time zone for use in parsing, regardless of System or JDK's
+ * default time zone.
+ */
+ public static final DateTimeZone DEFAULT_DATE_TIME_ZONE = DateTimeZone.UTC;
+
+ /**
+ * @param input a non-null, non-empty Tuple,
+ * whose first element is a ISO 8601 string representation of a date, time, or dateTime;
+ * with optional time zone.
+ * @return a DateTime representing the date,
+ * with DateTimeZone set to the time zone parsed from the string,
+ * or else DateTimeZone.defaultTimeZone() if one is set,
+ * or else UTC.
+ * @throws ExecException if input is a malformed or empty tuple.
+ * This method is public so that it can be tested in TestTruncateDateTime.
+ * Otherwise, it would have "package" visibility.
+ */
+ public static DateTime parseDateTime(Tuple input) throws ExecException {
+
+ // Save previous default time zone for restore later.
+ DateTimeZone previousDefaultTimeZone = DateTimeZone.getDefault();
+
+ // Temporarily set default time zone to UTC, for this parse.
+ DateTimeZone.setDefault(DEFAULT_DATE_TIME_ZONE);
+
+ String isoDateString = input.get(0).toString();
+ DateTime dt = ISODateTimeFormat.dateTimeParser().withOffsetParsed().parseDateTime(isoDateString);
+
+ // restore previous default TimeZone.
+ DateTimeZone.setDefault(previousDefaultTimeZone);
+
+ return dt;
+ }
+
+}
+
Modified: pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToDay.java
URL: http://svn.apache.org/viewvc/pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToDay.java?rev=1061456&r1=1061455&r2=1061456&view=diff
==============================================================================
--- pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToDay.java (original)
+++ pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToDay.java Thu Jan 20 18:58:06 2011
@@ -24,7 +24,6 @@ import org.apache.pig.data.Tuple;
import org.apache.pig.impl.logicalLayer.FrontendException;
import org.apache.pig.impl.logicalLayer.schema.Schema;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
import java.io.IOException;
import java.util.ArrayList;
@@ -65,9 +64,9 @@ import java.util.List;
* ISOToMonth(dt) as month,
* ISOToWeek(dt) as week,
* ISOToDay(dt) AS day,
- * ISOToHour(dt) AS hour,
- * ISOToMinute(dt) AS min,
- * ISOToSecond(dt) as sec;
+ * ISOToHour(dt) AS hour,
+ * ISOToMinute(dt) AS min,
+ * ISOToSecond(dt) as sec;
*
* DESCRIBE truncated;
* truncated: {year: chararray,month: chararray,week: chararray,day: chararray,hour: chararray,min: chararray,sec: chararray}
@@ -79,29 +78,25 @@ import java.util.List;
*/
public class ISOToDay extends EvalFunc<String> {
-
+
@Override
- public String exec(Tuple input) throws IOException
- {
+ public String exec(Tuple input) throws IOException {
if (input == null || input.size() < 1) {
return null;
}
- // Set the time to default or the output is in UTC
- DateTimeZone.setDefault(DateTimeZone.UTC);
-
- DateTime dt = new DateTime((String)input.get(0).toString());
-
+ DateTime dt = ISOHelper.parseDateTime(input);
+
// Set the the hour, minute, second and milliseconds to 0
DateTime result = dt.hourOfDay().setCopy(0).minuteOfHour().setCopy(0).secondOfMinute().setCopy(0).millisOfSecond().setCopy(0);
return result.toString();
}
- @Override
- public Schema outputSchema(Schema input) {
+ @Override
+ public Schema outputSchema(Schema input) {
return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input), DataType.CHARARRAY));
- }
+ }
@Override
public List<FuncSpec> getArgToFuncMapping() throws FrontendException {
Modified: pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToHour.java
URL: http://svn.apache.org/viewvc/pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToHour.java?rev=1061456&r1=1061455&r2=1061456&view=diff
==============================================================================
--- pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToHour.java (original)
+++ pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToHour.java Thu Jan 20 18:58:06 2011
@@ -27,7 +27,7 @@ import org.apache.pig.data.DataType;
import org.apache.pig.data.Tuple;
import org.apache.pig.impl.logicalLayer.FrontendException;
import org.apache.pig.impl.logicalLayer.schema.Schema;
-import org.joda.time.*;
+import org.joda.time.DateTime;
/**
* ISOToHour truncates an ISO8601 datetime string to the precision of the hour field
@@ -80,16 +80,12 @@ import org.joda.time.*;
public class ISOToHour extends EvalFunc<String> {
@Override
- public String exec(Tuple input) throws IOException
- {
+ public String exec(Tuple input) throws IOException {
if (input == null || input.size() < 1) {
return null;
- }
-
- // Set the time to default or the output is in UTC
- DateTimeZone.setDefault(DateTimeZone.UTC);
+ }
- DateTime dt = new DateTime((String)input.get(0).toString());
+ DateTime dt = ISOHelper.parseDateTime(input);
// Set the minute, second and milliseconds to 0
DateTime result = dt.minuteOfHour().setCopy(0).secondOfMinute().setCopy(0).millisOfSecond().setCopy(0);
@@ -97,10 +93,10 @@ public class ISOToHour extends EvalFunc<
return result.toString();
}
- @Override
- public Schema outputSchema(Schema input) {
+ @Override
+ public Schema outputSchema(Schema input) {
return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input), DataType.CHARARRAY));
- }
+ }
@Override
public List<FuncSpec> getArgToFuncMapping() throws FrontendException {
Modified: pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToMinute.java
URL: http://svn.apache.org/viewvc/pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToMinute.java?rev=1061456&r1=1061455&r2=1061456&view=diff
==============================================================================
--- pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToMinute.java (original)
+++ pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToMinute.java Thu Jan 20 18:58:06 2011
@@ -24,7 +24,6 @@ import org.apache.pig.data.Tuple;
import org.apache.pig.impl.logicalLayer.FrontendException;
import org.apache.pig.impl.logicalLayer.schema.Schema;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
import java.io.IOException;
import java.util.ArrayList;
@@ -81,16 +80,12 @@ import java.util.List;
public class ISOToMinute extends EvalFunc<String> {
@Override
- public String exec(Tuple input) throws IOException
- {
+ public String exec(Tuple input) throws IOException {
if (input == null || input.size() < 1) {
return null;
}
-
- // Set the time to default or the output is in UTC
- DateTimeZone.setDefault(DateTimeZone.UTC);
- DateTime dt = new DateTime((String)input.get(0).toString());
+ DateTime dt = ISOHelper.parseDateTime(input);
// Set the the second and milliseconds to 0
DateTime result = dt.secondOfMinute().setCopy(0).millisOfSecond().setCopy(0);
@@ -98,10 +93,10 @@ public class ISOToMinute extends EvalFun
return result.toString();
}
- @Override
- public Schema outputSchema(Schema input) {
+ @Override
+ public Schema outputSchema(Schema input) {
return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input), DataType.CHARARRAY));
- }
+ }
@Override
public List<FuncSpec> getArgToFuncMapping() throws FrontendException {
Modified: pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToMonth.java
URL: http://svn.apache.org/viewvc/pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToMonth.java?rev=1061456&r1=1061455&r2=1061456&view=diff
==============================================================================
--- pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToMonth.java (original)
+++ pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToMonth.java Thu Jan 20 18:58:06 2011
@@ -24,7 +24,6 @@ import org.apache.pig.data.Tuple;
import org.apache.pig.impl.logicalLayer.FrontendException;
import org.apache.pig.impl.logicalLayer.schema.Schema;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
import java.io.IOException;
import java.util.ArrayList;
@@ -82,16 +81,12 @@ import java.util.List;
public class ISOToMonth extends EvalFunc<String> {
@Override
- public String exec(Tuple input) throws IOException
- {
+ public String exec(Tuple input) throws IOException {
if (input == null || input.size() < 1) {
return null;
}
-
- // Set the time to default or the output is in UTC
- DateTimeZone.setDefault(DateTimeZone.UTC);
- DateTime dt = new DateTime((String)input.get(0).toString());
+ DateTime dt = ISOHelper.parseDateTime(input);
// Set the day to 1 and the hour, minute, second and milliseconds to 0
DateTime result = dt.dayOfMonth().setCopy(1).hourOfDay().setCopy(0).minuteOfHour().setCopy(0).secondOfMinute().setCopy(0).millisOfSecond().setCopy(0);
@@ -99,10 +94,10 @@ public class ISOToMonth extends EvalFunc
return result.toString();
}
- @Override
- public Schema outputSchema(Schema input) {
+ @Override
+ public Schema outputSchema(Schema input) {
return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input), DataType.CHARARRAY));
- }
+ }
@Override
public List<FuncSpec> getArgToFuncMapping() throws FrontendException {
Modified: pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToSecond.java
URL: http://svn.apache.org/viewvc/pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToSecond.java?rev=1061456&r1=1061455&r2=1061456&view=diff
==============================================================================
--- pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToSecond.java (original)
+++ pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToSecond.java Thu Jan 20 18:58:06 2011
@@ -24,7 +24,6 @@ import org.apache.pig.data.Tuple;
import org.apache.pig.impl.logicalLayer.FrontendException;
import org.apache.pig.impl.logicalLayer.schema.Schema;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
import java.io.IOException;
import java.util.ArrayList;
@@ -82,16 +81,12 @@ import java.util.List;
public class ISOToSecond extends EvalFunc<String> {
@Override
- public String exec(Tuple input) throws IOException
- {
+ public String exec(Tuple input) throws IOException {
if (input == null || input.size() < 1) {
return null;
}
-
- // Set the time to default or the output is in UTC
- DateTimeZone.setDefault(DateTimeZone.UTC);
- DateTime dt = new DateTime((String)input.get(0).toString());
+ DateTime dt = ISOHelper.parseDateTime(input);
// Set the the second and milliseconds to 0
DateTime result = dt.millisOfSecond().setCopy(0);
@@ -99,10 +94,10 @@ public class ISOToSecond extends EvalFun
return result.toString();
}
- @Override
- public Schema outputSchema(Schema input) {
+ @Override
+ public Schema outputSchema(Schema input) {
return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input), DataType.CHARARRAY));
- }
+ }
@Override
public List<FuncSpec> getArgToFuncMapping() throws FrontendException {
Modified: pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToWeek.java
URL: http://svn.apache.org/viewvc/pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToWeek.java?rev=1061456&r1=1061455&r2=1061456&view=diff
==============================================================================
--- pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToWeek.java (original)
+++ pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToWeek.java Thu Jan 20 18:58:06 2011
@@ -24,7 +24,6 @@ import org.apache.pig.data.Tuple;
import org.apache.pig.impl.logicalLayer.FrontendException;
import org.apache.pig.impl.logicalLayer.schema.Schema;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
import java.io.IOException;
import java.util.ArrayList;
@@ -84,16 +83,12 @@ import java.util.List;
public class ISOToWeek extends EvalFunc<String> {
@Override
- public String exec(Tuple input) throws IOException
- {
+ public String exec(Tuple input) throws IOException {
if (input == null || input.size() < 1) {
return null;
}
-
- // Set the time to default or the output is in UTC
- DateTimeZone.setDefault(DateTimeZone.UTC);
- DateTime dt = new DateTime((String)input.get(0).toString());
+ DateTime dt = ISOHelper.parseDateTime(input);
// Set the the day to 1, and the hour, minute, second and milliseconds to 0
DateTime result = dt.dayOfWeek().setCopy(1).hourOfDay().setCopy(0).minuteOfHour().setCopy(0).secondOfMinute().setCopy(0).millisOfSecond().setCopy(0);
@@ -101,10 +96,10 @@ public class ISOToWeek extends EvalFunc<
return result.toString();
}
- @Override
- public Schema outputSchema(Schema input) {
+ @Override
+ public Schema outputSchema(Schema input) {
return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input), DataType.CHARARRAY));
- }
+ }
@Override
public List<FuncSpec> getArgToFuncMapping() throws FrontendException {
Modified: pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToYear.java
URL: http://svn.apache.org/viewvc/pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToYear.java?rev=1061456&r1=1061455&r2=1061456&view=diff
==============================================================================
--- pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToYear.java (original)
+++ pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/datetime/truncate/ISOToYear.java Thu Jan 20 18:58:06 2011
@@ -73,7 +73,6 @@ import org.apache.pig.data.Tuple;
import org.apache.pig.impl.logicalLayer.FrontendException;
import org.apache.pig.impl.logicalLayer.schema.Schema;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
import java.io.IOException;
import java.util.ArrayList;
@@ -82,16 +81,12 @@ import java.util.List;
public class ISOToYear extends EvalFunc<String> {
@Override
- public String exec(Tuple input) throws IOException
- {
+ public String exec(Tuple input) throws IOException {
if (input == null || input.size() < 1) {
return null;
}
-
- // Set the time to default or the output is in UTC
- DateTimeZone.setDefault(DateTimeZone.UTC);
- DateTime dt = new DateTime((String)input.get(0).toString());
+ DateTime dt = ISOHelper.parseDateTime(input);
// Set the month and day to 1 and the hour, minute, second and milliseconds to 0
DateTime result = dt.monthOfYear().setCopy(1).dayOfMonth().setCopy(1).hourOfDay().setCopy(0).minuteOfHour().setCopy(0).secondOfMinute().setCopy(0).millisOfSecond().setCopy(0);
@@ -99,10 +94,10 @@ public class ISOToYear extends EvalFunc<
return result.toString();
}
- @Override
- public Schema outputSchema(Schema input) {
+ @Override
+ public Schema outputSchema(Schema input) {
return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input), DataType.CHARARRAY));
- }
+ }
@Override
public List<FuncSpec> getArgToFuncMapping() throws FrontendException {
Modified: pig/trunk/contrib/piggybank/java/src/test/java/org/apache/pig/piggybank/test/evaluation/datetime/truncate/TestTruncateDateTime.java
URL: http://svn.apache.org/viewvc/pig/trunk/contrib/piggybank/java/src/test/java/org/apache/pig/piggybank/test/evaluation/datetime/truncate/TestTruncateDateTime.java?rev=1061456&r1=1061455&r2=1061456&view=diff
==============================================================================
--- pig/trunk/contrib/piggybank/java/src/test/java/org/apache/pig/piggybank/test/evaluation/datetime/truncate/TestTruncateDateTime.java (original)
+++ pig/trunk/contrib/piggybank/java/src/test/java/org/apache/pig/piggybank/test/evaluation/datetime/truncate/TestTruncateDateTime.java Thu Jan 20 18:58:06 2011
@@ -17,9 +17,12 @@
*/
package org.apache.pig.piggybank.test.evaluation.datetime.truncate;
+import org.apache.pig.backend.executionengine.ExecException;
import org.apache.pig.data.Tuple;
import org.apache.pig.data.TupleFactory;
import org.apache.pig.piggybank.evaluation.datetime.truncate.*;
+import org.joda.time.DateTimeZone;
+import org.joda.time.DateTime;
import org.junit.Test;
import junit.framework.TestCase;
@@ -27,6 +30,147 @@ import junit.framework.TestCase;
public class TestTruncateDateTime extends TestCase {
@Test
+ public void testParseDateTime_defaultTimeZonePreserved() throws ExecException {
+
+ // Remember pre-test default time zone.
+ DateTimeZone previousDefaultTimeZone = DateTimeZone.getDefault();
+
+ // Overwrite default time zone for this test.
+ DateTimeZone testDefaultDateTimeZone = DateTimeZone.forOffsetHours(-8);
+ DateTimeZone.setDefault(testDefaultDateTimeZone);
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "2010-04-15T08:11:33.020");
+
+ // ISOHelper's internal default timezone is preferred over previous default DateTimeZone.
+ assertEquals(ISOHelper.parseDateTime(t1), new DateTime(2010, 4, 15, 8, 11, 33, 20, ISOHelper.DEFAULT_DATE_TIME_ZONE));
+
+ // Calling parseDate restores DateTimeZone.default before it returns.
+ assertTrue(testDefaultDateTimeZone.equals(DateTimeZone.getDefault()));
+
+ // Restore pre-test default time zone.
+ DateTimeZone.setDefault(previousDefaultTimeZone);
+ }
+
+ @Test
+ public void testParseDateTime_UTC() throws ExecException {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "2010-04-15T08:11:33.020Z");
+
+ // Time zone is preserved.
+ assertEquals(ISOHelper.parseDateTime(t1), new DateTime(2010, 4, 15, 8, 11, 33, 20, DateTimeZone.UTC));
+
+ // Time zone is strictly preserved. Parsed date is not equal to "simultaneous" datetime in different time zone.
+ assertFalse(ISOHelper.parseDateTime(t1).equals(new DateTime(2010, 4, 15, 0, 11, 33, 20, DateTimeZone.forOffsetHours(-8))));
+ }
+
+ @Test
+ public void testParseDateTime_TimeZone() throws ExecException {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "2010-04-15T08:11:33.020-08:00");
+
+ // Time zone is preserved.
+ assertEquals(ISOHelper.parseDateTime(t1), new DateTime(2010, 4, 15, 8, 11, 33, 20, DateTimeZone.forOffsetHours(-8)));
+
+ // Time zone is strictly preserved. Parsed date is not equal to "simultaneous" datetime in different time zone.
+ assertFalse(ISOHelper.parseDateTime(t1).equals(new DateTime(2010, 4, 15, 16, 11, 33, 20, DateTimeZone.UTC)));
+ }
+
+ /**
+ * When no time zone is specified at all, UTC is presumed.
+ * @throws Exception
+ */
+ @Test
+ public void testParseDateTime_NoTimeZone() throws ExecException {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "2010-04-15T08:11:33.020");
+
+ // Time zone is preserved.
+ assertEquals(ISOHelper.parseDateTime(t1), new DateTime(2010, 4, 15, 8, 11, 33, 20, DateTimeZone.UTC));
+ }
+
+ /**
+ * Parsing ISO date with a time zone but no time will throw an exception.
+ * @throws Exception
+ */
+ @Test
+ public void testParseDateTime_noTime_UTC() throws ExecException {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "2010-04-15Z");
+
+ try {
+ ISOHelper.parseDateTime(t1);
+ fail("ISO date with a time zone but no time should not be parsable.");
+ } catch (IllegalArgumentException e) {
+ // This is expected.
+ }
+ }
+
+ /**
+ * Parsing ISO date with no time and no time zone works.
+ * Time defaults to midnight in UTC.
+ * @throws Exception
+ */
+ @Test
+ public void testParseDateTime_noTime_noTimeZone() throws ExecException {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "2010-04-15");
+
+ // Time zone is preserved.
+ assertEquals(ISOHelper.parseDateTime(t1), new DateTime(2010, 4, 15, 0, 0, 0, 0, DateTimeZone.UTC));
+ }
+
+ /**
+ * Parsing ISO date-less times works. 'T' prefix is required.
+ * Date defaults to 1970-01-01
+ * @throws Exception
+ */
+ @Test
+ public void testParseDateTime_timeOnly_UTC() throws ExecException {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "T08:11:33.020Z");
+
+ // Time zone is preserved.
+ assertEquals(ISOHelper.parseDateTime(t1), new DateTime(1970, 1, 1, 8, 11, 33, 20, DateTimeZone.UTC));
+ }
+
+ /**
+ * Parsing ISO date-less times works. 'T' prefix is required.
+ * Date defaults to 1970-01-01
+ * @throws Exception
+ */
+ @Test
+ public void testParseDateTime_timeOnly_TimeZone() throws ExecException {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "T08:11:33.020-0800");
+
+ // Time zone is preserved.
+ assertEquals(ISOHelper.parseDateTime(t1), new DateTime(1970, 1, 1, 8, 11, 33, 20, DateTimeZone.forOffsetHours(-8)));
+ }
+
+ /**
+ * Parsing ISO date-less times with no time zone works. Defaults to UTC.
+ * 'T' prefix is required. Date defaults to 1970-01-01
+ * @throws Exception
+ */
+ @Test
+ public void testParseDateTime_timeOnly_NoTimeZone() throws ExecException {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "T08:11:33.020Z");
+
+ // Time zone is preserved.
+ assertEquals(ISOHelper.parseDateTime(t1), new DateTime(1970, 1, 1, 8, 11, 33, 20, DateTimeZone.UTC));
+ }
+
+ @Test
public void testToYear() throws Exception {
Tuple t1 = TupleFactory.getInstance().newTuple(1);
@@ -35,7 +179,7 @@ public class TestTruncateDateTime extend
ISOToYear func = new ISOToYear();
String truncated = func.exec(t1);
- assertTrue(truncated.equals("2010-01-01T00:00:00.000Z"));
+ assertEquals(truncated, "2010-01-01T00:00:00.000Z");
}
@Test
@@ -47,7 +191,7 @@ public class TestTruncateDateTime extend
ISOToMonth func = new ISOToMonth();
String truncated = func.exec(t1);
- assertTrue(truncated.equals("2010-04-01T00:00:00.000Z"));
+ assertEquals(truncated, "2010-04-01T00:00:00.000Z");
}
@Test
@@ -59,9 +203,7 @@ public class TestTruncateDateTime extend
ISOToWeek func = new ISOToWeek();
String truncated = func.exec(t1);
- System.out.println("Truncateed week: " + truncated);
-
- assertTrue(truncated.equals("2010-04-12T00:00:00.000Z"));
+ assertEquals(truncated, "2010-04-12T00:00:00.000Z");
}
@Test
@@ -73,7 +215,7 @@ public class TestTruncateDateTime extend
ISOToDay func = new ISOToDay();
String truncated = func.exec(t1);
- assertTrue(truncated.equals("2010-04-15T00:00:00.000Z"));
+ assertEquals(truncated, "2010-04-15T00:00:00.000Z");
}
@Test
@@ -85,7 +227,7 @@ public class TestTruncateDateTime extend
ISOToHour func = new ISOToHour();
String truncated = func.exec(t1);
- assertTrue(truncated.equals("2010-04-15T08:00:00.000Z"));
+ assertEquals(truncated, "2010-04-15T08:00:00.000Z");
}
@Test
@@ -97,7 +239,7 @@ public class TestTruncateDateTime extend
ISOToMinute func = new ISOToMinute();
String truncated = func.exec(t1);
- assertTrue(truncated.equals("2010-04-15T08:11:00.000Z"));
+ assertEquals(truncated, "2010-04-15T08:11:00.000Z");
}
@Test
@@ -109,6 +251,92 @@ public class TestTruncateDateTime extend
ISOToSecond func = new ISOToSecond();
String truncated = func.exec(t1);
- assertTrue(truncated.equals("2010-04-15T08:11:33.000Z"));
+ assertEquals(truncated, "2010-04-15T08:11:33.000Z");
+ }
+
+
+ @Test
+ public void testToYear_Timezone() throws Exception {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "2010-04-15T08:11:33.020-08:00");
+
+ ISOToYear func = new ISOToYear();
+ String truncated = func.exec(t1);
+
+ assertEquals(truncated, "2010-01-01T00:00:00.000-08:00");
+ }
+
+ @Test
+ public void testToMonth_Timezone() throws Exception {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "2010-04-15T08:11:33.020-08:00");
+
+ ISOToMonth func = new ISOToMonth();
+ String truncated = func.exec(t1);
+
+ assertEquals(truncated, "2010-04-01T00:00:00.000-08:00");
+ }
+
+ @Test
+ public void testToWeek_Timezone() throws Exception {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "2010-04-15T08:11:33.020-08:00");
+
+ ISOToWeek func = new ISOToWeek();
+ String truncated = func.exec(t1);
+
+ assertEquals(truncated, "2010-04-12T00:00:00.000-08:00");
+ }
+
+ @Test
+ public void testToDay_Timezone() throws Exception {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "2010-04-15T08:11:33.020-08:00");
+
+ ISOToDay func = new ISOToDay();
+ String truncated = func.exec(t1);
+
+ assertEquals(truncated, "2010-04-15T00:00:00.000-08:00");
+ }
+
+ @Test
+ public void testToHour_Timezone() throws Exception {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "2010-04-15T08:11:33.020-08:00");
+
+ ISOToHour func = new ISOToHour();
+ String truncated = func.exec(t1);
+
+ assertEquals(truncated, "2010-04-15T08:00:00.000-08:00");
+ }
+
+ @Test
+ public void testToMinute_Timezone() throws Exception {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "2010-04-15T08:11:33.020-08:00");
+
+ ISOToMinute func = new ISOToMinute();
+ String truncated = func.exec(t1);
+
+ assertEquals(truncated, "2010-04-15T08:11:00.000-08:00");
+ }
+
+ @Test
+ public void testToSecond_Timezone() throws Exception {
+
+ Tuple t1 = TupleFactory.getInstance().newTuple(1);
+ t1.set(0, "2010-04-15T08:11:33.020-08:00");
+
+ ISOToSecond func = new ISOToSecond();
+ String truncated = func.exec(t1);
+
+ assertEquals(truncated, "2010-04-15T08:11:33.000-08:00");
}
+
}
\ No newline at end of file