You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2014/05/22 03:33:42 UTC
[6/6] git commit: TAJO-825: Datetime type refactoring. (Hyoungjun Kim
via jihoon)
TAJO-825: Datetime type refactoring. (Hyoungjun Kim via jihoon)
Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/526dca28
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/526dca28
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/526dca28
Branch: refs/heads/master
Commit: 526dca28b50d10973735accc87adc787de2db09d
Parents: 98f142c
Author: Jihoon Son <ji...@apache.org>
Authored: Thu May 22 10:32:26 2014 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Thu May 22 10:32:26 2014 +0900
----------------------------------------------------------------------
CHANGES | 2 +
.../org/apache/tajo/catalog/CatalogServer.java | 8 +-
.../org/apache/tajo/jdbc/TajoResultSetBase.java | 23 +-
.../java/org/apache/tajo/conf/TajoConf.java | 80 +-
.../java/org/apache/tajo/datum/DateDatum.java | 231 +-
.../org/apache/tajo/datum/DatumFactory.java | 69 +-
.../java/org/apache/tajo/datum/Float4Datum.java | 12 +-
.../java/org/apache/tajo/datum/Float8Datum.java | 12 +-
.../java/org/apache/tajo/datum/Int2Datum.java | 12 +-
.../java/org/apache/tajo/datum/Int4Datum.java | 12 +-
.../java/org/apache/tajo/datum/Int8Datum.java | 12 +-
.../org/apache/tajo/datum/IntervalDatum.java | 43 +-
.../java/org/apache/tajo/datum/TimeDatum.java | 124 +-
.../org/apache/tajo/datum/TimestampDatum.java | 255 ++-
.../exception/ValueOutOfRangeException.java | 25 +
.../java/org/apache/tajo/json/DatumAdapter.java | 5 +-
.../org/apache/tajo/util/TimeStampUtil.java | 66 -
.../tajo/util/datetime/DateTimeConstants.java | 631 ++++++
.../tajo/util/datetime/DateTimeFormat.java | 2143 ++++++++++++++++++
.../apache/tajo/util/datetime/DateTimeUtil.java | 2102 +++++++++++++++++
.../org/apache/tajo/util/datetime/TimeMeta.java | 154 ++
.../org/apache/tajo/datum/TestDateDatum.java | 7 -
.../apache/tajo/datum/TestIntervalDatum.java | 77 +-
.../org/apache/tajo/datum/TestTimeDatum.java | 7 -
.../apache/tajo/datum/TestTimestampDatum.java | 121 +-
.../apache/tajo/util/TestDateTimeFormat.java | 158 ++
.../org/apache/tajo/util/TestDateTimeUtil.java | 439 ++++
.../org/apache/tajo/util/TestTimeStampUtil.java | 75 -
.../function/datetime/DatePartFromDate.java | 9 +-
.../function/datetime/DatePartFromTime.java | 43 +-
.../datetime/DatePartFromTimestamp.java | 90 +-
.../datetime/DateTimePartFromUnixTimeStamp.java | 166 +-
.../function/datetime/ToCharTimestamp.java | 28 +-
.../tajo/engine/function/datetime/ToDate.java | 23 +-
.../engine/function/datetime/ToTimestamp.java | 55 -
.../function/datetime/ToTimestampInt.java | 55 +
.../function/datetime/ToTimestampText.java | 62 +
.../tajo/engine/planner/ExprAnnotator.java | 43 +-
.../engine/planner/UniformRangePartition.java | 4 +-
.../apache/tajo/engine/eval/ExprTestBase.java | 21 +-
.../tajo/engine/eval/TestIntervalType.java | 62 +-
.../tajo/engine/eval/TestSQLDateTimeTypes.java | 16 +-
.../tajo/engine/eval/TestSQLExpression.java | 28 +-
.../engine/function/TestDateTimeFunctions.java | 164 +-
.../apache/tajo/engine/query/TestSortQuery.java | 21 +-
.../storage/TextSerializerDeserializer.java | 15 +-
.../org/apache/tajo/storage/TestStorages.java | 2 +-
47 files changed, 6901 insertions(+), 911 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 8281614..5645b13 100644
--- a/CHANGES
+++ b/CHANGES
@@ -15,6 +15,8 @@ Release 0.9.0 - unreleased
IMPROVEMENT
+ TAJO-825: Datetime type refactoring. (Hyoungjun Kim via jihoon)
+
TAJO-811: add simple fifo scheduler support. (jinho)
TAJO-801: Multiple distinct should be supported. (Hyoungjun Kim via hyunsik)
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
index c0f6d36..4e391aa 100644
--- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
+++ b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
@@ -864,10 +864,12 @@ public class CatalogServer extends AbstractService {
* to implement compareTo so decided to take the shortcut.
*
* */
- for (FunctionDescProto existing : functions.get(signature)) {
- if (existing.getParameterTypesList() != null &&
+ if (functions.containsKey(signature)) {
+ for (FunctionDescProto existing : functions.get(signature)) {
+ if (existing.getParameterTypesList() != null &&
CatalogUtil.isMatchedFunction(existing.getParameterTypesList(), params)) {
- return existing;
+ return existing;
+ }
}
}
return null;
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java b/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java
index 4c307b3..60eb2f1 100644
--- a/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java
+++ b/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java
@@ -20,8 +20,11 @@ package org.apache.tajo.jdbc;
import org.apache.tajo.catalog.Schema;
import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.datum.Datum;
import org.apache.tajo.datum.NullDatum;
+import org.apache.tajo.datum.TimeDatum;
+import org.apache.tajo.datum.TimestampDatum;
import org.apache.tajo.storage.Tuple;
import java.io.IOException;
@@ -178,6 +181,12 @@ public abstract class TajoResultSetBase implements ResultSet {
case FLOAT4: return d.asFloat4();
case FLOAT8: return d.asFloat8();
case NUMERIC: return d.asFloat8();
+ case TIME: {
+ return ((TimeDatum)d).asChars(TajoConf.getCurrentTimeZone(), false);
+ }
+ case TIMESTAMP: {
+ return ((TimestampDatum)d).asChars(TajoConf.getCurrentTimeZone(), false);
+ }
default: return d.asChars();
}
}
@@ -212,7 +221,19 @@ public abstract class TajoResultSetBase implements ResultSet {
public String getString(String name) throws SQLException {
Datum datum = cur.get(findColumn(name));
handleNull(datum);
- return datum.asChars();
+
+ TajoDataTypes.Type dataType = datum.type();
+
+ switch(dataType) {
+ case TIME: {
+ return ((TimeDatum)datum).asChars(TajoConf.getCurrentTimeZone(), false);
+ }
+ case TIMESTAMP: {
+ return ((TimestampDatum)datum).asChars(TajoConf.getCurrentTimeZone(), false);
+ }
+ default :
+ return datum.asChars();
+ }
}
@Override
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
index 6580525..b62b246 100644
--- a/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
+++ b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
@@ -25,14 +25,24 @@ import org.apache.hadoop.fs.Path;
import org.apache.tajo.TajoConstants;
import org.apache.tajo.util.NetUtils;
import org.apache.tajo.util.TUtil;
+import org.apache.tajo.util.datetime.DateTimeConstants;
import java.io.IOException;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.util.Map;
+import java.util.TimeZone;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
public class TajoConf extends Configuration {
+ private static TimeZone CURRENT_TIMEZONE;
+ private static int DATE_ORDER = -1;
+ private static final ReentrantReadWriteLock confLock = new ReentrantReadWriteLock();
+ private static final Lock writeLock = confLock.writeLock();
+ private static final Lock readLock = confLock.readLock();
+
static {
Configuration.addDefaultResource("catalog-default.xml");
Configuration.addDefaultResource("catalog-site.xml");
@@ -40,6 +50,8 @@ public class TajoConf extends Configuration {
Configuration.addDefaultResource("storage-site.xml");
Configuration.addDefaultResource("tajo-default.xml");
Configuration.addDefaultResource("tajo-site.xml");
+
+ confStaticInit();
}
private static final String EMPTY_VALUE = "";
@@ -59,6 +71,68 @@ public class TajoConf extends Configuration {
addResource(path);
}
+ private static void confStaticInit() {
+ TimeZone.setDefault(getCurrentTimeZone());
+ getDateOrder();
+ }
+
+ public static TimeZone getCurrentTimeZone() {
+ writeLock.lock();
+ try {
+ if (CURRENT_TIMEZONE == null) {
+ TajoConf tajoConf = new TajoConf();
+ CURRENT_TIMEZONE = TimeZone.getTimeZone(tajoConf.getVar(ConfVars.TAJO_TIMEZONE));
+ }
+ return CURRENT_TIMEZONE;
+ } finally {
+ writeLock.unlock();
+ }
+ }
+
+ public static TimeZone setCurrentTimeZone(TimeZone timeZone) {
+ readLock.lock();
+ try {
+ TimeZone oldTimeZone = CURRENT_TIMEZONE;
+ CURRENT_TIMEZONE = timeZone;
+ return oldTimeZone;
+ } finally {
+ readLock.unlock();
+ }
+ }
+
+ public static int getDateOrder() {
+ writeLock.lock();
+ try {
+ if (DATE_ORDER < 0) {
+ TajoConf tajoConf = new TajoConf();
+ String dateOrder = tajoConf.getVar(ConfVars.TAJO_DATE_ORDER);
+ if ("YMD".equals(dateOrder)) {
+ DATE_ORDER = DateTimeConstants.DATEORDER_YMD;
+ } else if ("DMY".equals(dateOrder)) {
+ DATE_ORDER = DateTimeConstants.DATEORDER_DMY;
+ } else if ("MDY".equals(dateOrder)) {
+ DATE_ORDER = DateTimeConstants.DATEORDER_MDY;
+ } else {
+ DATE_ORDER = DateTimeConstants.DATEORDER_YMD;
+ }
+ }
+ return DATE_ORDER;
+ } finally {
+ writeLock.unlock();
+ }
+ }
+
+ public static int setDateOrder(int dateOrder) {
+ readLock.lock();
+ try {
+ int oldDateOrder = DATE_ORDER;
+ DATE_ORDER = dateOrder;
+ return oldDateOrder;
+ } finally {
+ readLock.unlock();
+ }
+ }
+
public static enum ConfVars {
//////////////////////////////////
@@ -249,7 +323,11 @@ public class TajoConf extends Configuration {
CLI_PRINT_PAUSE_NUM_RECORDS("tajo.cli.print.pause.num.records", 100),
CLI_PRINT_PAUSE("tajo.cli.print.pause", true),
CLI_PRINT_ERROR_TRACE("tajo.cli.print.error.trace", true),
- CLI_OUTPUT_FORMATTER_CLASS("tajo.cli.output.formatter", "org.apache.tajo.cli.DefaultTajoCliOutputFormatter");
+ CLI_OUTPUT_FORMATTER_CLASS("tajo.cli.output.formatter", "org.apache.tajo.cli.DefaultTajoCliOutputFormatter"),
+
+ //TIME & DATE
+ TAJO_TIMEZONE("tajo.timezone", System.getProperty("user.timezone")),
+ TAJO_DATE_ORDER("tajo.date.order", "YMD")
;
public final String varname;
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
index ad68303..10f7077 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
@@ -19,80 +19,83 @@
package org.apache.tajo.datum;
import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.common.TajoDataTypes.Type;
import org.apache.tajo.exception.InvalidCastException;
import org.apache.tajo.exception.InvalidOperationException;
import org.apache.tajo.util.Bytes;
-import org.joda.time.*;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
+import org.apache.tajo.util.datetime.DateTimeConstants.DateStyle;
+import org.apache.tajo.util.datetime.DateTimeFormat;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
public class DateDatum extends Datum {
public static final int SIZE = 4;
- /** ISO 8601/SQL standard format - ex) 1997-12-17 */
- public static final String DEFAULT_FORMAT_STRING = "yyyy-MM-dd";
- private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormat.forPattern(DEFAULT_FORMAT_STRING);
- private final LocalDate date;
+
+ private int year;
+ private int monthOfYear;
+ private int dayOfMonth;
public DateDatum(int value) {
super(TajoDataTypes.Type.DATE);
- date = decode(value);
- }
+ TimeMeta tm = new TimeMeta();
+ DateTimeUtil.j2date(value, tm);
- public DateDatum(int year, int month, int day) {
- super(TajoDataTypes.Type.DATE);
- date = new LocalDate(year, month, day);
+ year = tm.years;
+ monthOfYear = tm.monthOfYear;
+ dayOfMonth = tm.dayOfMonth;
}
- public DateDatum(String dateStr) {
- super(TajoDataTypes.Type.DATE);
- this.date = LocalDate.parse(dateStr, DEFAULT_FORMATTER);
- }
-
- public DateDatum(LocalDate date) {
- super(TajoDataTypes.Type.DATE);
- this.date = date;
+ public TimeMeta toTimeMeta() {
+ TimeMeta tm = new TimeMeta();
+ DateTimeUtil.j2date(DateTimeUtil.date2j(year, monthOfYear, dayOfMonth), tm);
+ return tm;
}
- public LocalDate getDate() {
- //LocalDate is immutable
- return date;
+ public int getCenturyOfEra() {
+ TimeMeta tm = toTimeMeta();
+ return tm.getCenturyOfEra();
}
- public DateDatum(byte [] bytes) {
- this(Bytes.toInt(bytes));
+ public int getYear() {
+ TimeMeta tm = toTimeMeta();
+ return tm.years;
}
- public int getCenturyOfEra() {
- return date.getCenturyOfEra();
+ public int getWeekyear() {
+ TimeMeta tm = toTimeMeta();
+ return tm.getWeekyear();
}
- public int getYear() {
- return date.getYear();
+ public int getMonthOfYear() {
+ TimeMeta tm = toTimeMeta();
+ return tm.monthOfYear;
}
- public int getMonthOfYear() {
- return date.getMonthOfYear();
+ public int getDayOfYear() {
+ TimeMeta tm = toTimeMeta();
+ return tm.getDayOfYear();
}
- public int getWeekyear() {
- return date.getWeekyear();
+ public int getDayOfWeek() {
+ TimeMeta tm = toTimeMeta();
+ return tm.getDayOfWeek();
}
- public int getWeekOfWeekyear() {
- return date.getWeekOfWeekyear();
+ public int getISODayOfWeek() {
+ TimeMeta tm = toTimeMeta();
+ return tm.getISODayOfWeek();
}
- public int getDayOfWeek() {
- return date.getDayOfWeek();
+ public int getWeekOfYear() {
+ TimeMeta tm = toTimeMeta();
+ return tm.getWeekOfYear();
}
public int getDayOfMonth() {
- return date.getDayOfMonth();
+ TimeMeta tm = toTimeMeta();
+ return tm.dayOfMonth;
}
- public int getDayOfYear() {
- return date.getDayOfYear();
- }
public String toString() {
return asChars();
@@ -104,19 +107,31 @@ public class DateDatum extends Datum {
case INT4:
case INT8:
case FLOAT4:
- case FLOAT8:
- return new DateDatum(date.plusDays(datum.asInt2()));
- case INTERVAL:
- IntervalDatum interval = (IntervalDatum)datum;
- LocalDate localDate;
+ case FLOAT8: {
+ TimeMeta tm = toTimeMeta();
+ tm.plusDays(datum.asInt4());
+ return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
+ }
+ case INTERVAL: {
+ IntervalDatum interval = (IntervalDatum) datum;
+ TimeMeta tm = toTimeMeta();
+ tm.plusMillis(interval.getMilliSeconds());
if (interval.getMonths() > 0) {
- localDate = date.plusMonths(interval.getMonths());
- } else {
- localDate = date;
+ tm.plusMonths(interval.getMonths());
}
- return new TimestampDatum(localDate.toDateTimeAtStartOfDay().getMillis() + interval.getMilliSeconds());
- case TIME:
- return new TimestampDatum(createDateTime(date, ((TimeDatum)datum).getTime(), true));
+ DateTimeUtil.toUTCTimezone(tm);
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+ }
+ case TIME: {
+ TimeMeta tm1 = toTimeMeta();
+
+ TimeMeta tm2 = ((TimeDatum)datum).toTimeMeta();
+ DateTimeUtil.toUserTimezone(tm2); //TimeDatum is UTC
+
+ tm1.plusTime(DateTimeUtil.toTime(tm2));
+ DateTimeUtil.toUTCTimezone(tm1);
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1));
+ }
default:
throw new InvalidOperationException(datum.type());
}
@@ -128,68 +143,51 @@ public class DateDatum extends Datum {
case INT4:
case INT8:
case FLOAT4:
- case FLOAT8:
- return new DateDatum(date.minusDays(datum.asInt2()));
- case INTERVAL:
- IntervalDatum interval = (IntervalDatum)datum;
- LocalDate localDate;
+ case FLOAT8: {
+ TimeMeta tm = toTimeMeta();
+ tm.plusDays(0 - datum.asInt4());
+ return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
+ }
+ case INTERVAL: {
+ IntervalDatum interval = (IntervalDatum) datum;
+ TimeMeta tm = toTimeMeta();
if (interval.getMonths() > 0) {
- localDate = date.minusMonths(interval.getMonths());
- } else {
- localDate = date;
+ tm.plusMonths(0 - interval.getMonths());
}
- return new TimestampDatum(localDate.toDateTimeAtStartOfDay().getMillis() - interval.getMilliSeconds());
- case TIME:
- return new TimestampDatum(createDateTime(date, ((TimeDatum)datum).getTime(), false));
- case DATE:
- return new Int4Datum(Days.daysBetween(((DateDatum)datum).date, date).getDays());
+ tm.plusMillis(0 - interval.getMilliSeconds());
+ DateTimeUtil.toUTCTimezone(tm);
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+ }
+ case TIME: {
+ TimeMeta tm1 = toTimeMeta();
+
+ TimeMeta tm2 = ((TimeDatum)datum).toTimeMeta();
+ DateTimeUtil.toUserTimezone(tm2); //TimeDatum is UTC
+
+ tm1.plusTime(0 - DateTimeUtil.toTime(tm2));
+ DateTimeUtil.toUTCTimezone(tm1);
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1));
+ }
+ case DATE: {
+ TimeMeta tm1 = toTimeMeta();
+ TimeMeta tm2 = ((DateDatum) datum).toTimeMeta();
+
+ int day1 = DateTimeUtil.date2j(tm1.years, tm1.monthOfYear, tm1.dayOfMonth);
+ int day2 = DateTimeUtil.date2j(tm2.years, tm2.monthOfYear, tm2.dayOfMonth);
+ return new Int4Datum(day1 - day2);
+ }
default:
throw new InvalidOperationException(datum.type());
}
}
- public static DateTime createDateTime(LocalDate date, LocalTime time, boolean plus) {
- //TODO create too many temporary instance. This must be improved.
- DateTime dateTime = new DateTime(date.toDate().getTime());
- if (plus) {
- return dateTime
- .plusHours(time.getHourOfDay())
- .plusMinutes(time.getMinuteOfHour())
- .plusSeconds(time.getSecondOfMinute())
- .plusMillis(time.getMillisOfSecond());
- } else {
- return dateTime
- .minusHours(time.getHourOfDay())
- .minusMinutes(time.getMinuteOfHour())
- .minusSeconds(time.getSecondOfMinute())
- .minusMillis(time.getMillisOfSecond());
- }
- }
-
@Override
public int asInt4() {
return encode();
}
- private static LocalDate decode(int val) {
- int year = (val >> 16);
- int monthOfYear = (0xFFFF & val) >> 8;
- int dayOfMonth = (0x00FF & val);
- return new LocalDate(year, monthOfYear, dayOfMonth);
- }
-
- /**
- * Year MonthOfYear DayOfMonth
- * 31-16 15-8 7 - 0
- *
- * 0xFF 0xFF 0xFF 0xFF
- */
private int encode() {
- int instance = 0;
- instance |= (date.getYear() << 16); // 1970 ~ : 2 bytes
- instance |= (date.getMonthOfYear() << 8); // 1 - 12 : 1 byte
- instance |= (date.getDayOfMonth()); // 0 - 31 : 1 byte
- return instance;
+ return DateTimeUtil.date2j(year, monthOfYear, dayOfMonth);
}
@Override
@@ -209,11 +207,13 @@ public class DateDatum extends Datum {
@Override
public String asChars() {
- return date.toString(DEFAULT_FORMATTER);
+ TimeMeta tm = toTimeMeta();
+ return DateTimeUtil.encodeDate(tm, DateStyle.ISO_DATES);
}
public String toChars(String format) {
- return date.toString(format);
+ TimeMeta tm = toTimeMeta();
+ return DateTimeFormat.to_char(tm, format);
}
@Override
@@ -228,8 +228,8 @@ public class DateDatum extends Datum {
@Override
public Datum equalsTo(Datum datum) {
- if (datum.type() == TajoDataTypes.Type.TIME) {
- return DatumFactory.createBool(date.equals(((DateDatum) datum).date));
+ if (datum.type() == Type.DATE) {
+ return DatumFactory.createBool(equals(datum));
} else if (datum.isNull()) {
return datum;
} else {
@@ -240,7 +240,17 @@ public class DateDatum extends Datum {
@Override
public int compareTo(Datum datum) {
if (datum.type() == TajoDataTypes.Type.DATE) {
- return date.compareTo(((DateDatum)datum).date);
+ DateDatum another = (DateDatum) datum;
+ int compareResult = (year < another.year) ? -1 : ((year == another.year) ? 0 : 1);
+ if (compareResult != 0) {
+ return compareResult;
+ }
+ compareResult = (monthOfYear < another.monthOfYear) ? -1 : ((monthOfYear == another.monthOfYear) ? 0 : 1);
+ if (compareResult != 0) {
+ return compareResult;
+ }
+
+ return (dayOfMonth < another.dayOfMonth) ? -1 : ((dayOfMonth == another.dayOfMonth) ? 0 : 1);
} else if (datum instanceof NullDatum || datum.isNull()) {
return -1;
} else {
@@ -251,7 +261,7 @@ public class DateDatum extends Datum {
public boolean equals(Object obj) {
if (obj instanceof DateDatum) {
DateDatum another = (DateDatum) obj;
- return date.isEqual(another.date);
+ return year == another.year && monthOfYear == another.monthOfYear && dayOfMonth == another.dayOfMonth;
} else {
return false;
}
@@ -259,6 +269,11 @@ public class DateDatum extends Datum {
@Override
public int hashCode() {
- return date.hashCode();
+ int total = 157;
+ total = 23 * total + year;
+ total = 23 * total + monthOfYear;
+ total = 23 * total + dayOfMonth;
+
+ return total;
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
index 5ce36e5..7d6ef18 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
@@ -23,9 +23,9 @@ import org.apache.tajo.common.TajoDataTypes.DataType;
import org.apache.tajo.common.TajoDataTypes.Type;
import org.apache.tajo.exception.InvalidCastException;
import org.apache.tajo.util.Bytes;
-import org.joda.time.DateTime;
-import org.joda.time.LocalDate;
-import org.joda.time.LocalTime;
+import org.apache.tajo.util.datetime.DateTimeFormat;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
import java.io.IOException;
@@ -96,7 +96,7 @@ public class DatumFactory {
case TIME:
return createTime(value);
case TIMESTAMP:
- return createTimeStamp(value);
+ return createTimestamp(value);
case INTERVAL:
return createInterval(value);
case BLOB:
@@ -128,11 +128,11 @@ public class DatumFactory {
case TEXT:
return createText(bytes);
case DATE:
- return new DateDatum(bytes);
+ return new DateDatum(Bytes.toInt(bytes));
case TIME:
- return new TimeDatum(bytes);
+ return new TimeDatum(Bytes.toLong(bytes));
case TIMESTAMP:
- return new TimestampDatum(bytes);
+ return new TimestampDatum(Bytes.toLong(bytes));
case BIT:
return createBit(bytes[0]);
case BLOB:
@@ -170,7 +170,7 @@ public class DatumFactory {
case INT8:
return new Int8Datum(val);
case TIMESTAMP:
- return createTimeStampFromMillis(val);
+ return new TimestampDatum(val);
case TIME:
return createTime(val);
default:
@@ -266,8 +266,13 @@ public class DatumFactory {
return new DateDatum(instance);
}
+ public static DateDatum createDate(int year, int month, int day) {
+ return new DateDatum(DateTimeUtil.date2j(year, month, day));
+ }
+
public static DateDatum createDate(String dateStr) {
- return new DateDatum(LocalDate.parse(dateStr));
+ TimeMeta tm = DateTimeUtil.decodeDateTime(dateStr);
+ return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
}
public static TimeDatum createTime(long instance) {
@@ -275,19 +280,20 @@ public class DatumFactory {
}
public static TimeDatum createTime(String dateStr) {
- return new TimeDatum(LocalTime.parse(dateStr));
+ TimeMeta tm = DateTimeUtil.decodeDateTime(dateStr);
+ return new TimeDatum(DateTimeUtil.toTime(tm));
}
- public static TimestampDatum createTimeStamp(int unixTime) {
- return new TimestampDatum(unixTime);
+ public static TimestampDatum createTimestmpDatumWithJavaMillis(long millis) {
+ return new TimestampDatum(DateTimeUtil.javaTimeToJulianTime(millis));
}
- public static TimestampDatum createTimeStampFromMillis(long millis) {
- return new TimestampDatum(new DateTime(millis));
+ public static TimestampDatum createTimestmpDatumWithUnixTime(int unixTime) {
+ return createTimestmpDatumWithJavaMillis(unixTime * 1000L);
}
- public static TimestampDatum createTimeStamp(String timeStamp) {
- return new TimestampDatum(timeStamp);
+ public static TimestampDatum createTimestamp(String datetimeStr) {
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(datetimeStr));
}
public static IntervalDatum createInterval(String intervalStr) {
@@ -301,7 +307,7 @@ public class DatumFactory {
case INT8:
return new DateDatum(datum.asInt4());
case TEXT:
- return new DateDatum(datum.asChars());
+ return createDate(datum.asChars());
case DATE:
return (DateDatum) datum;
default:
@@ -314,7 +320,9 @@ public class DatumFactory {
case INT8:
return new TimeDatum(datum.asInt8());
case TEXT:
- return new TimeDatum(datum.asChars());
+ TimeMeta tm = DateTimeFormat.parseDateTime(datum.asChars(), "HH24:MI:SS.MS");
+ DateTimeUtil.toUTCTimezone(tm);
+ return new TimeDatum(DateTimeUtil.toTime(tm));
case TIME:
return (TimeDatum) datum;
default:
@@ -325,7 +333,11 @@ public class DatumFactory {
public static TimestampDatum createTimestamp(Datum datum) {
switch (datum.type()) {
case TEXT:
- return new TimestampDatum(datum.asChars());
+ long timestamp = DateTimeUtil.toJulianTimestamp(datum.asChars());
+ TimeMeta tm = new TimeMeta();
+ DateTimeUtil.toJulianTimeMeta(timestamp, tm);
+ DateTimeUtil.toUTCTimezone(tm);
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
case TIMESTAMP:
return (TimestampDatum) datum;
default:
@@ -375,7 +387,24 @@ public class DatumFactory {
case FLOAT8:
return DatumFactory.createFloat8(operandDatum.asFloat8());
case TEXT:
- return DatumFactory.createText(operandDatum.asTextBytes());
+ switch (operandDatum.type()) {
+ case TIMESTAMP: {
+ TimestampDatum timestampDatum = (TimestampDatum)operandDatum;
+ TimeMeta tm = timestampDatum.toTimeMeta();
+ DateTimeUtil.toUserTimezone(tm);
+ TimestampDatum convertedTimestampDatum = new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+ return DatumFactory.createText(convertedTimestampDatum.asTextBytes());
+ }
+ case TIME: {
+ TimeDatum timeDatum = (TimeDatum)operandDatum;
+ TimeMeta tm = timeDatum.toTimeMeta();
+ DateTimeUtil.toUserTimezone(tm);
+ TimeDatum convertedTimeDatum = new TimeDatum(DateTimeUtil.toTime(tm));
+ return DatumFactory.createText(convertedTimeDatum.asTextBytes());
+ }
+ default:
+ return DatumFactory.createText(operandDatum.asTextBytes());
+ }
case DATE:
return DatumFactory.createDate(operandDatum);
case TIME:
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
index 35dca00..c269a40 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
@@ -23,6 +23,8 @@ import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.exception.InvalidCastException;
import org.apache.tajo.exception.InvalidOperationException;
import org.apache.tajo.util.NumberUtil;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
import java.nio.ByteBuffer;
@@ -211,7 +213,10 @@ public class Float4Datum extends NumericDatum {
case FLOAT8:
return DatumFactory.createFloat8(val + datum.asFloat8());
case DATE:
- return new DateDatum(((DateDatum)datum).getDate().plusDays(asInt4()));
+ DateDatum dateDatum = (DateDatum)datum;
+ TimeMeta tm = dateDatum.toTimeMeta();
+ tm.plusDays(asInt4());
+ return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
case NULL_TYPE:
return datum;
default:
@@ -233,7 +238,10 @@ public class Float4Datum extends NumericDatum {
case FLOAT8:
return DatumFactory.createFloat8(val - datum.asFloat8());
case DATE:
- return new DateDatum(((DateDatum)datum).getDate().minusDays(asInt4()));
+ DateDatum dateDatum = (DateDatum)datum;
+ TimeMeta tm = dateDatum.toTimeMeta();
+ tm.plusDays(0 - asInt4());
+ return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
case NULL_TYPE:
return datum;
default:
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
index b7d8cf4..b4cfc67 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
@@ -23,6 +23,8 @@ import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.exception.InvalidOperationException;
import org.apache.tajo.util.Bytes;
import org.apache.tajo.util.NumberUtil;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
import java.nio.ByteBuffer;
@@ -200,7 +202,10 @@ public class Float8Datum extends NumericDatum {
case FLOAT8:
return DatumFactory.createFloat8(val + datum.asFloat8());
case DATE:
- return new DateDatum(((DateDatum)datum).getDate().plusDays(asInt4()));
+ DateDatum dateDatum = (DateDatum)datum;
+ TimeMeta tm = dateDatum.toTimeMeta();
+ tm.plusDays(asInt4());
+ return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
case NULL_TYPE:
return datum;
default:
@@ -222,7 +227,10 @@ public class Float8Datum extends NumericDatum {
case FLOAT8:
return DatumFactory.createFloat8(val - datum.asFloat8());
case DATE:
- return new DateDatum(((DateDatum)datum).getDate().minusDays(asInt4()));
+ DateDatum dateDatum = (DateDatum)datum;
+ TimeMeta tm = dateDatum.toTimeMeta();
+ tm.plusDays(0 - asInt4());
+ return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
case NULL_TYPE:
return datum;
default:
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
index 731ccdc..7770b94 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
@@ -22,6 +22,8 @@ import com.google.gson.annotations.Expose;
import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.exception.InvalidOperationException;
import org.apache.tajo.util.NumberUtil;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
import java.nio.ByteBuffer;
@@ -202,7 +204,10 @@ public class Int2Datum extends NumericDatum {
case FLOAT8:
return DatumFactory.createFloat8(val + datum.asFloat8());
case DATE:
- return new DateDatum(((DateDatum)datum).getDate().plusDays(asInt2()));
+ DateDatum dateDatum = (DateDatum)datum;
+ TimeMeta tm = dateDatum.toTimeMeta();
+ tm.plusDays(asInt2());
+ return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
case NULL_TYPE:
return datum;
default:
@@ -224,7 +229,10 @@ public class Int2Datum extends NumericDatum {
case FLOAT8:
return DatumFactory.createFloat8(val - datum.asFloat8());
case DATE:
- return new DateDatum(((DateDatum)datum).getDate().minusDays(asInt2()));
+ DateDatum dateDatum = (DateDatum)datum;
+ TimeMeta tm = dateDatum.toTimeMeta();
+ tm.plusDays(0 - asInt2());
+ return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
case NULL_TYPE:
return datum;
default:
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
index 5b60e9e..7f7ac13 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
@@ -22,6 +22,8 @@ import com.google.gson.annotations.Expose;
import org.apache.tajo.common.TajoDataTypes.Type;
import org.apache.tajo.exception.InvalidOperationException;
import org.apache.tajo.util.NumberUtil;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
import java.nio.ByteBuffer;
@@ -206,7 +208,10 @@ public class Int4Datum extends NumericDatum {
case FLOAT8:
return DatumFactory.createFloat8(val + datum.asFloat8());
case DATE:
- return new DateDatum(((DateDatum)datum).getDate().plusDays(asInt4()));
+ DateDatum dateDatum = (DateDatum)datum;
+ TimeMeta tm = dateDatum.toTimeMeta();
+ tm.plusDays(asInt4());
+ return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
case NULL_TYPE:
return datum;
default:
@@ -228,7 +233,10 @@ public class Int4Datum extends NumericDatum {
case FLOAT8:
return DatumFactory.createFloat8(val - datum.asFloat8());
case DATE:
- return new DateDatum(((DateDatum)datum).getDate().minusDays(asInt4()));
+ DateDatum dateDatum = (DateDatum)datum;
+ TimeMeta tm = dateDatum.toTimeMeta();
+ tm.plusDays(0 - asInt4());
+ return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
case NULL_TYPE:
return datum;
default:
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
index 0367f9c..3b1e67d 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
@@ -23,6 +23,8 @@ import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.exception.InvalidCastException;
import org.apache.tajo.exception.InvalidOperationException;
import org.apache.tajo.util.NumberUtil;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
import java.nio.ByteBuffer;
@@ -214,7 +216,10 @@ public class Int8Datum extends NumericDatum {
case FLOAT8:
return DatumFactory.createFloat8(val + datum.asFloat8());
case DATE:
- return new DateDatum(((DateDatum)datum).getDate().plusDays(asInt4()));
+ DateDatum dateDatum = (DateDatum)datum;
+ TimeMeta tm = dateDatum.toTimeMeta();
+ tm.plusDays(asInt4());
+ return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
case NULL_TYPE:
return datum;
default:
@@ -236,7 +241,10 @@ public class Int8Datum extends NumericDatum {
case FLOAT8:
return DatumFactory.createFloat8(val - datum.asFloat8());
case DATE:
- return new DateDatum(((DateDatum)datum).getDate().minusDays(asInt4()));
+ DateDatum dateDatum = (DateDatum)datum;
+ TimeMeta tm = dateDatum.toTimeMeta();
+ tm.plusDays(0 - asInt4());
+ return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
case NULL_TYPE:
return datum;
default:
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java
index b6904a9..5ad9635 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java
@@ -21,9 +21,8 @@ package org.apache.tajo.datum;
import com.google.common.base.Objects;
import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.exception.InvalidOperationException;
-import org.joda.time.DateTime;
-import org.joda.time.LocalDate;
-import org.joda.time.LocalTime;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
import java.text.DecimalFormat;
import java.util.HashMap;
@@ -231,28 +230,32 @@ public class IntervalDatum extends Datum {
case INTERVAL:
IntervalDatum other = (IntervalDatum) datum;
return new IntervalDatum(months + other.months, millieconds + other.millieconds);
- case DATE:
- LocalDate date = ((DateDatum)datum).getDate();
- LocalDate localDate;
- if (months > 0) {
- localDate = date.plusMonths(months);
- } else {
- localDate = date;
+ case DATE: {
+ DateDatum dateDatum = (DateDatum) datum;
+ TimeMeta tm = dateDatum.toTimeMeta();
+ tm.plusMillis(getMilliSeconds());
+ if (getMonths() > 0) {
+ tm.plusMonths(getMonths());
}
- return new TimestampDatum(localDate.toDateTimeAtStartOfDay().getMillis() + millieconds);
- case TIME:
- LocalTime localTime = ((TimeDatum)datum).getTime();
- localTime = localTime.plusMillis((int) millieconds);
- return new TimeDatum(localTime);
- case TIMESTAMP:
- DateTime dateTime = ((TimestampDatum) datum).getDateTime();
+ DateTimeUtil.toUTCTimezone(tm);
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+ }
+ case TIME: {
+ TimeMeta tm = ((TimeDatum) datum).toTimeMeta();
+ tm.plusMillis(millieconds);
+ return new TimeDatum(DateTimeUtil.toTime(tm));
+ }
+ case TIMESTAMP: {
+ TimeMeta tm = new TimeMeta();
+ DateTimeUtil.toJulianTimeMeta(((TimestampDatum) datum).asInt8(), tm);
if (months > 0) {
- dateTime = dateTime.plusMonths(months);
+ tm.plusMonths(months);
}
if (millieconds > 0) {
- dateTime = dateTime.plusMillis((int) millieconds);
+ tm.plusMillis(millieconds);
}
- return new TimestampDatum(dateTime);
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+ }
default:
throw new InvalidOperationException(datum.type());
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
index 70f62c2..a7b9d1e 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
@@ -22,65 +22,47 @@ import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.exception.InvalidCastException;
import org.apache.tajo.exception.InvalidOperationException;
import org.apache.tajo.util.Bytes;
-import org.joda.time.DateTime;
-import org.joda.time.LocalTime;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
+import org.apache.tajo.util.datetime.DateTimeConstants.DateStyle;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
+
+import java.util.TimeZone;
public class TimeDatum extends Datum {
public static final int SIZE = 8;
- /** ISO 8601/SQL standard format - ex) 07:37:16-08 */
- public static final String DEFAULT_FORMAT_STRING = "HH:mm:ss";
- private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormat.forPattern(DEFAULT_FORMAT_STRING);
- private final LocalTime time;
-
- public TimeDatum(long value) {
- super(TajoDataTypes.Type.TIME);
- time = new LocalTime(value);
- }
-
- public TimeDatum(int hour, int minute, int second) {
- super(TajoDataTypes.Type.TIME);
- time = new LocalTime(hour, minute, second);
- }
-
- public TimeDatum(int hour, int minute, int second, int millis) {
- super(TajoDataTypes.Type.TIME);
- time = new LocalTime(hour, minute, second, millis);
- }
+ private final long time;
- public TimeDatum(String timeStr) {
- super(TajoDataTypes.Type.TIME);
- time = LocalTime.parse(timeStr, DEFAULT_FORMATTER);
- }
-
- public TimeDatum(LocalTime time) {
+ public TimeDatum(long time) {
super(TajoDataTypes.Type.TIME);
this.time = time;
}
- public TimeDatum(byte [] bytes) {
- this(Bytes.toLong(bytes));
+ public TimeMeta toTimeMeta() {
+ TimeMeta tm = new TimeMeta();
+ DateTimeUtil.date2j(time, tm);
+
+ return tm;
}
public int getHourOfDay() {
- return time.getHourOfDay();
+ TimeMeta tm = toTimeMeta();
+ return tm.hours;
}
public int getMinuteOfHour() {
- return time.getMinuteOfHour();
+ TimeMeta tm = toTimeMeta();
+ return tm.minutes;
}
public int getSecondOfMinute() {
- return time.getSecondOfMinute();
- }
-
- public int getMillisOfDay() {
- return time.getMillisOfDay();
+ TimeMeta tm = new TimeMeta();
+ DateTimeUtil.date2j(time, tm);
+ return tm.secs;
}
public int getMillisOfSecond() {
- return time.getMillisOfSecond();
+ TimeMeta tm = toTimeMeta();
+ return tm.fsecs / 1000;
}
public String toString() {
@@ -94,7 +76,7 @@ public class TimeDatum extends Datum {
@Override
public long asInt8() {
- return time.toDateTimeToday().getMillis();
+ return time;
}
@Override
@@ -109,11 +91,21 @@ public class TimeDatum extends Datum {
@Override
public String asChars() {
- return time.toString(DEFAULT_FORMATTER);
+ TimeMeta tm = toTimeMeta();
+ return DateTimeUtil.encodeTime(tm, DateStyle.ISO_DATES);
}
- public String toChars(String format) {
- return time.toString(format);
+ public String asChars(TimeZone timeZone, boolean includeTimeZone) {
+ TimeMeta tm = toTimeMeta();
+ DateTimeUtil.toUserTimezone(tm, timeZone);
+ if (includeTimeZone) {
+ tm.timeZone = timeZone.getRawOffset() / 1000;
+ }
+ return DateTimeUtil.encodeTime(tm, DateStyle.ISO_DATES);
+ }
+
+ public String toString(TimeZone timeZone, boolean includeTimeZone) {
+ return asChars(timeZone, includeTimeZone);
}
@Override
@@ -128,12 +120,23 @@ public class TimeDatum extends Datum {
public Datum plus(Datum datum) {
switch(datum.type()) {
- case INTERVAL:
+ case INTERVAL: {
IntervalDatum interval = ((IntervalDatum)datum);
- return new TimeDatum(time.plusMillis((int)interval.getMilliSeconds()));
- case DATE:
- DateTime dateTime = DateDatum.createDateTime(((DateDatum)datum).getDate(), time, true);
- return new TimestampDatum(dateTime);
+ TimeMeta tm = toTimeMeta();
+ tm.plusMillis(interval.getMilliSeconds());
+ return new TimeDatum(DateTimeUtil.toTime(tm));
+ }
+ case DATE: {
+ TimeMeta tm = toTimeMeta();
+ DateTimeUtil.toUserTimezone(tm); //TimeDatum is UTC
+
+ DateDatum dateDatum = (DateDatum) datum;
+ TimeMeta dateTm = dateDatum.toTimeMeta();
+ dateTm.plusTime(DateTimeUtil.toTime(tm));
+
+ DateTimeUtil.toUTCTimezone(dateTm);
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(dateTm));
+ }
default:
throw new InvalidOperationException(datum.type());
}
@@ -141,12 +144,17 @@ public class TimeDatum extends Datum {
public Datum minus(Datum datum) {
switch(datum.type()) {
- case INTERVAL:
+ case INTERVAL: {
IntervalDatum interval = ((IntervalDatum)datum);
- return new TimeDatum(time.minusMillis((int)interval.getMilliSeconds()));
+ TimeMeta tm = toTimeMeta();
+ tm.plusMillis(0 - interval.getMilliSeconds());
+ return new TimeDatum(DateTimeUtil.toTime(tm));
+ }
case TIME:
- return new IntervalDatum(
- time.toDateTimeToday().getMillis() - ((TimeDatum)datum).getTime().toDateTimeToday().getMillis() );
+ TimeMeta tm1 = toTimeMeta();
+ TimeMeta tm2 = ((TimeDatum)datum).toTimeMeta();
+
+ return new IntervalDatum((DateTimeUtil.toTime(tm1) - DateTimeUtil.toTime(tm2))/1000);
default:
throw new InvalidOperationException(datum.type());
}
@@ -155,7 +163,7 @@ public class TimeDatum extends Datum {
@Override
public Datum equalsTo(Datum datum) {
if (datum.type() == TajoDataTypes.Type.TIME) {
- return DatumFactory.createBool(time.equals(((TimeDatum) datum).time));
+ return DatumFactory.createBool(time == (((TimeDatum) datum).time));
} else if (datum.isNull()) {
return datum;
} else {
@@ -166,7 +174,8 @@ public class TimeDatum extends Datum {
@Override
public int compareTo(Datum datum) {
if (datum.type() == TajoDataTypes.Type.TIME) {
- return time.compareTo(((TimeDatum)datum).time);
+ TimeDatum another = (TimeDatum)datum;
+ return (time < another.time) ? -1 : ((time == another.time) ? 0 : 1);
} else if (datum instanceof NullDatum || datum.isNull()) {
return -1;
} else {
@@ -177,7 +186,7 @@ public class TimeDatum extends Datum {
public boolean equals(Object obj) {
if (obj instanceof TimeDatum) {
TimeDatum another = (TimeDatum) obj;
- return time.isEqual(another.time);
+ return time == another.time;
} else {
return false;
}
@@ -185,10 +194,7 @@ public class TimeDatum extends Datum {
@Override
public int hashCode() {
- return time.hashCode();
+ return (int)(time ^ (time >>> 32));
}
- public LocalTime getTime() {
- return time;
- }
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
index 879428b..d3cc5f4 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
@@ -19,187 +19,138 @@
package org.apache.tajo.datum;
import com.google.common.base.Objects;
-import org.apache.commons.lang.StringUtils;
import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.exception.InvalidOperationException;
import org.apache.tajo.util.Bytes;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
+import org.apache.tajo.util.datetime.DateTimeConstants.DateStyle;
+import org.apache.tajo.util.datetime.DateTimeFormat;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
+
+import java.util.TimeZone;
public class TimestampDatum extends Datum {
public static final int SIZE = 8;
- /** ISO 8601/SQL standard format - ex) 1997-12-17 07:37:16-08 */
- public static final String DEFAULT_FORMAT_STRING = "yyyy-MM-dd HH:mm:ss";
- public static final String FRACTION_FORMAT_STRING = "yyyy-MM-dd HH:mm:ss.SSS";
- private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormat.forPattern(DEFAULT_FORMAT_STRING);
- private static final DateTimeFormatter FRACTION_FORMATTER = DateTimeFormat.forPattern(FRACTION_FORMAT_STRING);
- private final DateTime dateTime;
-
- public TimestampDatum(int timestamp) {
- super(TajoDataTypes.Type.TIMESTAMP);
- dateTime = new DateTime((long)timestamp * 1000);
- }
+ private long timestamp;
+
+ /**
+ *
+ * @param timestamp UTC based
+ */
public TimestampDatum(long timestamp) {
super(TajoDataTypes.Type.TIMESTAMP);
- dateTime = new DateTime(timestamp);
+ this.timestamp = timestamp;
}
- public TimestampDatum(DateTime dateTime) {
- super(TajoDataTypes.Type.TIMESTAMP);
- this.dateTime = dateTime;
+ /**
+ * It's the same value to asInt8().
+ * @return The Timestamp
+ */
+ public long getTimestamp() {
+ return timestamp;
}
- TimestampDatum(byte [] bytes) {
- super(TajoDataTypes.Type.TIMESTAMP);
- this.dateTime = new DateTime(Bytes.toLong(bytes));
+ public int getEpoch() {
+ return DateTimeUtil.julianTimeToEpoch(timestamp);
}
- public TimestampDatum(String datetime) {
- super(TajoDataTypes.Type.TIMESTAMP);
-
- DateTime tmpDateTime = null;
- try {
- tmpDateTime = DateTime.parse(datetime, DEFAULT_FORMATTER);
- } catch (IllegalArgumentException e) {
- tmpDateTime = DateTime.parse(datetime, FRACTION_FORMATTER);
- }
- this.dateTime = tmpDateTime;
- }
-
- public int getUnixTime() {
- return (int) (dateTime.getMillis() / 1000);
+ public long getJavaTimestamp() {
+ return DateTimeUtil.julianTimeToJavaTime(timestamp);
}
- public long getMillis() {
- return dateTime.getMillis();
- }
-
- public DateTime getDateTime() {
- return dateTime;
- }
public int getCenturyOfEra() {
- return dateTime.getCenturyOfEra();
- }
-
- public int getEra() {
- return dateTime.getEra();
+ TimeMeta tm = toTimeMeta();
+ return tm.getCenturyOfEra();
}
public int getYear() {
- return dateTime.getYear();
+ TimeMeta tm = toTimeMeta();
+ return tm.years;
}
public int getMonthOfYear() {
- return dateTime.getMonthOfYear();
+ TimeMeta tm = toTimeMeta();
+ return tm.monthOfYear;
+ }
+
+ public int getDayOfYear() {
+ TimeMeta tm = toTimeMeta();
+ return tm.getDayOfYear();
}
public int getDayOfWeek() {
- return dateTime.getDayOfWeek();
+ TimeMeta tm = toTimeMeta();
+ return tm.getDayOfYear();
}
- public int getDayOfYear() {
- return dateTime.getDayOfYear();
+ public int getWeekOfYear() {
+ TimeMeta tm = toTimeMeta();
+ return tm.getWeekOfYear();
}
public int getDayOfMonth() {
- return dateTime.getDayOfMonth();
+ TimeMeta tm = toTimeMeta();
+ return tm.dayOfMonth;
}
public int getHourOfDay() {
- return dateTime.getHourOfDay();
+ TimeMeta tm = toTimeMeta();
+ return tm.hours;
}
public int getMinuteOfHour() {
- return dateTime.getMinuteOfHour();
- }
-
- public int getSecondOfDay() {
- return dateTime.getSecondOfDay();
+ TimeMeta tm = toTimeMeta();
+ return tm.minutes;
}
public int getSecondOfMinute() {
- return dateTime.getSecondOfMinute();
+ TimeMeta tm = toTimeMeta();
+ return tm.secs;
}
public int getMillisOfSecond() {
- return dateTime.getMillisOfSecond();
+ TimeMeta tm = toTimeMeta();
+ return tm.fsecs / 1000;
}
- public int getWeekyear() {
- return dateTime.getWeekyear();
+ public int getUnixTime() {
+ return (int)(DateTimeUtil.julianTimeToJavaTime(timestamp) / 1000);
}
- public int getWeekOfWeekyear() {
- return dateTime.getWeekOfWeekyear();
+ public String toString() {
+ return asChars();
}
- @Override
- public Datum plus(Datum datum) {
- if (datum.type() == TajoDataTypes.Type.INTERVAL) {
- IntervalDatum interval = (IntervalDatum)datum;
-
- DateTime plusDateTime = null;
- if (interval.getMonths() > 0) {
- plusDateTime = dateTime.plusMonths(interval.getMonths());
- } else {
- plusDateTime = dateTime;
- }
- if (interval.getMilliSeconds() > 0) {
- plusDateTime = plusDateTime.plusMillis((int) interval.getMilliSeconds());
- }
- return new TimestampDatum(plusDateTime);
-
- } else {
- throw new InvalidOperationException(datum.type());
+ public String asChars(TimeZone timeZone, boolean includeTimeZone) {
+ TimeMeta tm = toTimeMeta();
+ DateTimeUtil.toUserTimezone(tm, timeZone);
+ if (includeTimeZone) {
+ tm.timeZone = timeZone.getRawOffset() / 1000;
}
+ return DateTimeUtil.encodeDateTime(tm, DateStyle.ISO_DATES);
}
- @Override
- public Datum minus(Datum datum) {
- switch(datum.type()) {
- case INTERVAL:
- IntervalDatum interval = (IntervalDatum)datum;
-
- DateTime minusDateTime = null;
- if (interval.getMonths() > 0) {
- minusDateTime = dateTime.minusMonths(interval.getMonths());
- } else {
- minusDateTime = dateTime;
- }
- if (interval.getMilliSeconds() > 0) {
- minusDateTime = minusDateTime.minusMillis((int)interval.getMilliSeconds());
- }
- return new TimestampDatum(minusDateTime);
- case TIMESTAMP:
- return new IntervalDatum(dateTime.getMillis() - ((TimestampDatum)datum).dateTime.getMillis());
- default:
- throw new InvalidOperationException(datum.type());
- }
+ public String toString(TimeZone timeZone, boolean includeTimeZone) {
+ return asChars(timeZone, includeTimeZone);
}
@Override
public long asInt8() {
- return dateTime.getMillis();
- }
-
- public String toString() {
- return asChars();
+ return timestamp;
}
@Override
public String asChars() {
- if (getMillisOfSecond() > 0) {
- return StringUtils.stripEnd(dateTime.toString(FRACTION_FORMATTER), "0");
- } else {
- return dateTime.toString(DEFAULT_FORMATTER);
- }
+ TimeMeta tm = toTimeMeta();
+ return DateTimeUtil.encodeDateTime(tm, DateStyle.ISO_DATES);
}
- public String toChars(DateTimeFormatter format) {
- return dateTime.toString(format);
+ public String toChars(String format) {
+ TimeMeta tm = toTimeMeta();
+
+ return DateTimeFormat.to_char(tm, format);
}
@Override
@@ -209,43 +160,95 @@ public class TimestampDatum extends Datum {
@Override
public byte [] asByteArray() {
- return Bytes.toBytes(dateTime.getMillis());
+ return Bytes.toBytes(timestamp);
}
@Override
public Datum equalsTo(Datum datum) {
if (datum.type() == TajoDataTypes.Type.TIME) {
- return DatumFactory.createBool(dateTime.equals(((TimestampDatum) datum).dateTime));
+ return timestamp == datum.asInt8() ? BooleanDatum.TRUE : BooleanDatum.FALSE;
} else if (datum.isNull()) {
return datum;
} else {
- throw new InvalidOperationException();
+ throw new RuntimeException();
}
}
@Override
public int compareTo(Datum datum) {
if (datum.type() == TajoDataTypes.Type.TIMESTAMP) {
- return dateTime.compareTo(((TimestampDatum)datum).dateTime);
- } else if (datum instanceof NullDatum || datum.isNull()) {
+ TimestampDatum another = (TimestampDatum) datum;
+ return (timestamp < another.timestamp) ? -1 : ((timestamp > another.timestamp) ? 1 : 0);
+ } else if (datum.isNull()) {
return -1;
} else {
- throw new InvalidOperationException();
+ throw new RuntimeException();
}
}
- @Override
public boolean equals(Object obj) {
if (obj instanceof TimestampDatum) {
TimestampDatum another = (TimestampDatum) obj;
- return dateTime.isEqual(another.dateTime);
+ return timestamp == another.timestamp;
} else {
return false;
}
}
@Override
+ public Datum plus(Datum datum) {
+ if (datum.type() == TajoDataTypes.Type.INTERVAL) {
+ IntervalDatum interval = (IntervalDatum)datum;
+
+ TimeMeta tm = new TimeMeta();
+ DateTimeUtil.toJulianTimeMeta(timestamp, tm);
+
+ if (interval.getMonths() > 0) {
+ tm.plusMonths(interval.getMonths());
+ }
+ if (interval.getMilliSeconds() > 0) {
+ tm.plusMillis(interval.getMilliSeconds());
+ }
+
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+
+ } else {
+ throw new InvalidOperationException(datum.type());
+ }
+ }
+
+ @Override
+ public Datum minus(Datum datum) {
+ switch(datum.type()) {
+ case INTERVAL:
+ IntervalDatum interval = (IntervalDatum)datum;
+
+ TimeMeta tm = new TimeMeta();
+ DateTimeUtil.toJulianTimeMeta(timestamp, tm);
+
+ if (interval.getMonths() > 0) {
+ tm.plusMonths(0 - interval.getMonths());
+ }
+ if (interval.getMilliSeconds() > 0) {
+ tm.plusMillis(0 - interval.getMilliSeconds());
+ }
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+ case TIMESTAMP:
+ return new IntervalDatum((timestamp - ((TimestampDatum)datum).timestamp) / 1000);
+ default:
+ throw new InvalidOperationException(datum.type());
+ }
+ }
+
+ @Override
public int hashCode(){
- return Objects.hashCode(dateTime);
+ return Objects.hashCode(timestamp);
+ }
+
+ public TimeMeta toTimeMeta() {
+ TimeMeta tm = new TimeMeta();
+ DateTimeUtil.toJulianTimeMeta(timestamp, tm);
+
+ return tm;
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/exception/ValueOutOfRangeException.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/ValueOutOfRangeException.java b/tajo-common/src/main/java/org/apache/tajo/exception/ValueOutOfRangeException.java
new file mode 100644
index 0000000..4cf6b56
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/exception/ValueOutOfRangeException.java
@@ -0,0 +1,25 @@
+/**
+ * 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.tajo.exception;
+
+public class ValueOutOfRangeException extends RuntimeException {
+ public ValueOutOfRangeException(String message) {
+ super(message);
+ }
+}
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java b/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
index 2a162a9..9e88acb 100644
--- a/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
+++ b/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
@@ -21,7 +21,6 @@ package org.apache.tajo.json;
import com.google.gson.*;
import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.datum.*;
-import org.joda.time.DateTime;
import java.lang.reflect.Type;
@@ -39,7 +38,7 @@ public class DatumAdapter implements GsonSerDerAdapter<Datum> {
case TIME:
return new TimeDatum(jsonObject.get("value").getAsLong());
case TIMESTAMP:
- return new TimestampDatum(new DateTime(jsonObject.get("value").getAsLong()));
+ return new TimestampDatum(jsonObject.get("value").getAsLong());
case INTERVAL:
String[] values = jsonObject.get("value").getAsString().split(",");
@@ -62,7 +61,7 @@ public class DatumAdapter implements GsonSerDerAdapter<Datum> {
jsonObj.addProperty("value", src.asInt8());
break;
case TIMESTAMP:
- jsonObj.addProperty("value", ((TimestampDatum)src).getMillis());
+ jsonObj.addProperty("value", src.asInt8());
break;
case INTERVAL:
IntervalDatum interval = (IntervalDatum)src;
http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/util/TimeStampUtil.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/util/TimeStampUtil.java b/tajo-common/src/main/java/org/apache/tajo/util/TimeStampUtil.java
deleted file mode 100644
index aa1be8b..0000000
--- a/tajo-common/src/main/java/org/apache/tajo/util/TimeStampUtil.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * 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.tajo.util;
-
-
-import org.apache.tajo.datum.Int8Datum;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeFieldType;
-import org.joda.time.DateTimeZone;
-
-public class TimeStampUtil {
-
- public static long getDay(DateTime dateTime) {
- return convertToMicroSeconds(dateTime.withTimeAtStartOfDay());
- }
-
- public static long getHour(DateTime dateTime) {
- return convertToMicroSeconds(dateTime.withTime(dateTime.get(DateTimeFieldType.hourOfDay()), 0, 0, 0));
- }
-
- public static long getMinute(DateTime dateTime) {
- return convertToMicroSeconds(dateTime.withTime(dateTime.get(DateTimeFieldType.hourOfDay()),
- dateTime.get(DateTimeFieldType.minuteOfHour()), 0, 0));
- }
-
- public static long getSecond(DateTime dateTime) {
- return convertToMicroSeconds(dateTime.withTime(dateTime.get(DateTimeFieldType.hourOfDay()),
- dateTime.get(DateTimeFieldType.minuteOfHour()), dateTime.get(DateTimeFieldType.secondOfMinute()), 0));
- }
-
- public static long getMonth(DateTime dateTime) {
- return convertToMicroSeconds(dateTime.withTimeAtStartOfDay().withDate(dateTime.getYear(),
- dateTime.getMonthOfYear(),1));
- }
-
- public static long getDayOfWeek(DateTime dateTime,int week) {
- return convertToMicroSeconds(dateTime.withTimeAtStartOfDay().withDayOfWeek(week));
- }
-
- public static long getYear (DateTime dateTime) {
- return convertToMicroSeconds(dateTime.withTimeAtStartOfDay().withDate(dateTime.getYear(), 1, 1));
- }
-
- public static DateTime getUTCDateTime(Int8Datum int8Datum){
- return new DateTime(int8Datum.asInt8()/1000, DateTimeZone.UTC);
- }
-
- public static long convertToMicroSeconds(DateTime dateTime) {
- return dateTime.getMillis() * 1000;
- }
-}