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