Repository: sqoop Updated Branches: refs/heads/sqoop2 5f58a1d46 -> fdc046950
SQOOP-1845: Sqoop2: Make DateTime Column type support datetime with and without timezone (Veena Basavaraj via Abraham ELmahrek) Project: http://git-wip-us.apache.org/repos/asf/sqoop/repo Commit: http://git-wip-us.apache.org/repos/asf/sqoop/commit/fdc04695 Tree: http://git-wip-us.apache.org/repos/asf/sqoop/tree/fdc04695 Diff: http://git-wip-us.apache.org/repos/asf/sqoop/diff/fdc04695 Branch: refs/heads/sqoop2 Commit: fdc0469505583ed5730566fe5797103c8c5fe4e1 Parents: 5f58a1d Author: Abraham Elmahrek <[email protected]> Authored: Mon Dec 8 17:12:36 2014 -0600 Committer: Abraham Elmahrek <[email protected]> Committed: Mon Dec 8 17:13:09 2014 -0600 ---------------------------------------------------------------------- .../sqoop/json/util/SchemaSerialization.java | 16 +-- .../org/apache/sqoop/schema/type/DateTime.java | 49 ++++---- .../java/org/apache/sqoop/schema/type/Time.java | 27 +++-- .../json/util/TestSchemaSerialization.java | 4 +- .../connector/jdbc/util/SqlTypesUtils.java | 4 +- .../idf/CSVIntermediateDataFormat.java | 78 +++++++++++-- .../idf/TestCSVIntermediateDataFormat.java | 111 ++++++++++++++----- 7 files changed, 197 insertions(+), 92 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/sqoop/blob/fdc04695/common/src/main/java/org/apache/sqoop/json/util/SchemaSerialization.java ---------------------------------------------------------------------- diff --git a/common/src/main/java/org/apache/sqoop/json/util/SchemaSerialization.java b/common/src/main/java/org/apache/sqoop/json/util/SchemaSerialization.java index 2f5fadc..fa9cd5c 100644 --- a/common/src/main/java/org/apache/sqoop/json/util/SchemaSerialization.java +++ b/common/src/main/java/org/apache/sqoop/json/util/SchemaSerialization.java @@ -153,8 +153,8 @@ public class SchemaSerialization { ret.put(CHAR_SIZE, ((AbstractString) column).getCharSize()); break; case DATE_TIME: - ret.put(FRACTION, ((DateTime) column).getFraction()); - ret.put(TIMEZONE, ((DateTime) column).getTimezone()); + ret.put(FRACTION, ((DateTime) column).hasFraction()); + ret.put(TIMEZONE, ((DateTime) column).hasTimezone()); break; case DECIMAL: ret.put(PRECISION, ((Decimal) column).getPrecision()); @@ -168,7 +168,7 @@ public class SchemaSerialization { ret.put(BYTE_SIZE, ((FloatingPoint) column).getByteSize()); break; case TIME: - ret.put(FRACTION, ((Time) column).getFraction()); + ret.put(FRACTION, ((Time) column).hasFraction()); break; case UNKNOWN: ret.put(JDBC_TYPE, ((Unknown) column).getJdbcType()); @@ -234,9 +234,9 @@ public class SchemaSerialization { output = new Date(name); break; case DATE_TIME: - Boolean fraction = (Boolean) obj.get(FRACTION); - Boolean timezone = (Boolean) obj.get(TIMEZONE); - output = new DateTime(name).setFraction(fraction).setTimezone(timezone); + Boolean hasFraction = (Boolean) obj.get(FRACTION); + Boolean hasTimezone = (Boolean) obj.get(TIMEZONE); + output = new DateTime(name, hasFraction, hasTimezone); break; case DECIMAL: Long precision = (Long) obj.get(PRECISION); @@ -266,8 +266,8 @@ public class SchemaSerialization { output = new Text(name).setCharSize(charSize); break; case TIME: - Boolean timeFraction = (Boolean) obj.get(FRACTION); - output = new Time(name).setFraction(timeFraction); + Boolean hasTimeFraction = (Boolean) obj.get(FRACTION); + output = new Time(name, hasTimeFraction); break; case UNKNOWN: Long jdbcType = (Long) obj.get(JDBC_TYPE); http://git-wip-us.apache.org/repos/asf/sqoop/blob/fdc04695/common/src/main/java/org/apache/sqoop/schema/type/DateTime.java ---------------------------------------------------------------------- diff --git a/common/src/main/java/org/apache/sqoop/schema/type/DateTime.java b/common/src/main/java/org/apache/sqoop/schema/type/DateTime.java index 791542a..5e237a6 100644 --- a/common/src/main/java/org/apache/sqoop/schema/type/DateTime.java +++ b/common/src/main/java/org/apache/sqoop/schema/type/DateTime.java @@ -25,47 +25,38 @@ package org.apache.sqoop.schema.type; public class DateTime extends AbstractDateTime { /** - * The column can contain fractions of seconds. + * The column can contain fractions of seconds (a.k.a nanos) */ - private Boolean fraction; + private Boolean hasFraction; /** * The column do have encoded timezone. */ - private Boolean timezone; + private Boolean hasTimezone; - public DateTime(String name) { + public DateTime(String name, Boolean hasFraction, Boolean hasTimezone) { super(name); + this.hasFraction = hasFraction; + this.hasTimezone = hasTimezone; } - public DateTime(String name, Boolean fraction, Boolean timezone) { - super(name); - this.fraction = fraction; - this.timezone = timezone; - } - - public DateTime(String name, Boolean nullable, Boolean fraction, Boolean timezone) { + public DateTime(String name, Boolean nullable, Boolean hasFraction, Boolean hasTimezone) { super(name, nullable); - this.fraction = fraction; - this.timezone = timezone; + this.hasFraction = hasFraction; + this.hasTimezone = hasTimezone; } - public Boolean getFraction() { - return fraction; + public Boolean hasFraction() { + return hasFraction; } public DateTime setFraction(Boolean fraction) { - this.fraction = fraction; + this.hasFraction = fraction; return this; } - public Boolean getTimezone() { - return timezone; - } - - public DateTime setTimezone(Boolean timezone) { - this.timezone = timezone; - return this; + public Boolean hasTimezone() { + return hasTimezone; } @Override @@ -77,8 +68,8 @@ public class DateTime extends AbstractDateTime { public String toString() { return new StringBuilder("Date{") .append(super.toString()) - .append(",fraction=").append(fraction) - .append(",timezone=").append(timezone) + .append(",hasFraction=").append(hasFraction) + .append(",hasTimezone=").append(hasTimezone) .append("}") .toString(); } @@ -91,9 +82,9 @@ public class DateTime extends AbstractDateTime { DateTime dateTime = (DateTime) o; - if (fraction != null ? !fraction.equals(dateTime.fraction) : dateTime.fraction != null) + if (hasFraction != null ? !hasFraction.equals(dateTime.hasFraction) : dateTime.hasFraction != null) return false; - if (timezone != null ? !timezone.equals(dateTime.timezone) : dateTime.timezone != null) + if (hasTimezone != null ? !hasTimezone.equals(dateTime.hasTimezone) : dateTime.hasTimezone != null) return false; return true; @@ -102,8 +93,8 @@ public class DateTime extends AbstractDateTime { @Override public int hashCode() { int result = super.hashCode(); - result = 31 * result + (fraction != null ? fraction.hashCode() : 0); - result = 31 * result + (timezone != null ? timezone.hashCode() : 0); + result = 31 * result + (hasFraction != null ? hasFraction.hashCode() : 0); + result = 31 * result + (hasTimezone != null ? hasTimezone.hashCode() : 0); return result; } } http://git-wip-us.apache.org/repos/asf/sqoop/blob/fdc04695/common/src/main/java/org/apache/sqoop/schema/type/Time.java ---------------------------------------------------------------------- diff --git a/common/src/main/java/org/apache/sqoop/schema/type/Time.java b/common/src/main/java/org/apache/sqoop/schema/type/Time.java index 9765eab..e9adce9 100644 --- a/common/src/main/java/org/apache/sqoop/schema/type/Time.java +++ b/common/src/main/java/org/apache/sqoop/schema/type/Time.java @@ -24,28 +24,27 @@ package org.apache.sqoop.schema.type; */ public class Time extends AbstractDateTime { - private Boolean fraction; + /** + * The column can contain fractions of seconds (a.k.a nanos) + */ + private Boolean hasFraction; - public Time(String name) { + public Time(String name, Boolean hasFraction) { super(name); - } - - public Time(String name, Boolean fraction) { - super(name); - this.fraction = fraction; + this.hasFraction = hasFraction; } public Time(String name, Boolean nullable, Boolean fraction) { super(name, nullable); - this.fraction = fraction; + this.hasFraction = fraction; } - public Boolean getFraction() { - return fraction; + public Boolean hasFraction() { + return hasFraction; } public Time setFraction(Boolean fraction) { - this.fraction = fraction; + this.hasFraction = fraction; return this; } @@ -58,7 +57,7 @@ public class Time extends AbstractDateTime { public String toString() { return new StringBuilder("Time{") .append(super.toString()) - .append(",fraction=").append(fraction) + .append(",hasFraction=").append(hasFraction) .append("}") .toString(); } @@ -71,7 +70,7 @@ public class Time extends AbstractDateTime { Time time = (Time) o; - if (fraction != null ? !fraction.equals(time.fraction) : time.fraction != null) + if (hasFraction != null ? !hasFraction.equals(time.hasFraction) : time.hasFraction != null) return false; return true; @@ -80,7 +79,7 @@ public class Time extends AbstractDateTime { @Override public int hashCode() { int result = super.hashCode(); - result = 31 * result + (fraction != null ? fraction.hashCode() : 0); + result = 31 * result + (hasFraction != null ? hasFraction.hashCode() : 0); return result; } } http://git-wip-us.apache.org/repos/asf/sqoop/blob/fdc04695/common/src/test/java/org/apache/sqoop/json/util/TestSchemaSerialization.java ---------------------------------------------------------------------- diff --git a/common/src/test/java/org/apache/sqoop/json/util/TestSchemaSerialization.java b/common/src/test/java/org/apache/sqoop/json/util/TestSchemaSerialization.java index 3d31600..f047556 100644 --- a/common/src/test/java/org/apache/sqoop/json/util/TestSchemaSerialization.java +++ b/common/src/test/java/org/apache/sqoop/json/util/TestSchemaSerialization.java @@ -159,7 +159,7 @@ public class TestSchemaSerialization { .addColumn(new Binary("b")) .addColumn(new Bit("c")) .addColumn(new Date("d")) - .addColumn(new DateTime("e")) + .addColumn(new DateTime("e", true, true)) .addColumn(new Decimal("f")) .addColumn(new Enum("g", Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(new String[] { "X", "Y" }))))) .addColumn(new FixedPoint("h")) @@ -167,7 +167,7 @@ public class TestSchemaSerialization { .addColumn(new Map("j", new Text("j1"), new Text("j2"))) .addColumn(new Set("k", new Text("k1"))) .addColumn(new Text("l")) - .addColumn(new Time("m")) + .addColumn(new Time("m", true)) .addColumn(new Unknown("u")) ; transferAndAssert(allTypes); http://git-wip-us.apache.org/repos/asf/sqoop/blob/fdc04695/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/util/SqlTypesUtils.java ---------------------------------------------------------------------- diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/util/SqlTypesUtils.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/util/SqlTypesUtils.java index 9d50dc3..9cfee46 100644 --- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/util/SqlTypesUtils.java +++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/util/SqlTypesUtils.java @@ -64,10 +64,10 @@ public class SqlTypesUtils { return new Date(columnName); case Types.TIME: - return new Time(columnName); + return new Time(columnName, true); case Types.TIMESTAMP: - return new DateTime(columnName); + return new DateTime(columnName, true, false); case Types.FLOAT: case Types.REAL: http://git-wip-us.apache.org/repos/asf/sqoop/blob/fdc04695/connector/connector-sdk/src/main/java/org/apache/sqoop/connector/idf/CSVIntermediateDataFormat.java ---------------------------------------------------------------------- diff --git a/connector/connector-sdk/src/main/java/org/apache/sqoop/connector/idf/CSVIntermediateDataFormat.java b/connector/connector-sdk/src/main/java/org/apache/sqoop/connector/idf/CSVIntermediateDataFormat.java index daa51eb..d6470e6 100644 --- a/connector/connector-sdk/src/main/java/org/apache/sqoop/connector/idf/CSVIntermediateDataFormat.java +++ b/connector/connector-sdk/src/main/java/org/apache/sqoop/connector/idf/CSVIntermediateDataFormat.java @@ -27,7 +27,6 @@ import org.apache.sqoop.schema.type.Column; import org.apache.sqoop.schema.type.ColumnType; import org.apache.sqoop.schema.type.FixedPoint; import org.apache.sqoop.schema.type.FloatingPoint; -import org.joda.time.DateTime; import org.joda.time.LocalDate; import org.joda.time.LocalTime; import org.joda.time.format.DateTimeFormat; @@ -88,9 +87,17 @@ public class CSVIntermediateDataFormat extends IntermediateDataFormat<String> { // ISO-8859-1 is an 8-bit codec that is supported in every java implementation. static final String BYTE_FIELD_CHARSET = "ISO-8859-1"; // http://www.joda.org/joda-time/key_format.html provides details on the formatter token - static final DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSSSSSZ"); + // can have fraction and or timezone + static final DateTimeFormatter dtfWithFractionAndTimeZone = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSSZ"); + static final DateTimeFormatter dtfWithNoFractionAndTimeZone = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); + static final DateTimeFormatter dtfWithFractionNoTimeZone = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS"); + static final DateTimeFormatter dtfWithNoFractionWithTimeZone = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ssZ"); + + // only date, no time static final DateTimeFormatter df = DateTimeFormat.forPattern("yyyy-MM-dd"); - static final DateTimeFormatter tf = DateTimeFormat.forPattern("HH:mm:ss.SSSSSS"); + // time with fraction only, no timezone + static final DateTimeFormatter tfWithFraction = DateTimeFormat.forPattern("HH:mm:ss.SSSSSS"); + static final DateTimeFormatter tfWithNoFraction = DateTimeFormat.forPattern("HH:mm:ss"); private final List<Integer> stringTypeColumnIndices = new ArrayList<Integer>(); private final List<Integer> bitTypeColumnIndices = new ArrayList<Integer>(); @@ -290,11 +297,7 @@ public class CSVIntermediateDataFormat extends IntermediateDataFormat<String> { returnValue = LocalTime.parse(removeQuotes(fieldString)); break; case DATE_TIME: - // A datetime string with a space as date-time separator will not be - // parsed expectedly. The expected separator is "T". See also: - // https://github.com/JodaOrg/joda-time/issues/11 - String dateTime = removeQuotes(fieldString).replace(" ", "T"); - returnValue = DateTime.parse(dateTime); + returnValue = parseDateTime(fieldString, column); break; case BIT: if ((TRUE_BIT_SET.contains(fieldString)) || (FALSE_BIT_SET.contains(fieldString))) { @@ -318,6 +321,27 @@ public class CSVIntermediateDataFormat extends IntermediateDataFormat<String> { return returnValue; } + private Object parseDateTime(String fieldString, Column column) { + Object returnValue; + String dateTime = removeQuotes(fieldString); + org.apache.sqoop.schema.type.DateTime col = ((org.apache.sqoop.schema.type.DateTime) column); + if (col.hasFraction() && col.hasTimezone()) { + // After calling withOffsetParsed method, a string + // '2004-06-09T10:20:30-08:00' will create a datetime with a zone of + // -08:00 (a fixed zone, with no daylight savings rules) + returnValue = dtfWithFractionAndTimeZone.withOffsetParsed().parseDateTime(dateTime); + } else if (col.hasFraction() && !col.hasTimezone()) { + // we use local date time explicitly to not include the timezone + returnValue = dtfWithFractionNoTimeZone.parseLocalDateTime(dateTime); + } else if (col.hasTimezone()) { + returnValue = dtfWithNoFractionWithTimeZone.withOffsetParsed().parseDateTime(dateTime); + } else { + // we use local date time explicitly to not include the timezone + returnValue = dtfWithNoFractionAndTimeZone.parseLocalDateTime(dateTime); + } + return returnValue; + } + private Object[] parseListElementFromJSON(String fieldString) { JSONArray array = null; @@ -454,10 +478,14 @@ public class CSVIntermediateDataFormat extends IntermediateDataFormat<String> { objectArray[i] = escapeString((String) objectArray[i]); } for (int i : dateTimeTypeColumnIndices) { + Column col = columnArray[i]; if (objectArray[i] instanceof org.joda.time.DateTime) { - objectArray[i] = encloseWithQuote(dtf.print((org.joda.time.DateTime) objectArray[i])); + org.joda.time.DateTime dateTime = (org.joda.time.DateTime) objectArray[i]; + // check for fraction and time zone and then use the right formatter + formatDateTime(objectArray, i, col, dateTime); } else if (objectArray[i] instanceof org.joda.time.LocalDateTime) { - objectArray[i] = encloseWithQuote(dtf.print((org.joda.time.LocalDateTime) objectArray[i])); + org.joda.time.LocalDateTime localDateTime = (org.joda.time.LocalDateTime) objectArray[i]; + formatLocalDateTime(objectArray, i, col, localDateTime); } } for (int i : dateTypeColumnIndices) { @@ -465,8 +493,12 @@ public class CSVIntermediateDataFormat extends IntermediateDataFormat<String> { objectArray[i] = encloseWithQuote(df.print(date)); } for (int i : timeColumnIndices) { - org.joda.time.LocalTime date = (org.joda.time.LocalTime) objectArray[i]; - objectArray[i] = encloseWithQuote(tf.print(date)); + Column col = columnArray[i]; + if (((org.apache.sqoop.schema.type.Time) col).hasFraction()) { + objectArray[i] = encloseWithQuote(tfWithFraction.print((org.joda.time.LocalTime) objectArray[i])); + } else { + objectArray[i] = encloseWithQuote(tfWithNoFraction.print((org.joda.time.LocalTime) objectArray[i])); + } } for (int i : byteTypeColumnIndices) { objectArray[i] = escapeByteArrays((byte[]) objectArray[i]); @@ -479,6 +511,28 @@ public class CSVIntermediateDataFormat extends IntermediateDataFormat<String> { } } + private void formatLocalDateTime(Object[] objectArray, int i, Column col, org.joda.time.LocalDateTime localDateTime) { + org.apache.sqoop.schema.type.DateTime column = (org.apache.sqoop.schema.type.DateTime) col; + if (column.hasFraction()) { + objectArray[i] = encloseWithQuote(dtfWithFractionNoTimeZone.print(localDateTime)); + } else { + objectArray[i] = encloseWithQuote(dtfWithNoFractionAndTimeZone.print(localDateTime)); + } + } + + private void formatDateTime(Object[] objectArray, int i, Column col, org.joda.time.DateTime dateTime) { + org.apache.sqoop.schema.type.DateTime column = (org.apache.sqoop.schema.type.DateTime) col; + if (column.hasFraction() && column.hasTimezone()) { + objectArray[i] = encloseWithQuote(dtfWithFractionAndTimeZone.print(dateTime)); + } else if (column.hasFraction() && !column.hasTimezone()) { + objectArray[i] = encloseWithQuote(dtfWithFractionNoTimeZone.print(dateTime)); + } else if (column.hasTimezone()) { + objectArray[i] = encloseWithQuote(dtfWithNoFractionWithTimeZone.print(dateTime)); + } else { + objectArray[i] = encloseWithQuote(dtfWithNoFractionAndTimeZone.print(dateTime)); + } + } + @SuppressWarnings("unchecked") private String encodeMap(Map<Object, Object> map, Column column) { JSONObject object = new JSONObject(); http://git-wip-us.apache.org/repos/asf/sqoop/blob/fdc04695/connector/connector-sdk/src/test/java/org/apache/sqoop/connector/idf/TestCSVIntermediateDataFormat.java ---------------------------------------------------------------------- diff --git a/connector/connector-sdk/src/test/java/org/apache/sqoop/connector/idf/TestCSVIntermediateDataFormat.java b/connector/connector-sdk/src/test/java/org/apache/sqoop/connector/idf/TestCSVIntermediateDataFormat.java index e66c897..3e7c0d1 100644 --- a/connector/connector-sdk/src/test/java/org/apache/sqoop/connector/idf/TestCSVIntermediateDataFormat.java +++ b/connector/connector-sdk/src/test/java/org/apache/sqoop/connector/idf/TestCSVIntermediateDataFormat.java @@ -42,6 +42,7 @@ import org.apache.sqoop.schema.type.DateTime; import org.apache.sqoop.schema.type.FixedPoint; import org.apache.sqoop.schema.type.Text; import org.apache.sqoop.schema.type.Time; +import org.joda.time.DateTimeZone; import org.junit.Before; import org.junit.Test; @@ -278,7 +279,7 @@ public class TestCSVIntermediateDataFormat { @Test public void testTimeWithCSVTextInCSVTextOut() { Schema schema = new Schema("test"); - schema.addColumn(new Time("1")); + schema.addColumn(new Time("1", false)); dataFormat.setSchema(schema); dataFormat.setTextData("'12:00:00'"); assertEquals("'12:00:00'", dataFormat.getTextData()); @@ -287,7 +288,7 @@ public class TestCSVIntermediateDataFormat { @Test public void testTimeWithCSVTextInObjectArrayOut() { Schema schema = new Schema("test"); - schema.addColumn(new Time("1")); + schema.addColumn(new Time("1", false)); dataFormat.setSchema(schema); dataFormat.setTextData("'12:59:59'"); org.joda.time.LocalTime time = new org.joda.time.LocalTime(12, 59, 59); @@ -297,7 +298,7 @@ public class TestCSVIntermediateDataFormat { @Test public void testTimeWithObjectArrayInCSVTextOut() { Schema schema = new Schema("test"); - schema.addColumn(new Time("1")).addColumn(new Text("2")); + schema.addColumn(new Time("1", true)).addColumn(new Text("2")); dataFormat.setSchema(schema); org.joda.time.LocalTime time = new org.joda.time.LocalTime(15, 0, 0); Object[] in = { time, "test" }; @@ -308,7 +309,7 @@ public class TestCSVIntermediateDataFormat { @Test public void testTimeWithObjectArrayInObjectArrayOut() { Schema schema = new Schema("test"); - schema.addColumn(new Time("1")); + schema.addColumn(new Time("1", true)); dataFormat.setSchema(schema); org.joda.time.LocalTime time = new org.joda.time.LocalTime(2, 23, 33); Object[] in = { time }; @@ -364,7 +365,7 @@ public class TestCSVIntermediateDataFormat { @Test public void testDateTimeWithCSVTextInCSVTextOut() { Schema schema = new Schema("test"); - schema.addColumn(new DateTime("1")); + schema.addColumn(new DateTime("1", false, false)); dataFormat.setSchema(schema); dataFormat.setTextData("'2014-10-01 12:00:00'"); @@ -372,64 +373,124 @@ public class TestCSVIntermediateDataFormat { } @Test - public void testDateTimeWithMilliSecsWithCSVTextInCSVTextOut() { + public void testDateTimeWithFractionNoTimezoneWithCSVTextInCSVTextOut() { Schema schema = new Schema("test"); - schema.addColumn(new DateTime("1")); + schema.addColumn(new DateTime("1", true, false)); dataFormat.setSchema(schema); - dataFormat.setTextData("'2014-10-01 12:00:00.000'"); assertEquals("'2014-10-01 12:00:00.000'", dataFormat.getTextData()); } + public void testDateTimeNoFractionNoTimezoneWithCSVTextInObjectArrayOut() { + Schema schema = new Schema("test"); + schema.addColumn(new DateTime("1", false, false)); + dataFormat.setSchema(schema); + dataFormat.setTextData("'2014-10-01 12:00:00'"); + // NOTE: string representation will have the T added, it is an + // implementation quirk of using JODA + assertEquals("2014-10-01T12:00:00", dataFormat.getObjectData()[0].toString()); + } + @Test - public void testDateTimeWithCSVTextInObjectArrayOut() { + public void testDateTimeWithFractionNoTimezoneWithCSVTextInObjectArrayOut() { Schema schema = new Schema("test"); - schema.addColumn(new DateTime("1")); + schema.addColumn(new DateTime("1", true, false)); dataFormat.setSchema(schema); + dataFormat.setTextData("'2014-10-01 12:00:00.000'"); + // NOTE: string representation will have the T added, it is an + // implementation quirk of using JODA + assertEquals("2014-10-01T12:00:00.000", dataFormat.getObjectData()[0].toString()); + } - dataFormat.setTextData("'2014-10-01 12:00:00'"); - assertEquals("2014-10-01T12:00:00.000-07:00", dataFormat.getObjectData()[0].toString()); + // since date is not quoted + @Test(expected = Exception.class) + public void testDateTimeNoQuotesWithFractionTimezoneWithCSVTextInObjectArrayOut() { + Schema schema = new Schema("test"); + schema.addColumn(new DateTime("1", true, true)); + dataFormat.setSchema(schema); + DateTimeZone zone = DateTimeZone.forID("America/New_York"); + org.joda.time.DateTime dateTime = new org.joda.time.DateTime(zone); + dataFormat.setTextData(dateTime.toString()); + dataFormat.getObjectData()[0].toString(); + } + + // since date is not in expected format + @Test(expected = Exception.class) + public void testDateTimeIncorrectFormatWithCSVTextInObjectArrayOut() { + Schema schema = new Schema("test"); + schema.addColumn(new DateTime("1", true, true)); + dataFormat.setSchema(schema); + dataFormat.setTextData("'2014-3310-01 12:00:00.000'"); + dataFormat.getObjectData()[0].toString(); } @Test - public void testDateTimeWithObjectInCSVTextOut() { + public void testCurrentDateTime2WithFractionNoTimezoneWithCSVTextInObjectArrayOut() { Schema schema = new Schema("test"); - schema.addColumn(new DateTime("1")); + schema.addColumn(new DateTime("1", true, false)); dataFormat.setSchema(schema); - org.joda.time.DateTime dateTime = new org.joda.time.DateTime(2014, 10, 01, 12, 0, 0, 1); + // current date time + org.joda.time.DateTime dateTime = new org.joda.time.DateTime(); + String dateTimeString = CSVIntermediateDataFormat.dtfWithFractionNoTimeZone.print(dateTime); + dataFormat.setTextData("'" + dateTimeString + "'"); + assertEquals(dateTimeString.replace(" ", "T"), dataFormat.getObjectData()[0].toString()); + } + + @Test + public void testDateTimeWithFractionAndTimeZoneWithCSVTextInObjectArrayOut() { + Schema schema = new Schema("test"); + schema.addColumn(new DateTime("1", true, true)); + dataFormat.setSchema(schema); + dataFormat.setTextData("'2014-10-01 12:00:00.000-0400'"); + // NOTE: string representation will have the T added, it is an + // implementation quirk of using JODA + assertEquals("2014-10-01T12:00:00.000-04:00", dataFormat.getObjectData()[0].toString()); + } + + @Test + public void testDateTimeWithFractionAndTimeZoneObjectInCSVTextOut() { + Schema schema = new Schema("test"); + schema.addColumn(new DateTime("1", true, true)); + dataFormat.setSchema(schema); + DateTimeZone zone = DateTimeZone.forID("America/New_York"); + org.joda.time.DateTime dateTime = new org.joda.time.DateTime(2014, 10, 01, 12, 0, 0, 1, zone); Object[] in = { dateTime }; dataFormat.setObjectData(in); // Note: DateTime has the timezone info - assertEquals("'2014-10-01 12:00:00.001000-0700'", dataFormat.getTextData()); + assertEquals("'2014-10-01 12:00:00.001-0400'", dataFormat.getTextData()); } @Test public void testLocalDateTimeWithObjectInCSVTextOut() { Schema schema = new Schema("test"); - schema.addColumn(new DateTime("1")); + schema.addColumn(new DateTime("1", true, false)); dataFormat.setSchema(schema); org.joda.time.LocalDateTime dateTime = new org.joda.time.LocalDateTime(2014, 10, 01, 12, 0, 0, 2); Object[] in = { dateTime }; dataFormat.setObjectData(in); - // Note: LocalDateTime is missing the timezone info - assertEquals("'2014-10-01 12:00:00.002000'", dataFormat.getTextData()); + // Note: LocalDateTime will not have the timezone info + assertEquals("'2014-10-01 12:00:00.002'", dataFormat.getTextData()); } @Test - public void testDateTimePrecisionWithCSVTextInObjectArrayOut() { + public void testDateTimeFractionAndTimezoneWithCSVTextInObjectArrayOut() { Schema schema = new Schema("test"); - schema.addColumn(new DateTime("1")); + schema.addColumn(new DateTime("1", true, true)); dataFormat.setSchema(schema); - dataFormat.setTextData("'2014-10-01 12:00:00.000'"); - org.joda.time.DateTime dateTime = new org.joda.time.DateTime(2014, 10, 01, 12, 0, 0, 0); - assertEquals(dateTime, dataFormat.getObjectData()[0]); + dataFormat.setTextData("'2014-10-01 12:00:00.000-04:00'"); + DateTimeZone zone = DateTimeZone.forID("America/New_York"); + org.joda.time.DateTime edateTime = new org.joda.time.DateTime(2014, 10, 01, 12, 0, 0, 0, zone); + org.joda.time.DateTime dateTime = (org.joda.time.DateTime) dataFormat.getObjectData()[0]; + assertEquals(edateTime.toString(), dateTime.toString()); // NOTE: string representation will have the T added, it is an // implementation quirk of using JODA - assertEquals("2014-10-01T12:00:00.000-07:00", dataFormat.getObjectData()[0].toString()); + assertEquals("2014-10-01T12:00:00.000-04:00", dataFormat.getObjectData()[0].toString()); } // **************test cases for BIT******************* + // **************test cases for BIT******************* + @Test public void testBitTrueFalseWithCSVTextInAndCSVTextOut() { Schema schema = new Schema("test");
