You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by jh...@apache.org on 2016/04/27 10:31:05 UTC
[4/4] tajo git commit: TAJO-2110: Fix incorrect DateTime and remove
hard coded tests.
TAJO-2110: Fix incorrect DateTime and remove hard coded tests.
Closes #993
Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/aad78a4e
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/aad78a4e
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/aad78a4e
Branch: refs/heads/master
Commit: aad78a4e7d8c2c2161bfb149e1d1343fb4352d59
Parents: 73ac4b8
Author: Jinho Kim <jh...@apache.org>
Authored: Wed Apr 27 17:29:59 2016 +0900
Committer: Jinho Kim <jh...@apache.org>
Committed: Wed Apr 27 17:29:59 2016 +0900
----------------------------------------------------------------------
CHANGES | 2 +
.../org/apache/tajo/catalog/CatalogUtil.java | 48 ++++++++--
.../org/apache/tajo/catalog/TestTableDesc.java | 7 +-
.../org/apache/tajo/catalog/TestTableMeta.java | 16 ++--
.../org/apache/tajo/catalog/TestCatalog.java | 3 +-
.../TestCatalogAgainstCaseSensitivity.java | 3 +-
.../tajo/cli/tsql/CliClientParamsFactory.java | 2 +
.../cli/tsql/commands/DescTableCommand.java | 2 +-
.../tajo/client/CatalogAdminClientImpl.java | 5 +-
.../tajo/client/ClientParameterHelper.java | 2 +
.../apache/tajo/client/ClientParameters.java | 1 +
.../org/apache/tajo/client/QueryClientImpl.java | 6 +-
.../org/apache/tajo/client/TajoClientUtil.java | 2 +-
.../org/apache/tajo/jdbc/TajoResultSetBase.java | 23 ++---
.../org/apache/tajo/jdbc/WaitingResultSet.java | 3 +-
.../org/apache/tajo/BackendTestingUtil.java | 2 +-
.../java/org/apache/tajo/QueryTestCaseBase.java | 10 +-
.../org/apache/tajo/TajoTestingCluster.java | 15 +--
.../java/org/apache/tajo/TajoConstants.java | 3 -
.../java/org/apache/tajo/conf/TajoConf.java | 2 -
.../java/org/apache/tajo/datum/DateDatum.java | 60 +++++-------
.../main/java/org/apache/tajo/datum/Datum.java | 2 +-
.../org/apache/tajo/datum/DatumFactory.java | 28 ++----
.../org/apache/tajo/datum/IntervalDatum.java | 17 +++-
.../java/org/apache/tajo/datum/TimeDatum.java | 55 +++++------
.../org/apache/tajo/datum/TimestampDatum.java | 55 ++++++-----
.../apache/tajo/util/datetime/DateTimeUtil.java | 44 +++++++--
.../org/apache/tajo/util/datetime/TimeMeta.java | 20 ++++
.../org/apache/tajo/datum/TestDateDatum.java | 4 -
.../apache/tajo/datum/TestIntervalDatum.java | 19 ++--
.../org/apache/tajo/datum/TestTimeDatum.java | 2 +-
.../apache/tajo/datum/TestTimestampDatum.java | 8 +-
.../org/apache/tajo/util/TestDateTimeUtil.java | 12 ++-
.../apache/tajo/cli/tools/TestDDLBuilder.java | 10 +-
.../org/apache/tajo/cli/tools/TestTajoDump.java | 25 +++--
.../org/apache/tajo/cli/tsql/TestTajoCli.java | 13 ++-
.../engine/codegen/TestEvalCodeGenerator.java | 40 ++++----
.../apache/tajo/engine/eval/ExprTestBase.java | 75 +++++++--------
.../tajo/engine/eval/TestEvalTreeUtil.java | 3 +-
.../apache/tajo/engine/eval/TestPredicates.java | 8 +-
.../tajo/engine/eval/TestSQLExpression.java | 90 ++++++++++++++++--
.../function/TestConditionalExpressions.java | 2 +-
.../engine/function/TestDateTimeFunctions.java | 97 ++++++++-----------
.../tajo/engine/function/TestJsonFunctions.java | 2 +-
.../function/TestPatternMatchingPredicates.java | 2 +-
.../TestStringOperatorsAndFunctions.java | 20 ++--
.../planner/TestEvalNodeToExprConverter.java | 4 +-
.../engine/planner/TestJoinOrderAlgorithm.java | 5 +-
.../engine/planner/TestLogicalOptimizer.java | 3 +-
.../tajo/engine/planner/TestLogicalPlanner.java | 15 ++-
.../tajo/engine/planner/TestPlannerUtil.java | 3 +-
.../planner/physical/TestExternalSortExec.java | 7 +-
.../physical/TestFullOuterHashJoinExec.java | 9 +-
.../physical/TestFullOuterMergeJoinExec.java | 11 ++-
.../planner/physical/TestHashAntiJoinExec.java | 5 +-
.../planner/physical/TestHashJoinExec.java | 10 +-
.../planner/physical/TestHashSemiJoinExec.java | 6 +-
.../physical/TestLeftOuterHashJoinExec.java | 9 +-
.../planner/physical/TestMergeJoinExec.java | 6 +-
.../planner/physical/TestPhysicalPlanner.java | 16 ++--
.../physical/TestProgressExternalSortExec.java | 2 +-
.../engine/planner/physical/TestRadixSort.java | 7 +-
.../physical/TestRightOuterHashJoinExec.java | 7 +-
.../physical/TestRightOuterMergeJoinExec.java | 11 ++-
.../engine/planner/physical/TestSortExec.java | 7 +-
.../planner/physical/TestSortIntersectExec.java | 5 +-
.../tajo/engine/query/TestJsonWithTimezone.java | 8 +-
.../tajo/engine/query/TestSelectQuery.java | 8 +-
.../apache/tajo/engine/query/TestTimezone.java | 23 ++++-
.../apache/tajo/engine/util/BenchmarkSort.java | 12 +--
.../tajo/master/TestExecutionBlockCursor.java | 5 +-
.../apache/tajo/storage/TestQueryOnOrcFile.java | 3 -
.../org/apache/tajo/storage/TestRowFile.java | 2 +-
.../apache/tajo/worker/TestTaskExecutor.java | 4 +-
.../testTimezonedTable2.result | 6 +-
.../TestSelectQuery/testTimezonedTable2.result | 6 +-
.../results/TestTajoCli/testDescTable1.result | 6 +-
.../results/TestTajoCli/testDescTable2.result | 8 +-
.../testDescTableForNestedSchema.result | 6 +-
.../results/TestTajoDump/testDump1.result | 2 +-
.../results/TestTajoDump/testDump2.result | 2 +-
.../results/TestTajoDump/testDump3.result | 2 +-
.../TestTajoDump/testPartitionsDump.result | 4 +-
.../testBuildDDLForBaseTable.result | 2 +-
.../testBuildDDLForExternalTable.result | 2 +-
.../testBuildDDLQuotedTableName1.result | 2 +-
.../testBuildDDLQuotedTableName2.result | 2 +-
.../java/org/apache/tajo/benchmark/TPCH.java | 6 +-
.../tajo/engine/function/datetime/AddDays.java | 17 +++-
.../engine/function/datetime/AddMonths.java | 18 +++-
.../engine/function/datetime/CurrentDate.java | 10 +-
.../engine/function/datetime/CurrentTime.java | 15 ++-
.../function/datetime/DatePartFromTime.java | 14 +--
.../datetime/DatePartFromTimestamp.java | 16 ++--
.../function/datetime/ToCharTimestamp.java | 13 +--
.../function/datetime/ToTimestampText.java | 22 ++---
.../planner/physical/ColPartitionStoreExec.java | 2 +-
.../planner/physical/ExternalSortExec.java | 2 +-
.../physical/HashShuffleFileWriteExec.java | 2 +-
.../engine/planner/physical/InsertRowsExec.java | 2 +-
.../physical/RangeShuffleFileWriteExec.java | 2 +-
.../engine/planner/physical/StoreTableExec.java | 2 +-
.../tajo/master/exec/CreateTableExecutor.java | 2 +-
.../apache/tajo/master/exec/QueryExecutor.java | 6 ++
.../apache/tajo/worker/TaskAttemptContext.java | 3 +
tajo-docs/src/main/sphinx/jdbc_driver.rst | 1 +
tajo-docs/src/main/sphinx/time_zone.rst | 4 +-
.../org/apache/tajo/jdbc/TestResultSet.java | 29 +++---
.../java/org/apache/tajo/jdbc/TestTajoJdbc.java | 99 ++++++++++++++++++++
.../org/apache/tajo/plan/ExprAnnotator.java | 28 ++----
.../org/apache/tajo/plan/LogicalPlanner.java | 9 +-
.../org/apache/tajo/plan/TablePropertyUtil.java | 21 ++++-
.../org/apache/tajo/plan/expr/CastEval.java | 35 +++----
.../org/apache/tajo/plan/expr/EvalContext.java | 14 +++
.../org/apache/tajo/plan/expr/EvalNode.java | 1 -
.../tajo/plan/expr/GeneralFunctionEval.java | 10 +-
.../plan/exprrewrite/rules/ConstantFolding.java | 21 +++--
.../ClassBasedScalarFunctionInvoke.java | 1 +
.../plan/function/FunctionInvokeContext.java | 10 ++
.../tajo/plan/function/GeneralFunction.java | 17 ++++
.../function/python/PythonScriptEngine.java | 11 ++-
.../stream/TextFieldSerializerDeserializer.java | 43 +++------
.../tajo/plan/serder/EvalNodeSerializer.java | 3 -
.../tajo/plan/verifier/ExprsVerifier.java | 3 +-
tajo-plan/src/main/proto/Plan.proto | 1 -
.../org/apache/tajo/plan/TestLogicalNode.java | 13 ++-
.../org/apache/tajo/storage/StorageUtil.java | 3 +
.../storage/TextSerializerDeserializer.java | 12 +--
.../tajo/storage/json/JsonLineDeserializer.java | 19 +---
.../tajo/storage/json/JsonLineSerializer.java | 20 +---
.../apache/tajo/storage/orc/ORCAppender.java | 13 +--
.../org/apache/tajo/storage/orc/OrcScanner.java | 9 +-
.../text/TextFieldSerializerDeserializer.java | 46 ++++-----
.../thirdparty/orc/TreeReaderFactory.java | 12 +--
.../tajo/storage/thirdparty/orc/WriterImpl.java | 18 ++--
.../tajo/storage/TestCompressionStorages.java | 2 +-
.../tajo/storage/TestDelimitedTextFile.java | 18 ++--
.../apache/tajo/storage/TestFileSystems.java | 3 +-
.../apache/tajo/storage/TestFileTablespace.java | 11 ++-
.../org/apache/tajo/storage/TestLineReader.java | 9 +-
.../apache/tajo/storage/TestMergeScanner.java | 6 +-
.../org/apache/tajo/storage/TestStorages.java | 64 +++++--------
.../apache/tajo/storage/avro/TestAvroUtil.java | 10 +-
.../apache/tajo/storage/index/TestBSTIndex.java | 22 ++---
.../index/TestSingleCSVFileBSTIndex.java | 4 +-
.../apache/tajo/storage/json/TestJsonSerDe.java | 5 +-
.../tajo/storage/raw/TestDirectRawFile.java | 6 +-
147 files changed, 1106 insertions(+), 867 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index b729cce..8351ee4 100644
--- a/CHANGES
+++ b/CHANGES
@@ -137,6 +137,8 @@ Release 0.12.0 - unreleased
BUG FIXES
+ TAJO-2110: Fix incorrect DateTime and remove hard coded tests. (jinho)
+
TAJO-2119: Invalid sort result when sort key columns contain non-ascii values.
(jihoon)
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java
index 76990f2..0ab0c6f 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java
@@ -28,13 +28,10 @@ import org.apache.tajo.annotation.Nullable;
import org.apache.tajo.catalog.partition.PartitionDesc;
import org.apache.tajo.catalog.partition.PartitionMethodDesc;
import org.apache.tajo.catalog.proto.CatalogProtos;
-import org.apache.tajo.catalog.proto.CatalogProtos.PartitionKeyProto;
-import org.apache.tajo.catalog.proto.CatalogProtos.SchemaProto;
-import org.apache.tajo.catalog.proto.CatalogProtos.DataFormat;
-import org.apache.tajo.catalog.proto.CatalogProtos.TableDescProto;
-import org.apache.tajo.catalog.proto.CatalogProtos.TableIdentifierProto;
+import org.apache.tajo.catalog.proto.CatalogProtos.*;
import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.common.TajoDataTypes.DataType;
+import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.exception.InvalidOperationException;
import org.apache.tajo.exception.UndefinedOperatorException;
import org.apache.tajo.storage.StorageConstants;
@@ -321,8 +318,8 @@ public class CatalogUtil {
}
}
- public static TableMeta newTableMeta(String dataFormat) {
- KeyValueSet defaultProperties = CatalogUtil.newDefaultProperty(dataFormat);
+ public static TableMeta newTableMeta(String dataFormat, TajoConf conf) {
+ KeyValueSet defaultProperties = CatalogUtil.newDefaultProperty(dataFormat, conf);
return new TableMeta(dataFormat, defaultProperties);
}
@@ -890,13 +887,32 @@ public class CatalogUtil {
return pair;
}
- /*
+ /**
* It is the relationship graph of type conversions.
* It contains tuples, each of which (LHS type, RHS type, Result type).
*/
public static final Map<Type, Map<Type, Type>> OPERATION_CASTING_MAP = Maps.newHashMap();
+ /**
+ * It is the casting direction of relationship graph
+ */
+ private static final Map<Type, Map<Type, Direction>> CASTING_DIRECTION_MAP = Maps.newHashMap();
+
+ public static Direction getCastingDirection(Type lhs, Type rhs) {
+ Direction direction = TUtil.getFromNestedMap(CatalogUtil.CASTING_DIRECTION_MAP, lhs, rhs);
+ if (direction == null) {
+ return Direction.BOTH;
+ }
+ return direction;
+ }
+
+ public enum Direction {
+ LHS,
+ RHS,
+ BOTH
+ }
+
static {
// Type Conversion Map
TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.BOOLEAN, Type.BOOLEAN, Type.BOOLEAN);
@@ -962,7 +978,18 @@ public class CatalogUtil {
TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.TIMESTAMP, Type.VARCHAR, Type.TEXT);
TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.TIME, Type.TIME, Type.TIME);
+ TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.TIME, Type.DATE, Type.TIMESTAMP);
+ TUtil.putToNestedMap(CASTING_DIRECTION_MAP, Type.TIME, Type.DATE, Direction.RHS);
+
TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.DATE, Type.DATE, Type.DATE);
+ TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.DATE, Type.TIME, Type.TIMESTAMP);
+ TUtil.putToNestedMap(CASTING_DIRECTION_MAP, Type.DATE, Type.TIME, Direction.LHS);
+
+ TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.DATE, Type.INTERVAL, Type.TIMESTAMP);
+ TUtil.putToNestedMap(CASTING_DIRECTION_MAP, Type.DATE, Type.INTERVAL, Direction.LHS);
+
+ TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.INTERVAL, Type.DATE, Type.TIMESTAMP);
+ TUtil.putToNestedMap(CASTING_DIRECTION_MAP, Type.INTERVAL, Type.DATE, Direction.RHS);
TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.INET4, Type.INET4, Type.INET4);
}
@@ -980,8 +1007,11 @@ public class CatalogUtil {
* @param dataFormat DataFormat
* @return Table properties
*/
- public static KeyValueSet newDefaultProperty(String dataFormat) {
+ public static KeyValueSet newDefaultProperty(String dataFormat, TajoConf conf) {
KeyValueSet options = new KeyValueSet();
+ // set default timezone to the system timezone
+ options.set(StorageConstants.TIMEZONE, conf.getSystemTimezone().getID());
+
if (dataFormat.equalsIgnoreCase(BuiltinStorages.TEXT)) {
options.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
} else if (dataFormat.equalsIgnoreCase("JSON")) {
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java
index 085975b..f599406 100644
--- a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java
+++ b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java
@@ -19,11 +19,13 @@
package org.apache.tajo.catalog;
import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
import org.apache.tajo.catalog.json.CatalogGsonHelper;
import org.apache.tajo.catalog.proto.CatalogProtos;
import org.apache.tajo.catalog.statistics.ColumnStats;
import org.apache.tajo.catalog.statistics.TableStats;
import org.apache.tajo.common.TajoDataTypes.Type;
+import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.util.CommonTestingUtil;
import org.junit.Before;
import org.junit.Test;
@@ -33,6 +35,7 @@ import java.io.IOException;
import static org.junit.Assert.assertEquals;
public class TestTableDesc {
+ TajoConf conf = new TajoConf();
TableMeta info;
Schema schema;
TableDesc desc;
@@ -45,7 +48,7 @@ public class TestTableDesc {
.add("name", Type.BLOB)
.add("addr", Type.TEXT)
.build();
- info = CatalogUtil.newTableMeta("TEXT");
+ info = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
path = new Path(CommonTestingUtil.getTestDir(), "table1");
desc = new TableDesc("table1", schema, info, path.toUri());
stats = new TableStats();
@@ -72,7 +75,7 @@ public class TestTableDesc {
.add("name", Type.BLOB)
.add("addr", Type.TEXT)
.build();
- TableMeta info = CatalogUtil.newTableMeta("TEXT");
+ TableMeta info = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
testClone(info);
Path path = new Path(CommonTestingUtil.getTestDir(), "tajo");
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableMeta.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableMeta.java b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableMeta.java
index c6f4d1a..124b5ee 100644
--- a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableMeta.java
+++ b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableMeta.java
@@ -21,6 +21,7 @@ package org.apache.tajo.catalog;
import org.apache.tajo.BuiltinStorages;
import org.apache.tajo.catalog.json.CatalogGsonHelper;
import org.apache.tajo.catalog.proto.CatalogProtos.TableProto;
+import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos;
import org.junit.Before;
import org.junit.Test;
@@ -28,16 +29,17 @@ import org.junit.Test;
import static org.junit.Assert.*;
public class TestTableMeta {
+ TajoConf conf = new TajoConf();
TableMeta meta = null;
-
+
@Before
public void setUp() {
- meta = CatalogUtil.newTableMeta("TEXT");
+ meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
}
@Test
public void testTableMetaTableProto() {
- TableMeta meta1 = CatalogUtil.newTableMeta("TEXT");
+ TableMeta meta1 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
TableMeta meta2 = new TableMeta(meta1.getProto());
assertEquals(meta1, meta2);
@@ -45,7 +47,7 @@ public class TestTableMeta {
@Test
public final void testClone() throws CloneNotSupportedException {
- TableMeta meta1 = CatalogUtil.newTableMeta("TEXT");
+ TableMeta meta1 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
TableMeta meta2 = (TableMeta) meta1.clone();
assertEquals(meta1.getDataFormat(), meta2.getDataFormat());
@@ -54,7 +56,7 @@ public class TestTableMeta {
@Test
public void testSchema() throws CloneNotSupportedException {
- TableMeta meta1 = CatalogUtil.newTableMeta("TEXT");
+ TableMeta meta1 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
TableMeta meta2 = (TableMeta) meta1.clone();
assertEquals(meta1, meta2);
}
@@ -66,7 +68,7 @@ public class TestTableMeta {
@Test
public void testEqualsObject() {
- TableMeta meta2 = CatalogUtil.newTableMeta("TEXT");
+ TableMeta meta2 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
assertTrue(meta.equals(meta2));
assertNotSame(meta, meta2);
}
@@ -79,7 +81,7 @@ public class TestTableMeta {
int MAX_COUNT = 17;
- TableMeta meta1 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT);
+ TableMeta meta1 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
for (int i = 0; i < MAX_COUNT; i++) {
meta1.putProperty("key"+i, "value"+i);
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
index 9c1e430..14d6e30 100644
--- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
@@ -20,6 +20,7 @@ package org.apache.tajo.catalog;
import com.google.common.collect.Sets;
import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
import org.apache.tajo.TajoConstants;
import org.apache.tajo.catalog.dictionary.InfoSchemaMetadataDictionary;
import org.apache.tajo.catalog.partition.PartitionDesc;
@@ -433,7 +434,7 @@ public class TestCatalog {
String tableName = "indexed";
- TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+ TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, server.getConf());
return new TableDesc(
CatalogUtil.buildFQName(TajoConstants.DEFAULT_DATABASE_NAME, tableName), relationSchema, meta,
new Path(CommonTestingUtil.getTestDir(), "indexed").toUri());
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogAgainstCaseSensitivity.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogAgainstCaseSensitivity.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogAgainstCaseSensitivity.java
index 6af2798..6b7e458 100644
--- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogAgainstCaseSensitivity.java
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogAgainstCaseSensitivity.java
@@ -18,6 +18,7 @@
package org.apache.tajo.catalog;
+import org.apache.tajo.BuiltinStorages;
import org.apache.tajo.catalog.partition.PartitionDesc;
import org.apache.tajo.catalog.proto.CatalogProtos.*;
import org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto.AlterTablespaceCommand;
@@ -352,7 +353,7 @@ public class TestCatalogAgainstCaseSensitivity {
TableDesc tableDesc = new TableDesc(
CatalogUtil.buildFQName(databaseName, tableName),
tableSchema,
- CatalogUtil.newTableMeta("JSON"),
+ CatalogUtil.newTableMeta(BuiltinStorages.JSON, server.getConf()),
URI.create("hdfs://xxx.com/json_Table")
);
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/CliClientParamsFactory.java
----------------------------------------------------------------------
diff --git a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/CliClientParamsFactory.java b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/CliClientParamsFactory.java
index 1d40db3..a4b0c1d 100644
--- a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/CliClientParamsFactory.java
+++ b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/CliClientParamsFactory.java
@@ -24,6 +24,7 @@ import org.apache.tajo.client.ClientParameters;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
+import java.util.TimeZone;
class CliClientParamsFactory {
static Map<String, String> DEFAULT_PARAMS = new HashMap<>();
@@ -35,6 +36,7 @@ class CliClientParamsFactory {
DEFAULT_PARAMS.put(ClientParameters.RETRY, "3");
DEFAULT_PARAMS.put(ClientParameters.ROW_FETCH_SIZE, "200");
DEFAULT_PARAMS.put(ClientParameters.USE_COMPRESSION, "false");
+ DEFAULT_PARAMS.put(ClientParameters.TIMEZONE, TimeZone.getDefault().getID());
}
public static Properties get(@Nullable Properties connParam) {
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java
----------------------------------------------------------------------
diff --git a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java
index 6f01911..43fcf2e 100644
--- a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java
+++ b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java
@@ -118,7 +118,7 @@ public class DescTableCommand extends TajoShellCommand {
FileUtil.humanReadableByteCount(desc.getStats().getNumBytes(),
true)).append("\n");
}
- sb.append("Options: \n");
+ sb.append("Options:\n");
for(Map.Entry<String, String> entry : desc.getMeta().toMap().entrySet()){
/*
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java b/tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java
index 97f28a6..f1a4712 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java
@@ -20,7 +20,6 @@ package org.apache.tajo.client;
import com.google.protobuf.ServiceException;
import org.apache.tajo.annotation.Nullable;
-import org.apache.tajo.catalog.CatalogUtil;
import org.apache.tajo.catalog.Schema;
import org.apache.tajo.catalog.TableDesc;
import org.apache.tajo.catalog.TableMeta;
@@ -175,7 +174,7 @@ public class CatalogAdminClientImpl implements CatalogAdminClient {
throwsIfThisError(res.getState(), UnavailableTableLocationException.class);
ensureOk(res.getState());
- return CatalogUtil.newTableDesc(res.getTable());
+ return new TableDesc(res.getTable());
}
@Override
@@ -241,7 +240,7 @@ public class CatalogAdminClientImpl implements CatalogAdminClient {
}
ensureOk(res.getState());
- return CatalogUtil.newTableDesc(res.getTable());
+ return new TableDesc(res.getTable());
}
@Override
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-client/src/main/java/org/apache/tajo/client/ClientParameterHelper.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/ClientParameterHelper.java b/tajo-client/src/main/java/org/apache/tajo/client/ClientParameterHelper.java
index 8549178..fc5bc7d 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/ClientParameterHelper.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/ClientParameterHelper.java
@@ -30,6 +30,7 @@ import java.util.concurrent.TimeUnit;
import static org.apache.tajo.SessionVars.COMPRESSED_RESULT_TRANSFER;
import static org.apache.tajo.SessionVars.FETCH_ROWNUM;
+import static org.apache.tajo.SessionVars.TIMEZONE;
import static org.apache.tajo.client.ClientParameterHelper.ActionType.CONNECTION_PARAM;
import static org.apache.tajo.client.ClientParameterHelper.ActionType.SESSION_UPDATE;
import static org.apache.tajo.rpc.RpcConstants.CLIENT_CONNECTION_TIMEOUT;
@@ -75,6 +76,7 @@ class ClientParameterHelper {
}
});
PARAMETERS.put(ClientParameters.RETRY, new SimpleConnectionParamAction(RpcConstants.CLIENT_RETRY_NUM));
+ PARAMETERS.put(ClientParameters.TIMEZONE, new SimpleSessionAction(TIMEZONE));
}
enum ActionType {
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-client/src/main/java/org/apache/tajo/client/ClientParameters.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/ClientParameters.java b/tajo-client/src/main/java/org/apache/tajo/client/ClientParameters.java
index e3ee019..d5069d5 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/ClientParameters.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/ClientParameters.java
@@ -29,4 +29,5 @@ public interface ClientParameters {
String CONNECT_TIMEOUT = "connectTimeout";
String SOCKET_TIMEOUT = "socketTimeout";
String RETRY = "retry";
+ String TIMEZONE = "timezone";
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-client/src/main/java/org/apache/tajo/client/QueryClientImpl.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/QueryClientImpl.java b/tajo-client/src/main/java/org/apache/tajo/client/QueryClientImpl.java
index 3618f1f..921da09 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/QueryClientImpl.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/QueryClientImpl.java
@@ -26,14 +26,12 @@ import org.apache.tajo.QueryId;
import org.apache.tajo.QueryIdFactory;
import org.apache.tajo.SessionVars;
import org.apache.tajo.TajoIdProtos.SessionIdProto;
+import org.apache.tajo.TajoProtos.CodecType;
import org.apache.tajo.TajoProtos.QueryState;
import org.apache.tajo.auth.UserRoleInfo;
-import org.apache.tajo.catalog.CatalogUtil;
-import org.apache.tajo.catalog.Schema;
import org.apache.tajo.catalog.SchemaFactory;
import org.apache.tajo.catalog.TableDesc;
import org.apache.tajo.client.v2.exception.ClientUnableToConnectException;
-import org.apache.tajo.TajoProtos.CodecType;
import org.apache.tajo.exception.*;
import org.apache.tajo.ipc.ClientProtos.*;
import org.apache.tajo.ipc.QueryMasterClientProtocol;
@@ -299,7 +297,7 @@ public class QueryClientImpl implements QueryClient {
GetQueryResultResponse response = getResultResponse(queryId);
- TableDesc tableDesc = CatalogUtil.newTableDesc(response.getTableDesc());
+ TableDesc tableDesc = new TableDesc(response.getTableDesc());
return new FetchResultSet(this, tableDesc.getLogicalSchema(), queryId, defaultFetchRows);
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-client/src/main/java/org/apache/tajo/client/TajoClientUtil.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/TajoClientUtil.java b/tajo-client/src/main/java/org/apache/tajo/client/TajoClientUtil.java
index 2fe67ed..1d0ce10 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/TajoClientUtil.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/TajoClientUtil.java
@@ -77,7 +77,7 @@ public class TajoClientUtil {
public static ResultSet createResultSet(TajoClient client, QueryId queryId,
ClientProtos.GetQueryResultResponse response, int fetchRows)
throws IOException {
- TableDesc desc = CatalogUtil.newTableDesc(response.getTableDesc());
+ TableDesc desc = new TableDesc(response.getTableDesc());
return new FetchResultSet(client, desc.getLogicalSchema(), queryId, fetchRows);
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 5cc4309..9198a1e 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
@@ -22,7 +22,7 @@ import org.apache.tajo.QueryId;
import org.apache.tajo.SessionVars;
import org.apache.tajo.catalog.Schema;
import org.apache.tajo.common.TajoDataTypes;
-import org.apache.tajo.datum.*;
+import org.apache.tajo.datum.TimestampDatum;
import org.apache.tajo.storage.Tuple;
import org.apache.tajo.util.datetime.DateTimeUtil;
import org.apache.tajo.util.datetime.TimeMeta;
@@ -223,10 +223,10 @@ public abstract class TajoResultSetBase implements ResultSet {
case FLOAT8: return tuple.getFloat8(index);
case NUMERIC: return tuple.getFloat8(index);
case DATE: {
- return toDate(tuple.getTimeDate(index), timezone);
+ return toDate(tuple.getTimeDate(index), null);
}
case TIME: {
- return toTime(tuple.getTimeDate(index), timezone);
+ return toTime(tuple.getTimeDate(index), null);
}
case TIMESTAMP: {
return toTimestamp(tuple.getTimeDate(index), timezone);
@@ -268,8 +268,6 @@ public abstract class TajoResultSetBase implements ResultSet {
switch(tuple.type(index)) {
case BOOLEAN:
return String.valueOf(tuple.getBool(index));
- case TIME:
- return TimeDatum.asChars(tuple.getTimeDate(index), timezone, false);
case TIMESTAMP:
return TimestampDatum.asChars(tuple.getTimeDate(index), timezone, false);
default :
@@ -302,10 +300,7 @@ public abstract class TajoResultSetBase implements ResultSet {
}
private Date toDate(TimeMeta tm, TimeZone tz) {
- if (tz != null) {
- DateTimeUtil.toUserTimezone(tm, tz);
- }
- return new Date(DateTimeUtil.julianTimeToJavaTime(DateTimeUtil.toJulianTimestamp(tm)));
+ return DateTimeUtil.toJavaDate(tm, tz);
}
@Override
@@ -333,10 +328,7 @@ public abstract class TajoResultSetBase implements ResultSet {
}
private Time toTime(TimeMeta tm, TimeZone tz) {
- if (tz != null) {
- DateTimeUtil.toUserTimezone(tm, tz);
- }
- return new Time(DateTimeUtil.toJavaTime(tm.hours, tm.minutes, tm.secs, tm.fsecs));
+ return DateTimeUtil.toJavaTime(tm, tz);
}
@Override
@@ -364,10 +356,7 @@ public abstract class TajoResultSetBase implements ResultSet {
}
private Timestamp toTimestamp(TimeMeta tm, TimeZone tz) {
- if (tz != null) {
- DateTimeUtil.toUserTimezone(tm, tz);
- }
- return new Timestamp(DateTimeUtil.julianTimeToJavaTime(DateTimeUtil.toJulianTimestamp(tm)));
+ return DateTimeUtil.toJavaTimestamp(tm, tz);
}
@Override
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-client/src/main/java/org/apache/tajo/jdbc/WaitingResultSet.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/jdbc/WaitingResultSet.java b/tajo-client/src/main/java/org/apache/tajo/jdbc/WaitingResultSet.java
index c9967b4..eb2d9cb 100644
--- a/tajo-client/src/main/java/org/apache/tajo/jdbc/WaitingResultSet.java
+++ b/tajo-client/src/main/java/org/apache/tajo/jdbc/WaitingResultSet.java
@@ -20,7 +20,6 @@ package org.apache.tajo.jdbc;
import org.apache.tajo.QueryId;
import org.apache.tajo.TajoProtos;
-import org.apache.tajo.catalog.CatalogUtil;
import org.apache.tajo.catalog.Schema;
import org.apache.tajo.catalog.TableDesc;
import org.apache.tajo.client.QueryClient;
@@ -64,7 +63,7 @@ public class WaitingResultSet extends FetchResultSet {
}
ClientProtos.GetQueryResultResponse response = tajoClient.getResultResponse(queryId);
- TableDesc tableDesc = CatalogUtil.newTableDesc(response.getTableDesc());
+ TableDesc tableDesc = new TableDesc(response.getTableDesc());
return tableDesc.getLogicalSchema();
} catch (TajoException e) {
throw SQLExceptionUtil.toSQLException(e);
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-cluster-tests/src/test/java/org/apache/tajo/BackendTestingUtil.java
----------------------------------------------------------------------
diff --git a/tajo-cluster-tests/src/test/java/org/apache/tajo/BackendTestingUtil.java b/tajo-cluster-tests/src/test/java/org/apache/tajo/BackendTestingUtil.java
index 28605d3..23aebca 100644
--- a/tajo-cluster-tests/src/test/java/org/apache/tajo/BackendTestingUtil.java
+++ b/tajo-cluster-tests/src/test/java/org/apache/tajo/BackendTestingUtil.java
@@ -40,7 +40,7 @@ public class BackendTestingUtil {
.add("deptname", Type.TEXT)
.add("score", Type.INT4)
.build();
- mockupMeta = CatalogUtil.newTableMeta("TEXT");
+ mockupMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, new TajoConf());
}
public static void writeTmpTable(TajoConf conf, Path tablePath)
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java
----------------------------------------------------------------------
diff --git a/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java b/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java
index 116990f..aebd7b9 100644
--- a/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java
+++ b/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java
@@ -56,10 +56,7 @@ import org.apache.tajo.plan.verifier.VerificationState;
import org.apache.tajo.storage.BufferPool;
import org.apache.tajo.storage.StorageUtil;
import org.apache.tajo.util.FileUtil;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Rule;
+import org.junit.*;
import org.junit.rules.TestName;
import org.junit.rules.TestRule;
import org.junit.rules.TestWatcher;
@@ -265,6 +262,11 @@ public class QueryTestCaseBase {
name.getMethodName()));
}
+ @After
+ public void clear() {
+ getClient().unsetSessionVariables(Lists.newArrayList(SessionVars.TIMEZONE.name()));
+ }
+
public QueryTestCaseBase() {
// hive 0.12 does not support quoted identifier.
// So, we use lower case database names when Tajo uses HiveCatalogStore.
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java
----------------------------------------------------------------------
diff --git a/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java b/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java
index b1a3306..5413905 100644
--- a/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java
+++ b/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java
@@ -118,11 +118,6 @@ public class TajoTestingCluster {
void initPropertiesAndConfigs() {
- // Set time zone
- TimeZone testDefaultTZ = TimeZone.getTimeZone(TajoConstants.DEFAULT_SYSTEM_TIMEZONE);
- conf.setSystemTimezone(testDefaultTZ);
- TimeZone.setDefault(testDefaultTZ);
-
// Injection of equality testing code of logical plan (de)serialization
conf.setClassVar(ConfVars.LOGICAL_PLAN_REWRITE_RULE_PROVIDER_CLASS, LogicalPlanTestRuleProvider.class);
conf.setClassVar(ConfVars.GLOBAL_PLAN_REWRITE_RULE_PROVIDER_CLASS, GlobalPlanTestRuleProvider.class);
@@ -546,12 +541,6 @@ public class TajoTestingCluster {
LOG.info("Minicluster is stopping");
LOG.info("========================================");
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
shutdownMiniTajoCluster();
if(this.catalogServer != null) {
@@ -560,7 +549,7 @@ public class TajoTestingCluster {
}
try {
- Thread.sleep(3000);
+ Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -613,7 +602,7 @@ public class TajoTestingCluster {
for (int i = 0; i < names.length; i++) {
createTable(names[i], schemas[i], tableOption, tables[i]);
}
- Thread.sleep(1000);
+
ResultSet res = client.executeQueryAndGetResult(query);
return res;
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/main/java/org/apache/tajo/TajoConstants.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/TajoConstants.java b/tajo-common/src/main/java/org/apache/tajo/TajoConstants.java
index f431fad..1b60826 100644
--- a/tajo-common/src/main/java/org/apache/tajo/TajoConstants.java
+++ b/tajo-common/src/main/java/org/apache/tajo/TajoConstants.java
@@ -31,9 +31,6 @@ public class TajoConstants {
public static final String DEFAULT_DATABASE_NAME = "default";
public static final String DEFAULT_SCHEMA_NAME = "";
- /** Java 6 only recognize GMT instead of UTC. So, we should keep using GMT. */
- public static final String DEFAULT_SYSTEM_TIMEZONE = "GMT";
-
public static final String EMPTY_STRING = "";
public static final String SYSTEM_HA_DIR_NAME = "ha";
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 440af80..e619b24 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
@@ -46,7 +46,6 @@ import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
public class TajoConf extends Configuration {
- private static TimeZone SYSTEM_TIMEZONE;
private static int DATE_ORDER = -1;
private static final Map<String, ConfVars> vars = new HashMap<>();
@@ -79,7 +78,6 @@ public class TajoConf extends Configuration {
addResource(path);
}
- @SuppressWarnings("unused")
public TimeZone getSystemTimezone() {
return TimeZone.getTimeZone(getVar(ConfVars.$TIMEZONE));
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 ac84e25..acc5408 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
@@ -102,29 +102,27 @@ public class DateDatum extends Datum {
@Override
public Datum plus(Datum datum) {
- switch(datum.type()) {
- case INT2:
- case INT4:
- case INT8:
- case FLOAT4:
- case FLOAT8: {
- TimeMeta tm = asTimeMeta();
- tm.plusDays(datum.asInt4());
- return new DateDatum(tm);
- }
- case INTERVAL:
- IntervalDatum interval = (IntervalDatum) datum;
- TimeMeta tm = asTimeMeta();
- tm.plusInterval(interval.months, interval.milliseconds);
- return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
- case TIME: {
- TimeMeta tm1 = asTimeMeta();
- TimeMeta tm2 = datum.asTimeMeta();
- tm1.plusTime(DateTimeUtil.toTime(tm2));
- return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1));
- }
- default:
- throw new InvalidOperationException(datum.type());
+ switch (datum.type()) {
+ case INT2:
+ case INT4:
+ case INT8: {
+ TimeMeta tm = asTimeMeta();
+ tm.plusDays(datum.asInt4());
+ return new DateDatum(tm);
+ }
+ case INTERVAL:
+ IntervalDatum interval = (IntervalDatum) datum;
+ TimeMeta tm = asTimeMeta();
+ tm.plusInterval(interval.months, interval.milliseconds);
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+ case TIME: {
+ TimeMeta tm1 = asTimeMeta();
+ TimeMeta tm2 = datum.asTimeMeta();
+ tm1.plusTime(DateTimeUtil.toTime(tm2));
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1));
+ }
+ default:
+ throw new InvalidOperationException("operator does not exist: " + type() + " + " + datum.type());
}
}
@@ -133,9 +131,7 @@ public class DateDatum extends Datum {
switch(datum.type()) {
case INT2:
case INT4:
- case INT8:
- case FLOAT4:
- case FLOAT8: {
+ case INT8: {
TimeMeta tm = asTimeMeta();
tm.plusDays(0 - datum.asInt4());
return new DateDatum(tm);
@@ -157,7 +153,7 @@ public class DateDatum extends Datum {
return new Int4Datum(jdate - d.jdate);
}
default:
- throw new InvalidOperationException(datum.type());
+ throw new InvalidOperationException("operator does not exist: " + type() + " - " + datum.type());
}
}
@@ -207,7 +203,7 @@ public class DateDatum extends Datum {
} else if (datum.isNull()) {
return datum;
} else {
- throw new InvalidOperationException();
+ throw new InvalidOperationException(datum.type());
}
}
@@ -216,13 +212,7 @@ public class DateDatum extends Datum {
if (datum.type() == TajoDataTypes.Type.DATE) {
DateDatum another = (DateDatum) datum;
return Ints.compare(jdate, another.jdate);
- } else if (datum.type() == TajoDataTypes.Type.TIMESTAMP) {
- TimestampDatum another = (TimestampDatum) datum;
- TimeMeta myMeta, otherMeta;
- myMeta = asTimeMeta();
- otherMeta = another.asTimeMeta();
- return myMeta.compareTo(otherMeta);
- } else if (datum instanceof NullDatum || datum.isNull()) {
+ } else if (datum.isNull()) {
return -1;
} else {
throw new InvalidOperationException(datum.type());
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java
index e2173a8..dc61145 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java
@@ -113,7 +113,7 @@ public abstract class Datum implements Comparable<Datum>, GsonObject {
}
public byte[] asTextBytes() {
- return asChars().getBytes();
+ return asChars().getBytes(TextDatum.DEFAULT_CHARSET);
}
public TimeMeta asTimeMeta() {
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 e9ac0c5..aac877b 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
@@ -283,12 +283,6 @@ public class DatumFactory {
return new TimeDatum(DateTimeUtil.toJulianTime(timeStr));
}
- public static TimeDatum createTime(String timeStr, TimeZone tz) {
- TimeMeta tm = DateTimeUtil.decodeDateTime(timeStr);
- DateTimeUtil.toUTCTimezone(tm, tz);
- return new TimeDatum(DateTimeUtil.toTime(tm));
- }
-
public static TimestampDatum createTimestampDatumWithJavaMillis(long millis) {
return new TimestampDatum(DateTimeUtil.javaTimeToJulianTime(millis));
}
@@ -335,7 +329,7 @@ public class DatumFactory {
}
}
- public static TimeDatum createTime(Datum datum, @Nullable TimeZone tz) {
+ public static TimeDatum createTime(Datum datum) {
switch (datum.type()) {
case INT8:
return new TimeDatum(datum.asInt8());
@@ -343,9 +337,6 @@ public class DatumFactory {
case VARCHAR:
case TEXT:
TimeMeta tm = DateTimeFormat.parseDateTime(datum.asChars(), "HH24:MI:SS.MS");
- if (tz != null) {
- DateTimeUtil.toUTCTimezone(tm, tz);
- }
return new TimeDatum(DateTimeUtil.toTime(tm));
case TIME:
return (TimeDatum) datum;
@@ -362,6 +353,13 @@ public class DatumFactory {
return parseTimestamp(datum.asChars(), tz);
case TIMESTAMP:
return (TimestampDatum) datum;
+ case DATE: {
+ TimeMeta tm = datum.asTimeMeta();
+ if (tz != null) {
+ DateTimeUtil.toUTCTimezone(tm, tz);
+ }
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+ }
default:
throw new TajoRuntimeException(new InvalidValueForCastException(datum.type(), Type.TIMESTAMP));
}
@@ -436,21 +434,13 @@ public class DatumFactory {
return DatumFactory.createText(timestampDatum.asChars());
}
}
- case TIME: {
- TimeDatum timeDatum = (TimeDatum)operandDatum;
- if (tz != null) {
- return DatumFactory.createText(TimeDatum.asChars(operandDatum.asTimeMeta(), tz, false));
- } else {
- return DatumFactory.createText(timeDatum.asChars());
- }
- }
default:
return DatumFactory.createText(operandDatum.asTextBytes());
}
case DATE:
return DatumFactory.createDate(operandDatum);
case TIME:
- return DatumFactory.createTime(operandDatum, tz);
+ return DatumFactory.createTime(operandDatum);
case TIMESTAMP:
return DatumFactory.createTimestamp(operandDatum, tz);
case BLOB:
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 e797b87..44570f3 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
@@ -247,7 +247,7 @@ public class IntervalDatum extends Datum {
return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
}
default:
- throw new InvalidOperationException(datum.type());
+ throw new InvalidOperationException("operator does not exist: " + type() + " + " + datum.type());
}
}
@@ -257,7 +257,7 @@ public class IntervalDatum extends Datum {
IntervalDatum other = (IntervalDatum) datum;
return new IntervalDatum(months - other.months, milliseconds - other.milliseconds);
} else {
- throw new InvalidOperationException(datum.type());
+ throw new InvalidOperationException("operator does not exist: " + type() + " - " + datum.type());
}
}
@@ -274,7 +274,7 @@ public class IntervalDatum extends Datum {
double float8Val = datum.asFloat8();
return createIntervalDatum((double)months * float8Val, (double) milliseconds * float8Val);
default:
- throw new InvalidOperationException(datum.type());
+ throw new InvalidOperationException("operator does not exist: " + type() + " * " + datum.type());
}
}
@@ -297,7 +297,7 @@ public class IntervalDatum extends Datum {
}
return createIntervalDatum((double) months / paramValueF8, (double) milliseconds / paramValueF8);
default:
- throw new InvalidOperationException(datum.type());
+ throw new InvalidOperationException("operator does not exist: " + type() + " / " + datum.type());
}
}
@@ -380,6 +380,13 @@ public class IntervalDatum extends Datum {
sb.append(".").append(df2.format(millisecond));
}
}
+ } else {
+ sb.append(prefix)
+ .append(df.format(0))
+ .append(":")
+ .append(df.format(0))
+ .append(":")
+ .append(df.format(0));
}
}
@@ -406,7 +413,7 @@ public class IntervalDatum extends Datum {
} else if (datum.isNull()) {
return datum;
} else {
- throw new InvalidOperationException();
+ throw new InvalidOperationException(datum.type());
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 e70d7d5..57196d2 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
@@ -20,16 +20,14 @@ package org.apache.tajo.datum;
import com.google.common.primitives.Longs;
import org.apache.tajo.common.TajoDataTypes;
-import org.apache.tajo.exception.InvalidValueForCastException;
import org.apache.tajo.exception.InvalidOperationException;
+import org.apache.tajo.exception.InvalidValueForCastException;
import org.apache.tajo.exception.TajoRuntimeException;
import org.apache.tajo.util.Bytes;
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;
private final long time;
@@ -98,18 +96,6 @@ public class TimeDatum extends Datum {
return DateTimeUtil.encodeTime(tm, DateStyle.ISO_DATES);
}
- public static String asChars(TimeMeta tm, TimeZone timeZone, boolean includeTimeZone) {
- 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(asTimeMeta(), timeZone, includeTimeZone);
- }
-
@Override
public int size() {
return SIZE;
@@ -122,20 +108,27 @@ public class TimeDatum extends Datum {
@Override
public Datum plus(Datum datum) {
- switch(datum.type()) {
- case INTERVAL:
- IntervalDatum interval = ((IntervalDatum)datum);
- TimeMeta tm = asTimeMeta();
- tm.plusInterval(interval.months, interval.milliseconds);
- return new TimeDatum(DateTimeUtil.toTime(tm));
- case DATE: {
- DateDatum dateDatum = (DateDatum) datum;
- TimeMeta dateTm = dateDatum.asTimeMeta();
- dateTm.plusTime(time);
- return new TimestampDatum(DateTimeUtil.toJulianTimestamp(dateTm));
- }
- default:
- throw new InvalidOperationException(datum.type());
+ switch (datum.type()) {
+ case INTERVAL: {
+ IntervalDatum interval = ((IntervalDatum) datum);
+ TimeMeta tm = asTimeMeta();
+ tm.plusInterval(interval.months, interval.milliseconds);
+ return new TimeDatum(DateTimeUtil.toTime(tm));
+ }
+ case DATE: {
+ DateDatum dateDatum = (DateDatum) datum;
+ TimeMeta dateTm = dateDatum.asTimeMeta();
+ dateTm.plusTime(time);
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(dateTm));
+ }
+ case TIMESTAMP: {
+ TimestampDatum timestampDatum = (TimestampDatum) datum;
+ TimeMeta tm = timestampDatum.asTimeMeta();
+ tm.plusTime(time);
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+ }
+ default:
+ throw new InvalidOperationException("operator does not exist: " + type() + " + " + datum.type());
}
}
@@ -150,7 +143,7 @@ public class TimeDatum extends Datum {
case TIME:
return new IntervalDatum((time - ((TimeDatum)datum).time)/1000);
default:
- throw new InvalidOperationException(datum.type());
+ throw new InvalidOperationException("operator does not exist: " + type() + " - " + datum.type());
}
}
@@ -170,7 +163,7 @@ public class TimeDatum extends Datum {
if (datum.type() == TajoDataTypes.Type.TIME) {
TimeDatum another = (TimeDatum)datum;
return Longs.compare(time, another.time);
- } else if (datum instanceof NullDatum || datum.isNull()) {
+ } else if (datum.isNull()) {
return -1;
} else {
throw new InvalidOperationException(datum.type());
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 ac30278..782aab4 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
@@ -23,7 +23,6 @@ import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.exception.InvalidOperationException;
import org.apache.tajo.util.Bytes;
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;
@@ -133,7 +132,7 @@ public class TimestampDatum extends Datum {
public static String asChars(TimeMeta tm, TimeZone timeZone, boolean includeTimeZone) {
DateTimeUtil.toUserTimezone(tm, timeZone);
if (includeTimeZone) {
- tm.timeZone = timeZone.getRawOffset() / 1000;
+ tm.timeZone = tm.getZonedOffset(DateTimeUtil.toJulianTimestamp(tm), timeZone) / 1000;
}
return DateTimeUtil.encodeDateTime(tm, DateStyle.ISO_DATES);
}
@@ -150,13 +149,7 @@ public class TimestampDatum extends Datum {
@Override
public String asChars() {
TimeMeta tm = asTimeMeta();
- return DateTimeUtil.encodeDateTime(tm, DateStyle.ISO_DATES);
- }
-
- public String toChars(String format) {
- TimeMeta tm = asTimeMeta();
-
- return DateTimeFormat.to_char(tm, format);
+ return asChars(tm, TimeZone.getDefault(), true);
}
@Override
@@ -190,11 +183,6 @@ public class TimestampDatum extends Datum {
if (datum.type() == TajoDataTypes.Type.TIMESTAMP) {
TimestampDatum another = (TimestampDatum) datum;
return Longs.compare(timestamp, another.timestamp);
- } else if (datum.type() == TajoDataTypes.Type.DATE) {
- TimeMeta myMeta, otherMeta;
- myMeta = asTimeMeta();
- otherMeta = datum.asTimeMeta();
- return myMeta.compareTo(otherMeta);
} else if (datum.isNull()) {
return -1;
} else {
@@ -214,28 +202,39 @@ public class TimestampDatum extends Datum {
@Override
public Datum plus(Datum datum) {
- if (datum.type() == TajoDataTypes.Type.INTERVAL) {
- IntervalDatum interval = (IntervalDatum)datum;
+ switch (datum.type()) {
+ case INTERVAL:
+ IntervalDatum interval = (IntervalDatum) datum;
TimeMeta tm = asTimeMeta();
tm.plusInterval(interval.months, interval.milliseconds);
return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
- } else {
- throw new InvalidOperationException(datum.type());
+ case TIME:
+ TimeMeta tm1 = asTimeMeta();
+ TimeMeta tm2 = datum.asTimeMeta();
+ tm1.plusTime(DateTimeUtil.toTime(tm2));
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1));
+ default:
+ throw new InvalidOperationException("operator does not exist: " + type() + " + " + datum.type());
}
}
@Override
public Datum minus(Datum datum) {
- switch(datum.type()) {
- case INTERVAL:
- IntervalDatum interval = (IntervalDatum)datum;
- TimeMeta tm = asTimeMeta();
- tm.plusInterval(-interval.months, -interval.milliseconds);
- return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
- case TIMESTAMP:
- return new IntervalDatum((timestamp - ((TimestampDatum)datum).timestamp) / 1000);
- default:
- throw new InvalidOperationException(datum.type());
+ switch (datum.type()) {
+ case INTERVAL:
+ IntervalDatum interval = (IntervalDatum) datum;
+ TimeMeta tm = asTimeMeta();
+ tm.plusInterval(-interval.months, -interval.milliseconds);
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+ case TIMESTAMP:
+ return new IntervalDatum((timestamp - ((TimestampDatum) datum).timestamp) / 1000);
+ case TIME:
+ TimeMeta tm1 = asTimeMeta();
+ TimeMeta tm2 = datum.asTimeMeta();
+ tm1.plusTime(0 - DateTimeUtil.toTime(tm2));
+ return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1));
+ default:
+ throw new InvalidOperationException("operator does not exist: " + type() + " - " + datum.type());
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java b/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java
index 5a338d3..0bf58aa 100644
--- a/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java
+++ b/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java
@@ -18,6 +18,7 @@
package org.apache.tajo.util.datetime;
+import com.google.common.annotations.VisibleForTesting;
import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.datum.Int8Datum;
import org.apache.tajo.exception.ValueOutOfRangeException;
@@ -26,6 +27,9 @@ import org.apache.tajo.util.datetime.DateTimeConstants.DateToken;
import org.apache.tajo.util.datetime.DateTimeConstants.TokenField;
import javax.annotation.Nullable;
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
import java.util.TimeZone;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
@@ -356,6 +360,31 @@ public class DateTimeUtil {
return toTime(hour, min, sec, fsec)/DateTimeConstants.MSECS_PER_SEC;
}
+ public static Timestamp toJavaTimestamp(TimeMeta tm, @Nullable TimeZone tz) {
+ long javaTime = DateTimeUtil.julianTimeToJavaTime(DateTimeUtil.toJulianTimestamp(tm));
+
+ if (tz != null) {
+ int offset = tz.getOffset(javaTime) - TimeZone.getDefault().getOffset(javaTime);
+ return new Timestamp(javaTime + offset);
+ } else {
+ return new Timestamp(javaTime);
+ }
+ }
+
+ public static Time toJavaTime(TimeMeta tm, @Nullable TimeZone tz) {
+ if (tz != null) {
+ DateTimeUtil.toUserTimezone(tm, tz);
+ }
+ return new Time(tm.hours, tm.minutes, tm.secs);
+ }
+
+ public static Date toJavaDate(TimeMeta tm, @Nullable TimeZone tz) {
+ if (tz != null) {
+ DateTimeUtil.toUserTimezone(tm, tz);
+ }
+ return new Date(tm.years - 1900, tm.monthOfYear - 1 , tm.dayOfMonth);
+ }
+
/**
* Calculate julian timestamp.
* @param years
@@ -1891,7 +1920,7 @@ public class DateTimeUtil {
appendSecondsToEncodeOutput(sb, tm.secs, tm.fsecs, 6, true);
if (tm.timeZone != 0 && tm.timeZone != Integer.MAX_VALUE) {
- sb.append(getTimeZoneDisplayTime(tm.timeZone));
+ sb.append(getDisplayTimeZoneOffset(tm.timeZone));
}
if (tm.years <= 0) {
sb.append(" BC");
@@ -1938,7 +1967,7 @@ public class DateTimeUtil {
sb.append(String.format("%02d:%02d:", tm.hours, tm.minutes));
appendSecondsToEncodeOutput(sb, tm.secs, tm.fsecs, 6, true);
if (tm.timeZone != 0 && tm.timeZone != Integer.MAX_VALUE) {
- sb.append(getTimeZoneDisplayTime(tm.timeZone));
+ sb.append(getDisplayTimeZoneOffset(tm.timeZone));
}
break;
}
@@ -2077,18 +2106,19 @@ public class DateTimeUtil {
}
public static void toUserTimezone(TimeMeta tm, TimeZone timeZone) {
- tm.plusMillis(timeZone.getRawOffset());
+ tm.convertToLocalTime(timeZone);
}
public static void toUTCTimezone(TimeMeta tm, TimeZone timeZone) {
- tm.plusMillis(0 - timeZone.getRawOffset());
+ tm.convertToUTC(timeZone);
}
- public static String getTimeZoneDisplayTime(TimeZone timeZone) {
- return getTimeZoneDisplayTime(timeZone.getRawOffset() / 1000);
+ @VisibleForTesting
+ public static String getDisplayTimeZoneOffset(TimeZone timeZone, boolean dst) {
+ return getDisplayTimeZoneOffset((timeZone.getRawOffset() + (dst ? timeZone.getDSTSavings() : 0)) / 1000);
}
- public static String getTimeZoneDisplayTime(int totalSecs) {
+ public static String getDisplayTimeZoneOffset(int totalSecs) {
if (totalSecs == 0) {
return "";
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/main/java/org/apache/tajo/util/datetime/TimeMeta.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/util/datetime/TimeMeta.java b/tajo-common/src/main/java/org/apache/tajo/util/datetime/TimeMeta.java
index 3349f43..7202def 100644
--- a/tajo-common/src/main/java/org/apache/tajo/util/datetime/TimeMeta.java
+++ b/tajo-common/src/main/java/org/apache/tajo/util/datetime/TimeMeta.java
@@ -20,6 +20,8 @@ package org.apache.tajo.util.datetime;
import org.apache.tajo.util.datetime.DateTimeConstants.DateStyle;
+import java.util.TimeZone;
+
public class TimeMeta implements Comparable<TimeMeta> {
public int fsecs; // 1/1,000,000 secs
public int secs;
@@ -130,6 +132,24 @@ public class TimeMeta implements Comparable<TimeMeta> {
plusTime(millis * 1000);
}
+ public void convertToUTC(TimeZone zone) {
+ long timestamp = DateTimeUtil.toJulianTimestamp(this);
+
+ timestamp -= (getZonedOffset(timestamp, zone) * 1000L);
+ DateTimeUtil.toJulianTimeMeta(timestamp, this);
+ }
+
+ public void convertToLocalTime(TimeZone zone) {
+ long timestamp = DateTimeUtil.toJulianTimestamp(this);
+
+ timestamp += (getZonedOffset(timestamp, zone) * 1000L);
+ DateTimeUtil.toJulianTimeMeta(timestamp, this);
+ }
+
+ public int getZonedOffset(long julianTimestamp, TimeZone zone) {
+ return zone.getOffset(DateTimeUtil.julianTimeToJavaTime(julianTimestamp));
+ }
+
public void plusTime(long time) {
long timestamp = DateTimeUtil.toJulianTimestamp(this);
timestamp += time;
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/test/java/org/apache/tajo/datum/TestDateDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/datum/TestDateDatum.java b/tajo-common/src/test/java/org/apache/tajo/datum/TestDateDatum.java
index 2b787f5..c7014a6 100644
--- a/tajo-common/src/test/java/org/apache/tajo/datum/TestDateDatum.java
+++ b/tajo-common/src/test/java/org/apache/tajo/datum/TestDateDatum.java
@@ -117,9 +117,5 @@ public class TestDateDatum {
assertThat(theday.compareTo(thedaybefore) > 0, is(true));
assertThat(thedaybefore.compareTo(theday) > 0, is(false));
-
- TimestampDatum timestamp = DatumFactory.createTimestamp("2014-11-12 15:00:00.68");
-
- assertThat(timestamp.compareTo(theday) > 0, is(true));
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/test/java/org/apache/tajo/datum/TestIntervalDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/datum/TestIntervalDatum.java b/tajo-common/src/test/java/org/apache/tajo/datum/TestIntervalDatum.java
index 3175c51..b319c9c 100644
--- a/tajo-common/src/test/java/org/apache/tajo/datum/TestIntervalDatum.java
+++ b/tajo-common/src/test/java/org/apache/tajo/datum/TestIntervalDatum.java
@@ -64,8 +64,7 @@ public class TestIntervalDatum {
// date '2001-09-28' + integer '7' ==> date '2001-10-05'
Datum datum = DatumFactory.createDate(2001, 9, 28);
- Datum[] datums = new Datum[]{new Int2Datum((short) 7), new Int4Datum(7), new Int8Datum(7),
- new Float4Datum(7.0f), new Float8Datum(7.0f)};
+ Datum[] datums = new Datum[]{new Int2Datum((short) 7), new Int4Datum(7), new Int8Datum(7)};
for (int i = 0; i < datums.length; i++) {
Datum result = datum.plus(datums[i]);
@@ -78,20 +77,20 @@ public class TestIntervalDatum {
datum = DatumFactory.createDate(2001, 9, 28);
Datum result = datum.plus(new IntervalDatum(60 * 60 * 1000));
assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
- assertEquals("2001-09-28 01:00:00", result.asChars());
+ assertEquals(DatumFactory.parseTimestamp("2001-09-28 01:00:00", null), result);
// interval '1 hour' + date '2001-09-28' ==> timestamp '2001-09-28 01:00:00'
datum = new IntervalDatum(60 * 60 * 1000);
result = datum.plus(DatumFactory.createDate(2001, 9, 28));
assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
- assertEquals("2001-09-28 01:00:00", result.asChars());
+ assertEquals(DatumFactory.parseTimestamp("2001-09-28 01:00:00", null), result);
// date '2001-09-28' + time '03:00' ==> timestamp '2001-09-28 03:00:00'
datum = DatumFactory.createDate(2001, 9, 28);
TimeDatum time = new TimeDatum(DateTimeUtil.toTime(3, 0, 0, 0));
result = datum.plus(time);
assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
- assertEquals("2001-09-28 03:00:00", result.asChars());
+ assertEquals(DatumFactory.parseTimestamp("2001-09-28 03:00:00", null), result);
// interval '1 day' + interval '1 hour' interval '1 day 01:00:00'
datum = new IntervalDatum(IntervalDatum.DAY_MILLIS);
@@ -103,7 +102,7 @@ public class TestIntervalDatum {
datum = new TimestampDatum(DateTimeUtil.toJulianTimestamp(2001, 9, 28, 1, 0, 0, 0));
result = datum.plus(new IntervalDatum(23 * 60 * 60 * 1000));
assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
- assertEquals("2001-09-29 00:00:00", result.asChars());
+ assertEquals(DatumFactory.parseTimestamp("2001-09-29 00:00:00", null), result);
// time '01:00' + interval '3 hours' ==> time '04:00:00'
datum = new TimeDatum(DateTimeUtil.toTime(1, 0, 0, 0));
@@ -132,14 +131,14 @@ public class TestIntervalDatum {
datum = DatumFactory.createDate(2001, 9, 28);
result = datum.minus(new IntervalDatum(1 * 60 * 60 * 1000));
assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
- assertEquals("2001-09-27 23:00:00", result.asChars());
+ assertEquals(DatumFactory.parseTimestamp("2001-09-27 23:00:00", null), result);
// date '2001-09-28' - interval '1 day 1 hour' ==> timestamp '2001-09-26 23:00:00'
// In this case all datums are UTC
datum = DatumFactory.createDate(2001, 9, 28);
result = datum.minus(new IntervalDatum(IntervalDatum.DAY_MILLIS + 1 * 60 * 60 * 1000));
assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
- assertEquals("2001-09-26 23:00:00", result.asChars());
+ assertEquals(DatumFactory.parseTimestamp("2001-09-26 23:00:00", null), result);
// time '05:00' - time '03:00' ==> interval '02:00:00'
datum = new TimeDatum(DateTimeUtil.toTime(5, 0, 0, 0));
@@ -158,7 +157,7 @@ public class TestIntervalDatum {
datum = new TimestampDatum(DateTimeUtil.toJulianTimestamp(2001, 9, 28, 23, 0, 0, 0));
result = datum.minus(new IntervalDatum(23 * 60 * 60 * 1000));
assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
- assertEquals("2001-09-28 00:00:00", result.asChars());
+ assertEquals(DatumFactory.parseTimestamp("2001-09-28 00:00:00", null), result);
// interval '1 day' - interval '1 hour' ==> interval '1 day -01:00:00'
datum = new IntervalDatum(IntervalDatum.DAY_MILLIS);
@@ -204,6 +203,6 @@ public class TestIntervalDatum {
datum = new TimestampDatum(DateTimeUtil.toJulianTimestamp(2001, 8, 31, 1, 0, 0, 0));
result = datum.plus(new IntervalDatum(1, 0));
assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
- assertEquals("2001-09-30 01:00:00", result.asChars());
+ assertEquals(DatumFactory.parseTimestamp("2001-09-30 01:00:00", null), result);
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/test/java/org/apache/tajo/datum/TestTimeDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/datum/TestTimeDatum.java b/tajo-common/src/test/java/org/apache/tajo/datum/TestTimeDatum.java
index 457ff41..7058b52 100644
--- a/tajo-common/src/test/java/org/apache/tajo/datum/TestTimeDatum.java
+++ b/tajo-common/src/test/java/org/apache/tajo/datum/TestTimeDatum.java
@@ -18,8 +18,8 @@
package org.apache.tajo.datum;
-import org.apache.tajo.common.TajoDataTypes.Type;
import org.apache.tajo.common.TajoDataTypes.DataType;
+import org.apache.tajo.common.TajoDataTypes.Type;
import org.apache.tajo.exception.TajoRuntimeException;
import org.apache.tajo.json.CommonGsonHelper;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/test/java/org/apache/tajo/datum/TestTimestampDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/datum/TestTimestampDatum.java b/tajo-common/src/test/java/org/apache/tajo/datum/TestTimestampDatum.java
index 68b34a6..2bbb92d 100644
--- a/tajo-common/src/test/java/org/apache/tajo/datum/TestTimestampDatum.java
+++ b/tajo-common/src/test/java/org/apache/tajo/datum/TestTimestampDatum.java
@@ -92,7 +92,7 @@ public class TestTimestampDatum {
public void testAsText2() {
// TAJO-1366
TimestampDatum datum = DatumFactory.createTimestamp("Mon Nov 03 00:03:00 +0000 2014");
- assertEquals("2014-11-03 00:03:00", datum.asChars());
+ assertEquals("2014-11-03 00:03:00", TimestampDatum.asChars(datum.asTimeMeta(), TimeZone.getTimeZone("+0000"), true));
}
@Test
@@ -120,7 +120,7 @@ public class TestTimestampDatum {
@Test
public final void testTimeZone() {
TimestampDatum datum = new TimestampDatum(DateTimeUtil.toJulianTimestamp(2014, 5, 1, 15, 20, 30, 0));
- assertEquals("2014-05-01 15:20:30", datum.asChars());
+ assertEquals("2014-05-01 15:20:30", TimestampDatum.asChars(datum.asTimeMeta(), TimeZone.getTimeZone("GMT"), true));
assertEquals("2014-05-02 00:20:30+09", TimestampDatum.asChars(datum.asTimeMeta(), TimeZone.getTimeZone("GMT+9"), true));
}
@@ -195,10 +195,6 @@ public class TestTimestampDatum {
assertThat(theday.compareTo(thedaybefore) > 0, is(true));
assertThat(thedaybefore.compareTo(theday) > 0, is(false));
-
- DateDatum date = DatumFactory.createDate("2014-11-12");
-
- assertThat(theday.compareTo(date) > 0, is(true));
}
@Test
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeUtil.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeUtil.java b/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeUtil.java
index ae4a517..75f3ee7 100644
--- a/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeUtil.java
+++ b/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeUtil.java
@@ -384,11 +384,13 @@ public class TestDateTimeUtil {
@Test
public void testGetTimeZoneDisplayTime() {
- assertEquals("", DateTimeUtil.getTimeZoneDisplayTime(TimeZone.getTimeZone("GMT")));
- assertEquals("+09", DateTimeUtil.getTimeZoneDisplayTime(TimeZone.getTimeZone("GMT+9")));
- assertEquals("+09:10", DateTimeUtil.getTimeZoneDisplayTime(TimeZone.getTimeZone("GMT+9:10")));
- assertEquals("-09", DateTimeUtil.getTimeZoneDisplayTime(TimeZone.getTimeZone("GMT-9")));
- assertEquals("-09:10", DateTimeUtil.getTimeZoneDisplayTime(TimeZone.getTimeZone("GMT-9:10")));
+ assertEquals("", DateTimeUtil.getDisplayTimeZoneOffset(TimeZone.getTimeZone("GMT"), false));
+ assertEquals("+09", DateTimeUtil.getDisplayTimeZoneOffset(TimeZone.getTimeZone("GMT+9"), false));
+ assertEquals("+09:10", DateTimeUtil.getDisplayTimeZoneOffset(TimeZone.getTimeZone("GMT+9:10"), false));
+ assertEquals("-09", DateTimeUtil.getDisplayTimeZoneOffset(TimeZone.getTimeZone("GMT-9"), false));
+ assertEquals("-09:10", DateTimeUtil.getDisplayTimeZoneOffset(TimeZone.getTimeZone("GMT-9:10"), false));
+ assertEquals("-07", DateTimeUtil.getDisplayTimeZoneOffset(TimeZone.getTimeZone("America/Los_Angeles"), true));
+ assertEquals("-08", DateTimeUtil.getDisplayTimeZoneOffset(TimeZone.getTimeZone("America/Los_Angeles"), false));
}
@Test
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestDDLBuilder.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestDDLBuilder.java b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestDDLBuilder.java
index 8790a38..4bef226 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestDDLBuilder.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestDDLBuilder.java
@@ -20,14 +20,18 @@ package org.apache.tajo.cli.tools;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.compress.GzipCodec;
+import org.apache.tajo.BuiltinStorages;
import org.apache.tajo.catalog.*;
import org.apache.tajo.catalog.partition.PartitionMethodDesc;
import org.apache.tajo.catalog.proto.CatalogProtos;
import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.storage.StorageConstants;
import org.apache.tajo.util.JavaResourceUtil;
import org.junit.Test;
+import java.util.TimeZone;
+
import static org.junit.Assert.*;
@@ -35,6 +39,7 @@ public class TestDDLBuilder {
private static final Schema schema1;
private static final TableMeta meta1;
private static final PartitionMethodDesc partitionMethod1;
+ private static final TajoConf conf;
static {
schema1 = SchemaBuilder.builder()
@@ -42,8 +47,9 @@ public class TestDDLBuilder {
.add("addr", TajoDataTypes.Type.TEXT)
.build();
- meta1 = CatalogUtil.newTableMeta("TEXT");
- meta1.putProperty(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
+ conf = new TajoConf();
+ conf.setSystemTimezone(TimeZone.getTimeZone("Asia/Seoul"));
+ meta1 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
meta1.putProperty(StorageConstants.COMPRESSION_CODEC, GzipCodec.class.getName());
Schema expressionSchema = SchemaBuilder.builder()
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestTajoDump.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestTajoDump.java b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestTajoDump.java
index 937b75c..57a6aa3 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestTajoDump.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestTajoDump.java
@@ -49,7 +49,9 @@ public class TestTajoDump extends QueryTestCaseBase {
TajoDump.dump(client, userInfo, getCurrentDatabase(), false, false, false, printWriter);
printWriter.flush();
printWriter.close();
- assertStrings(new String(bos.toByteArray()));
+
+ assertOutputResult("testDump1.result", new String(bos.toByteArray()), new String[]{"${table.timezone}"},
+ new String[]{testingCluster.getConfiguration().getSystemTimezone().getID()});
bos.close();
} finally {
executeString("DROP TABLE \"" + getCurrentDatabase() + "\".\"TableName1\"");
@@ -70,7 +72,9 @@ public class TestTajoDump extends QueryTestCaseBase {
TajoDump.dump(client, userInfo, getCurrentDatabase(), false, false, false, printWriter);
printWriter.flush();
printWriter.close();
- assertStrings(new String(bos.toByteArray()));
+
+ assertOutputResult("testDump2.result", new String(bos.toByteArray()), new String[]{"${table.timezone}"},
+ new String[]{testingCluster.getConfiguration().getSystemTimezone().getID()});
bos.close();
} finally {
executeString("DROP TABLE \"" + getCurrentDatabase() + "\".\"TableName2\"");
@@ -95,8 +99,10 @@ public class TestTajoDump extends QueryTestCaseBase {
printWriter.flush();
printWriter.close();
- assertOutputResult("testDump3.result", new String(bos.toByteArray()), new String[]{"${index.path}"},
- new String[]{TablespaceManager.getDefault().getTableUri(getCurrentDatabase(), "test_idx").toString()});
+ assertOutputResult("testDump3.result", new String(bos.toByteArray()),
+ new String[]{"${index.path}", "${table.timezone}"},
+ new String[]{TablespaceManager.getDefault().getTableUri(getCurrentDatabase(), "test_idx").toString(),
+ testingCluster.getConfiguration().getSystemTimezone().getID()});
bos.close();
} finally {
executeString("DROP INDEX test_idx");
@@ -131,13 +137,12 @@ public class TestTajoDump extends QueryTestCaseBase {
printWriter.flush();
printWriter.close();
- String[] paramValues = new String[] {
- TablespaceManager.getDefault().getTableUri(getCurrentDatabase(), "TableName3").toString()
- , TablespaceManager.getDefault().getTableUri(getCurrentDatabase(), "TableName4").toString()
- };
+ assertOutputResult("testPartitionsDump.result", new String(bos.toByteArray()),
+ new String[]{"${partition.path1}", "${partition.path2}", "${table.timezone}"},
+ new String[]{TablespaceManager.getDefault().getTableUri(getCurrentDatabase(), "TableName3").toString(),
+ TablespaceManager.getDefault().getTableUri(getCurrentDatabase(), "TableName4").toString(),
+ testingCluster.getConfiguration().getSystemTimezone().getID()});
- assertOutputResult("testPartitionsDump.result", new String(bos.toByteArray())
- , new String[]{"${partition.path1}", "${partition.path2}"}, paramValues);
bos.close();
} finally {
executeString("DROP TABLE \"" + getCurrentDatabase() + "\".\"TableName3\"");
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java
index c210a24..c148298 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java
@@ -251,8 +251,9 @@ public class TestTajoCli {
String consoleResult = new String(out.toByteArray());
if (!cluster.isHiveCatalogStoreRunning()) {
- assertOutputResult(resultFileName, consoleResult, new String[]{"${table.path}"},
- new String[]{TablespaceManager.getDefault().getTableUri("default", tableName).toString()});
+ assertOutputResult(resultFileName, consoleResult, new String[]{"${table.timezone}", "${table.path}"},
+ new String[]{cluster.getConfiguration().getSystemTimezone().getID(),
+ TablespaceManager.getDefault().getTableUri("default", tableName).toString()});
}
}
@@ -485,10 +486,12 @@ public class TestTajoCli {
tajoCli.executeMetaCommand("\\set TIMEZONE GMT+0");
tajoCli.executeScript("create table " + tableName + " (col1 TIMESTAMP)");
tajoCli.executeScript("insert into " + tableName + " select to_timestamp(0)");
+ out.reset();
+
tajoCli.executeScript("select * from " + tableName);
String consoleResult = new String(out.toByteArray());
tajoCli.executeScript("DROP TABLE " + tableName + " PURGE");
- assertTrue(consoleResult.contains("1970-01-01 00:00:00"));
+ assertEquals("1970-01-01 00:00:00", consoleResult.split("\n")[2]);
}
@Test
@@ -497,10 +500,12 @@ public class TestTajoCli {
tajoCli.executeMetaCommand("\\set TIMEZONE GMT+1");
tajoCli.executeScript("create table " + tableName + " (col1 TIMESTAMP)");
tajoCli.executeScript("insert into " + tableName + " select to_timestamp(0)");
+ out.reset();
+
tajoCli.executeScript("select * from " + tableName);
String consoleResult = new String(out.toByteArray());
tajoCli.executeScript("DROP TABLE " + tableName + " PURGE");
- assertTrue(consoleResult.contains("1970-01-01 00:00:00"));
+ assertEquals("1970-01-01 01:00:00", consoleResult.split("\n")[2]);
}
@Test(timeout = 3000)