TAJO-1450: Encapsulate Datum in Tuple. Closes #596
Signed-off-by: Jihoon Son <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/tajo/repo Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/5c2aee23 Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/5c2aee23 Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/5c2aee23 Branch: refs/heads/master Commit: 5c2aee2369ebcbe5d2691c346bd7cd4207b68ff4 Parents: 03294e1 Author: navis.ryu <[email protected]> Authored: Tue Jun 2 11:58:12 2015 +0900 Committer: Jihoon Son <[email protected]> Committed: Tue Jun 2 11:58:12 2015 +0900 ---------------------------------------------------------------------- CHANGES | 3 + .../org/apache/tajo/jdbc/TajoResultSetBase.java | 306 +++++++------------ .../org/apache/tajo/storage/RowStoreUtil.java | 48 ++- .../java/org/apache/tajo/datum/DateDatum.java | 34 +-- .../main/java/org/apache/tajo/datum/Datum.java | 7 + .../org/apache/tajo/datum/DatumFactory.java | 4 +- .../java/org/apache/tajo/datum/Float4Datum.java | 6 +- .../java/org/apache/tajo/datum/Float8Datum.java | 6 +- .../java/org/apache/tajo/datum/Int2Datum.java | 6 +- .../java/org/apache/tajo/datum/Int4Datum.java | 6 +- .../java/org/apache/tajo/datum/Int8Datum.java | 6 +- .../org/apache/tajo/datum/IntervalDatum.java | 6 +- .../java/org/apache/tajo/datum/TimeDatum.java | 22 +- .../org/apache/tajo/datum/TimestampDatum.java | 45 ++- .../org/apache/tajo/storage/EmptyTuple.java | 141 ++++++++- .../java/org/apache/tajo/storage/NullTuple.java | 43 ++- .../java/org/apache/tajo/storage/Tuple.java | 79 ++--- .../java/org/apache/tajo/storage/VTuple.java | 218 +++++++------ .../apache/tajo/util/datetime/DateTimeUtil.java | 12 +- .../apache/tajo/datum/TestTimestampDatum.java | 2 +- .../apache/tajo/util/TestDateTimeFormat.java | 2 +- .../tajo/engine/function/builtin/AvgDouble.java | 10 +- .../tajo/engine/function/builtin/AvgFloat.java | 5 +- .../tajo/engine/function/builtin/AvgInt.java | 5 +- .../tajo/engine/function/builtin/AvgLong.java | 10 +- .../tajo/engine/function/builtin/Coalesce.java | 5 +- .../tajo/engine/function/builtin/CountRows.java | 2 +- .../engine/function/builtin/CountValue.java | 2 +- .../function/builtin/CountValueDistinct.java | 13 +- .../tajo/engine/function/builtin/Date.java | 2 +- .../tajo/engine/function/builtin/LastValue.java | 5 +- .../tajo/engine/function/builtin/Lead.java | 6 +- .../tajo/engine/function/builtin/Max.java | 10 +- .../tajo/engine/function/builtin/Min.java | 4 +- .../tajo/engine/function/builtin/RandomInt.java | 2 +- .../tajo/engine/function/builtin/SumDouble.java | 5 +- .../function/builtin/SumDoubleDistinct.java | 10 +- .../tajo/engine/function/builtin/SumFloat.java | 5 +- .../function/builtin/SumFloatDistinct.java | 10 +- .../engine/function/builtin/SumIntDistinct.java | 10 +- .../tajo/engine/function/builtin/SumLong.java | 5 +- .../function/builtin/SumLongDistinct.java | 10 +- .../tajo/engine/function/builtin/Variance.java | 13 +- .../tajo/engine/function/datetime/AddDays.java | 4 +- .../engine/function/datetime/AddMonths.java | 6 +- .../function/datetime/DatePartFromDate.java | 67 ++-- .../function/datetime/DatePartFromTime.java | 16 +- .../datetime/DatePartFromTimestamp.java | 14 +- .../datetime/DateTimePartFromUnixTimestamp.java | 26 +- .../function/datetime/ToCharTimestamp.java | 10 +- .../tajo/engine/function/datetime/ToDate.java | 6 +- .../function/datetime/ToTimestampInt.java | 5 +- .../function/datetime/ToTimestampText.java | 7 +- .../function/geoip/GeoIPCountryInet4.java | 5 +- .../engine/function/geoip/GeoIPCountryText.java | 5 +- .../function/geoip/GeoIPInCountryInet4.java | 6 +- .../function/geoip/GeoIPInCountryText.java | 6 +- .../function/json/JsonExtractPathText.java | 9 +- .../tajo/engine/function/math/AbsDouble.java | 5 +- .../tajo/engine/function/math/AbsFloat.java | 5 +- .../tajo/engine/function/math/AbsInt.java | 5 +- .../tajo/engine/function/math/AbsLong.java | 5 +- .../apache/tajo/engine/function/math/Acos.java | 5 +- .../apache/tajo/engine/function/math/Asin.java | 5 +- .../apache/tajo/engine/function/math/Atan.java | 5 +- .../apache/tajo/engine/function/math/Atan2.java | 6 +- .../apache/tajo/engine/function/math/Cbrt.java | 5 +- .../apache/tajo/engine/function/math/Ceil.java | 5 +- .../apache/tajo/engine/function/math/Cos.java | 5 +- .../tajo/engine/function/math/Degrees.java | 5 +- .../apache/tajo/engine/function/math/Div.java | 12 +- .../apache/tajo/engine/function/math/Exp.java | 5 +- .../apache/tajo/engine/function/math/Floor.java | 5 +- .../apache/tajo/engine/function/math/Mod.java | 12 +- .../apache/tajo/engine/function/math/Pow.java | 6 +- .../tajo/engine/function/math/Radians.java | 5 +- .../apache/tajo/engine/function/math/Round.java | 5 +- .../tajo/engine/function/math/RoundFloat8.java | 9 +- .../apache/tajo/engine/function/math/Sign.java | 5 +- .../apache/tajo/engine/function/math/Sin.java | 5 +- .../apache/tajo/engine/function/math/Sqrt.java | 5 +- .../apache/tajo/engine/function/math/Tan.java | 5 +- .../tajo/engine/function/string/Ascii.java | 7 +- .../tajo/engine/function/string/BTrim.java | 10 +- .../tajo/engine/function/string/BitLength.java | 8 +- .../tajo/engine/function/string/CharLength.java | 7 +- .../apache/tajo/engine/function/string/Chr.java | 7 +- .../tajo/engine/function/string/Concat.java | 9 +- .../tajo/engine/function/string/Concat_ws.java | 20 +- .../tajo/engine/function/string/Decode.java | 17 +- .../tajo/engine/function/string/Digest.java | 8 +- .../tajo/engine/function/string/Encode.java | 18 +- .../tajo/engine/function/string/FindInSet.java | 21 +- .../tajo/engine/function/string/InitCap.java | 7 +- .../tajo/engine/function/string/LTrim.java | 10 +- .../tajo/engine/function/string/Left.java | 14 +- .../tajo/engine/function/string/Length.java | 5 +- .../tajo/engine/function/string/Locate.java | 15 +- .../tajo/engine/function/string/Lower.java | 7 +- .../tajo/engine/function/string/Lpad.java | 23 +- .../apache/tajo/engine/function/string/Md5.java | 11 +- .../engine/function/string/OctetLength.java | 5 +- .../tajo/engine/function/string/QuoteIdent.java | 6 +- .../tajo/engine/function/string/RTrim.java | 10 +- .../engine/function/string/RegexpReplace.java | 51 ++-- .../tajo/engine/function/string/Repeat.java | 10 +- .../tajo/engine/function/string/Reverse.java | 7 +- .../tajo/engine/function/string/Right.java | 12 +- .../tajo/engine/function/string/Rpad.java | 31 +- .../tajo/engine/function/string/SplitPart.java | 9 +- .../tajo/engine/function/string/StrPos.java | 15 +- .../tajo/engine/function/string/StrPosb.java | 14 +- .../tajo/engine/function/string/Substr.java | 37 +-- .../tajo/engine/function/string/ToBin.java | 5 +- .../tajo/engine/function/string/ToCharLong.java | 4 +- .../tajo/engine/function/string/ToHex.java | 5 +- .../tajo/engine/function/string/Upper.java | 7 +- .../tajo/engine/function/window/FirstValue.java | 6 +- .../apache/tajo/engine/function/window/Lag.java | 8 +- .../tajo/engine/function/window/Rank.java | 2 +- .../engine/planner/RangePartitionAlgorithm.java | 66 ++-- .../engine/planner/UniformRangePartition.java | 208 +++++++------ .../planner/physical/BSTIndexScanExec.java | 3 +- .../planner/physical/CommonHashJoinExec.java | 4 +- .../planner/physical/ComparableVector.java | 10 +- .../DistinctGroupbyFirstAggregationExec.java | 14 +- .../DistinctGroupbyHashAggregationExec.java | 10 +- .../DistinctGroupbySecondAggregationExec.java | 8 +- .../DistinctGroupbySortAggregationExec.java | 2 +- .../DistinctGroupbyThirdAggregationExec.java | 10 +- .../planner/physical/HashAggregateExec.java | 4 +- .../HashBasedColPartitionStoreExec.java | 4 +- .../engine/planner/physical/HashJoinExec.java | 6 +- .../planner/physical/HashLeftOuterJoinExec.java | 3 +- .../planner/physical/HashPartitioner.java | 2 +- .../planner/physical/JoinTupleComparator.java | 4 +- .../physical/RangeShuffleFileWriteExec.java | 23 +- .../planner/physical/SortAggregateExec.java | 9 +- .../SortBasedColPartitionStoreExec.java | 5 +- .../engine/planner/physical/WindowAggExec.java | 8 +- .../org/apache/tajo/engine/utils/TupleUtil.java | 4 +- .../NonForwardQueryResultSystemScanner.java | 21 +- .../apache/tajo/master/exec/QueryExecutor.java | 2 +- .../apache/tajo/engine/eval/ExprTestBase.java | 11 +- .../tajo/engine/eval/TestEvalTreeUtil.java | 4 +- .../tajo/engine/eval/TestSQLExpression.java | 7 +- .../planner/TestUniformRangePartition.java | 216 ++++++------- .../planner/physical/TestBNLJoinExec.java | 10 +- .../planner/physical/TestBSTIndexExec.java | 4 +- .../planner/physical/TestExternalSortExec.java | 2 +- .../physical/TestFullOuterHashJoinExec.java | 6 +- .../physical/TestFullOuterMergeJoinExec.java | 8 +- .../planner/physical/TestHashAntiJoinExec.java | 10 +- .../planner/physical/TestHashJoinExec.java | 10 +- .../planner/physical/TestHashPartitioner.java | 10 +- .../planner/physical/TestHashSemiJoinExec.java | 10 +- .../physical/TestLeftOuterHashJoinExec.java | 6 +- .../planner/physical/TestMergeJoinExec.java | 10 +- .../engine/planner/physical/TestNLJoinExec.java | 10 +- .../planner/physical/TestPhysicalPlanner.java | 68 ++--- .../physical/TestProgressExternalSortExec.java | 2 +- .../physical/TestRightOuterHashJoinExec.java | 6 +- .../physical/TestRightOuterMergeJoinExec.java | 8 +- .../engine/planner/physical/TestSortExec.java | 8 +- .../planner/physical/TestTupleSorter.java | 4 +- .../apache/tajo/engine/util/TestTupleUtil.java | 23 +- .../TestNonForwardQueryResultSystemScanner.java | 16 +- .../org/apache/tajo/storage/TestRowFile.java | 4 +- .../org/apache/tajo/jdbc/MetaDataTuple.java | 57 ++-- .../apache/tajo/jdbc/TajoMetaDataResultSet.java | 14 +- .../org/apache/tajo/plan/ExprAnnotator.java | 2 +- .../org/apache/tajo/plan/expr/FieldEval.java | 2 +- .../plan/function/PythonAggFunctionInvoke.java | 2 +- .../function/python/PythonScriptEngine.java | 4 +- .../plan/function/stream/CSVLineSerializer.java | 12 +- .../stream/TextFieldSerializerDeserializer.java | 4 +- .../tajo/storage/BaseTupleComparator.java | 4 +- .../storage/BinarySerializerDeserializer.java | 52 ++-- .../org/apache/tajo/storage/FrameTuple.java | 76 +++-- .../java/org/apache/tajo/storage/LazyTuple.java | 57 ++-- .../org/apache/tajo/storage/RowStoreUtil.java | 44 +-- .../tajo/storage/SerializerDeserializer.java | 7 +- .../apache/tajo/storage/TableStatistics.java | 31 +- .../storage/TextSerializerDeserializer.java | 67 ++-- .../org/apache/tajo/storage/TupleRange.java | 2 - .../apache/tajo/tuple/offheap/HeapTuple.java | 51 ++-- .../apache/tajo/tuple/offheap/UnSafeTuple.java | 55 ++-- .../org/apache/tajo/storage/TestFrameTuple.java | 14 +- .../org/apache/tajo/storage/TestLazyTuple.java | 26 +- .../tajo/storage/TestTupleComparator.java | 7 +- .../org/apache/tajo/storage/TestVTuple.java | 23 +- .../tajo/tuple/offheap/TestOffHeapRowBlock.java | 26 +- .../storage/hbase/AbstractHBaseAppender.java | 15 +- .../HBaseBinarySerializerDeserializer.java | 35 +++ .../tajo/storage/hbase/HBasePutAppender.java | 6 +- .../tajo/storage/hbase/HBaseTablespace.java | 2 +- .../hbase/HBaseTextSerializerDeserializer.java | 9 + .../java/org/apache/tajo/storage/CSVFile.java | 9 +- .../storage/FieldSerializerDeserializer.java | 7 +- .../java/org/apache/tajo/storage/RawFile.java | 4 +- .../java/org/apache/tajo/storage/RowFile.java | 28 +- .../apache/tajo/storage/avro/AvroAppender.java | 5 +- .../tajo/storage/json/JsonLineSerializer.java | 2 +- .../tajo/storage/parquet/ParquetAppender.java | 2 +- .../storage/parquet/TajoRecordConverter.java | 2 +- .../tajo/storage/parquet/TajoWriteSupport.java | 26 +- .../org/apache/tajo/storage/rcfile/RCFile.java | 22 +- .../sequencefile/SequenceFileAppender.java | 23 +- .../sequencefile/SequenceFileScanner.java | 3 +- .../tajo/storage/text/CSVLineDeserializer.java | 11 +- .../tajo/storage/text/CSVLineSerializer.java | 5 +- .../text/TextFieldSerializerDeserializer.java | 38 ++- .../tajo/storage/TestDelimitedTextFile.java | 4 +- .../tajo/storage/TestFileStorageManager.java | 5 +- .../apache/tajo/storage/TestFileSystems.java | 9 +- .../apache/tajo/storage/TestMergeScanner.java | 20 +- .../org/apache/tajo/storage/TestStorages.java | 57 ++-- .../apache/tajo/storage/index/TestBSTIndex.java | 92 +++--- .../index/TestSingleCSVFileBSTIndex.java | 24 +- .../apache/tajo/storage/json/TestJsonSerDe.java | 3 +- .../tajo/storage/parquet/TestReadWrite.java | 2 +- 221 files changed, 2023 insertions(+), 1940 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/CHANGES ---------------------------------------------------------------------- diff --git a/CHANGES b/CHANGES index 85c28ce..44a8939 100644 --- a/CHANGES +++ b/CHANGES @@ -287,6 +287,9 @@ Release 0.11.0 - unreleased TASKS + TAJO-1450: Encapsulate Datum in Tuple. (Contributed by navis, + Committed by jihoon) + TAJO-1583: Remove ServerCallable in RPC client. (jinho) TAJO-1587: Upgrade java version to 1.7 for Travis CI. (jihoon) http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/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 77cbbf2..ed06cf3 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 @@ -69,8 +69,8 @@ public abstract class TajoResultSetBase implements ResultSet { wasNull = false; } - private void handleNull(Datum d) { - wasNull = (d instanceof NullDatum); + private boolean handleNull(Tuple tuple, int index) { + return wasNull = tuple.isBlankOrNull(index); } public Tuple getCurrentTuple() { @@ -84,274 +84,211 @@ public abstract class TajoResultSetBase implements ResultSet { @Override public boolean getBoolean(int fieldId) throws SQLException { - Datum datum = cur.get(fieldId - 1); - handleNull(datum); - if (wasNull) { - return false; - } - return datum.asBool(); + return getBoolean(cur, fieldId - 1); } @Override public boolean getBoolean(String colName) throws SQLException { - Datum datum = cur.get(findColumn(colName)); - handleNull(datum); - if (wasNull) { - return false; - } - return datum.asBool(); + return getBoolean(cur, findColumn(colName)); + } + + private boolean getBoolean(Tuple tuple, int index) { + return handleNull(tuple, index) ? false : tuple.getBool(index); } @Override public byte getByte(int fieldId) throws SQLException { - Datum datum = cur.get(fieldId - 1); - handleNull(datum); - if (wasNull) { - return 0; - } - return datum.asByte(); + return getByte(cur, fieldId - 1); } @Override public byte getByte(String name) throws SQLException { - Datum datum = cur.get(findColumn(name)); - handleNull(datum); - if (wasNull) { - return 0; - } - return datum.asByte(); + return getByte(cur, findColumn(name)); + } + + private byte getByte(Tuple tuple, int index) { + return handleNull(tuple, index) ? 0 : tuple.getByte(index); } @Override public byte[] getBytes(int fieldId) throws SQLException { - Datum datum = cur.get(fieldId - 1); - handleNull(datum); - if (wasNull) { - return null; - } - return datum.asByteArray(); + return getBytes(cur, fieldId - 1); } @Override public byte[] getBytes(String name) throws SQLException { - Datum datum = cur.get(findColumn(name)); - handleNull(datum); - if (wasNull) { - return null; - } - return datum.asByteArray(); + return getBytes(cur, findColumn(name)); + } + + private byte[] getBytes(Tuple tuple, int index) { + return handleNull(tuple, index) ? null : tuple.getBytes(index); } @Override public double getDouble(int fieldId) throws SQLException { - Datum datum = cur.get(fieldId - 1); - handleNull(datum); - if (wasNull) { - return 0.0d; - } - return datum.asFloat8(); + return getDouble(cur, fieldId - 1); } @Override public double getDouble(String name) throws SQLException { - Datum datum = cur.get(findColumn(name)); - handleNull(datum); - if (wasNull) { - return 0.0d; - } - return datum.asFloat8(); + return getDouble(cur, findColumn(name)); + } + + private double getDouble(Tuple tuple, int index) { + return handleNull(tuple, index) ? 0.0d : tuple.getFloat8(index); } @Override public float getFloat(int fieldId) throws SQLException { - Datum datum = cur.get(fieldId - 1); - handleNull(datum); - if (wasNull) { - return 0.0f; - } - return datum.asFloat4(); + return getFloat(cur, fieldId - 1); } @Override public float getFloat(String name) throws SQLException { - Datum datum = cur.get(findColumn(name)); - handleNull(datum); - if (wasNull) { - return 0.0f; - } - return datum.asFloat4(); + return getFloat(cur, findColumn(name)); + } + + private float getFloat(Tuple tuple, int index) throws SQLException { + return handleNull(tuple, index) ? 0.0f : tuple.getFloat4(index); } @Override public int getInt(int fieldId) throws SQLException { - Datum datum = cur.get(fieldId - 1); - handleNull(datum); - if (wasNull) { - return 0; - } - return datum.asInt4(); + return getInt(cur, fieldId - 1); } @Override public int getInt(String name) throws SQLException { - Datum datum = cur.get(findColumn(name)); - handleNull(datum); - if (wasNull) { - return 0; - } - return datum.asInt4(); + return getInt(cur, findColumn(name)); + } + + private int getInt(Tuple tuple, int index) throws SQLException { + return handleNull(tuple, index) ? 0 : tuple.getInt4(index); } @Override public long getLong(int fieldId) throws SQLException { - Datum datum = cur.get(fieldId - 1); - handleNull(datum); - if (wasNull) { - return 0; - } - return datum.asInt8(); + return getLong(cur, fieldId - 1); } @Override public long getLong(String name) throws SQLException { - Datum datum = cur.get(findColumn(name)); - handleNull(datum); - if (wasNull) { - return 0; - } - return datum.asInt8(); + return getLong(cur, findColumn(name)); + } + + private long getLong(Tuple tuple, int index) throws SQLException { + return handleNull(tuple, index) ? 0 : tuple.getInt8(index); } @Override public Object getObject(int fieldId) throws SQLException { - Datum d = cur.get(fieldId - 1); - handleNull(d); + return getObject(cur, fieldId - 1); + } - if (wasNull) { + @Override + public Object getObject(String name) throws SQLException { + return getObject(cur, findColumn(name)); + } + + private Object getObject(Tuple tuple, int index) { + if (handleNull(tuple, index)) { return null; } - TajoDataTypes.Type dataType = schema.getColumn(fieldId - 1).getDataType().getType(); + + TajoDataTypes.Type dataType = schema.getColumn(index).getDataType().getType(); switch(dataType) { - case BOOLEAN: return d.asBool(); + case BOOLEAN: return tuple.getBool(index); case INT1: - case INT2: return d.asInt2(); - case INT4: return d.asInt4(); - case INT8: return d.asInt8(); + case INT2: return tuple.getInt2(index); + case INT4: return tuple.getInt4(index); + case INT8: return tuple.getInt8(index); case TEXT: case CHAR: - case VARCHAR: return d.asChars(); - case FLOAT4: return d.asFloat4(); - case FLOAT8: return d.asFloat8(); - case NUMERIC: return d.asFloat8(); + case VARCHAR: return tuple.getText(index); + case FLOAT4: return tuple.getFloat4(index); + case FLOAT8: return tuple.getFloat8(index); + case NUMERIC: return tuple.getFloat8(index); case DATE: { - return getDate((DateDatum)d, timezone); + return toDate(tuple.getTimeDate(index), timezone); } case TIME: { - return getTime((TimeDatum)d, timezone); + return toTime(tuple.getTimeDate(index), timezone); } case TIMESTAMP: { - return getTimestamp((TimestampDatum) d, timezone); + return toTimestamp(tuple.getTimeDate(index), timezone); } - default: return d.asChars(); + default: + return tuple.getText(index); } } @Override - public Object getObject(String name) throws SQLException { - return getObject(findColumn(name) + 1); - } - - @Override public short getShort(int fieldId) throws SQLException { - Datum datum = cur.get(fieldId - 1); - handleNull(datum); - if (wasNull) { - return 0; - } - return datum.asInt2(); + return getShort(cur, fieldId - 1); } @Override public short getShort(String name) throws SQLException { - Datum datum = cur.get(findColumn(name)); - handleNull(datum); - if (wasNull) { - return 0; - } - return datum.asInt2(); + return getShort(cur, findColumn(name)); + } + + private short getShort(Tuple tuple, int index) throws SQLException { + return handleNull(tuple, index) ? 0 : tuple.getInt2(index); } @Override public String getString(int fieldId) throws SQLException { - Datum datum = cur.get(fieldId - 1); - return getString(datum, fieldId); + return getString(cur, fieldId - 1); } @Override public String getString(String name) throws SQLException { - int id = findColumn(name); - Datum datum = cur.get(id); - return getString(datum, id + 1); + return getString(cur, findColumn(name)); } - private String getString(Datum datum, int fieldId) throws SQLException { - handleNull(datum); - - if (wasNull) { + private String getString(Tuple tuple, int index) throws SQLException { + if (handleNull(tuple, index)) { return null; } - TajoDataTypes.Type dataType = datum.type(); - - switch(dataType) { + switch(tuple.type(index)) { case BOOLEAN: - return String.valueOf(datum.asBool()); - case TIME: { - return ((TimeDatum)datum).asChars(timezone, false); - } - case TIMESTAMP: { - return ((TimestampDatum)datum).asChars(timezone, false); - } + 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 : - return datum.asChars(); + return tuple.getText(index); } } @Override public Date getDate(int fieldId) throws SQLException { - Datum datum = cur.get(fieldId - 1); - handleNull(datum); - if (wasNull) { - return null; - } - - return getDate((DateDatum)datum, null); + return getDate(cur, null, fieldId - 1); } @Override public Date getDate(String name) throws SQLException { - return getDate(findColumn(name) + 1); + return getDate(cur, null, findColumn(name)); } @Override public Date getDate(int fieldId, Calendar x) throws SQLException { - Datum datum = cur.get(fieldId - 1); - handleNull(datum); - if (wasNull) { - return null; - } - - return getDate((DateDatum)datum, x.getTimeZone()); + return getDate(cur, x.getTimeZone(), fieldId - 1); } @Override public Date getDate(String name, Calendar x) throws SQLException { - return getDate(findColumn(name) + 1, x); + return getDate(cur, x.getTimeZone(), findColumn(name)); } - private Date getDate(DateDatum datum, TimeZone tz) { - TimeMeta tm = datum.toTimeMeta(); + private Date getDate(Tuple tuple, TimeZone tz, int index) throws SQLException { + return handleNull(tuple, index) ? null : toDate(tuple.getTimeDate(index), tz); + } + + private Date toDate(TimeMeta tm, TimeZone tz) { if (tz != null) { DateTimeUtil.toUserTimezone(tm, tz); } @@ -360,39 +297,29 @@ public abstract class TajoResultSetBase implements ResultSet { @Override public Time getTime(int fieldId) throws SQLException { - Datum datum = cur.get(fieldId - 1); - handleNull(datum); - if (wasNull) { - return null; - } - - return getTime((TimeDatum)datum, timezone); - + return getTime(cur, null, fieldId - 1); } @Override public Time getTime(String name) throws SQLException { - return getTime(findColumn(name) + 1); + return getTime(cur, null, findColumn(name)); } @Override public Time getTime(int fieldId, Calendar x) throws SQLException { - Datum datum = cur.get(fieldId - 1); - handleNull(datum); - if (wasNull) { - return null; - } - - return getTime((TimeDatum)datum, x.getTimeZone()); + return getTime(cur, x.getTimeZone(), fieldId - 1); } @Override public Time getTime(String name, Calendar x) throws SQLException { - return getTime(findColumn(name) + 1, x); + return getTime(cur, x.getTimeZone(), findColumn(name)); } - private Time getTime(TimeDatum datum, TimeZone tz) { - TimeMeta tm = datum.toTimeMeta(); + private Time getTime(Tuple tuple, TimeZone tz, int index) throws SQLException { + return handleNull(tuple, index) ? null : toTime(tuple.getTimeDate(index), tz); + } + + private Time toTime(TimeMeta tm, TimeZone tz) { if (tz != null) { DateTimeUtil.toUserTimezone(tm, tz); } @@ -401,38 +328,29 @@ public abstract class TajoResultSetBase implements ResultSet { @Override public Timestamp getTimestamp(int fieldId) throws SQLException { - Datum datum = cur.get(fieldId - 1); - handleNull(datum); - if (wasNull) { - return null; - } - - return getTimestamp((TimestampDatum)datum, timezone); + return getTimestamp(cur, null, fieldId - 1); } @Override public Timestamp getTimestamp(String name) throws SQLException { - return getTimestamp(findColumn(name) + 1); + return getTimestamp(cur, null, findColumn(name)); } @Override public Timestamp getTimestamp(int fieldId, Calendar x) throws SQLException { - Datum datum = cur.get(fieldId - 1); - handleNull(datum); - if (wasNull) { - return null; - } - - return getTimestamp((TimestampDatum)datum, x.getTimeZone()); + return getTimestamp(cur, x.getTimeZone(), fieldId - 1); } @Override public Timestamp getTimestamp(String name, Calendar x) throws SQLException { - return getTimestamp(findColumn(name) + 1, x); + return getTimestamp(cur, x.getTimeZone(), findColumn(name)); + } + + private Timestamp getTimestamp(Tuple tuple, TimeZone tz, int index) throws SQLException { + return handleNull(tuple, index) ? null : toTimestamp(tuple.getTimeDate(index), tz); } - private Timestamp getTimestamp(TimestampDatum datum, TimeZone tz) { - TimeMeta tm = datum.toTimeMeta(); + private Timestamp toTimestamp(TimeMeta tm, TimeZone tz) { if (tz != null) { DateTimeUtil.toUserTimezone(tm, tz); } http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-client/src/main/java/org/apache/tajo/storage/RowStoreUtil.java ---------------------------------------------------------------------- diff --git a/tajo-client/src/main/java/org/apache/tajo/storage/RowStoreUtil.java b/tajo-client/src/main/java/org/apache/tajo/storage/RowStoreUtil.java index 95dd60e..ba7cf48 100644 --- a/tajo-client/src/main/java/org/apache/tajo/storage/RowStoreUtil.java +++ b/tajo-client/src/main/java/org/apache/tajo/storage/RowStoreUtil.java @@ -45,14 +45,6 @@ public class RowStoreUtil { return targetIds; } - public static Tuple project(Tuple in, Tuple out, int[] targetIds) { - out.clear(); - for (int idx = 0; idx < targetIds.length; idx++) { - out.put(idx, in.get(targetIds[idx])); - } - return out; - } - public static RowStoreEncoder createEncoder(Schema schema) { return new RowStoreEncoder(schema); } @@ -77,7 +69,7 @@ public class RowStoreUtil { public Tuple toTuple(byte [] bytes) { nullFlags.clear(); ByteBuffer bb = ByteBuffer.wrap(bytes); - Tuple tuple = new VTuple(schema.size()); + VTuple tuple = new VTuple(schema.size()); Column col; TajoDataTypes.DataType type; @@ -189,7 +181,7 @@ public class RowStoreUtil { bb.position(headerSize); Column col; for (int i = 0; i < schema.size(); i++) { - if (tuple.isNull(i)) { + if (tuple.isBlankOrNull(i)) { nullFlags.set(i); continue; } @@ -197,12 +189,17 @@ public class RowStoreUtil { col = schema.getColumn(i); switch (col.getDataType().getType()) { case NULL_TYPE: nullFlags.set(i); break; - case BOOLEAN: bb.put(tuple.get(i).asByte()); break; - case BIT: bb.put(tuple.get(i).asByte()); break; + case BOOLEAN: bb.put(tuple.getByte(i)); break; + case BIT: bb.put(tuple.getByte(i)); break; + case INT2: bb.putShort(tuple.getInt2(i)); break; + case INT4: bb.putInt(tuple.getInt4(i)); break; + case INT8: bb.putLong(tuple.getInt8(i)); break; + case FLOAT4: bb.putFloat(tuple.getFloat4(i)); break; + case FLOAT8: bb.putDouble(tuple.getFloat8(i)); break; case CHAR: int charSize = col.getDataType().getLength(); byte [] _char = new byte[charSize]; - byte [] src = tuple.get(i).asByteArray(); + byte [] src = tuple.getBytes(i); if (charSize < src.length) { throw new ValueTooLongForTypeCharactersException(charSize); } @@ -210,36 +207,31 @@ public class RowStoreUtil { System.arraycopy(src, 0, _char, 0, src.length); bb.put(_char); break; - case INT2: bb.putShort(tuple.get(i).asInt2()); break; - case INT4: bb.putInt(tuple.get(i).asInt4()); break; - case INT8: bb.putLong(tuple.get(i).asInt8()); break; - case FLOAT4: bb.putFloat(tuple.get(i).asFloat4()); break; - case FLOAT8: bb.putDouble(tuple.get(i).asFloat8()); break; case TEXT: - byte [] _string = tuple.get(i).asByteArray(); + byte [] _string = tuple.getBytes(i); bb.putInt(_string.length); bb.put(_string); break; - case DATE: bb.putInt(tuple.get(i).asInt4()); break; + case DATE: bb.putInt(tuple.getInt4(i)); break; case TIME: case TIMESTAMP: - bb.putLong(tuple.get(i).asInt8()); + bb.putLong(tuple.getInt8(i)); break; case INTERVAL: - IntervalDatum interval = (IntervalDatum) tuple.get(i); + IntervalDatum interval = (IntervalDatum) tuple.getInterval(i); bb.putInt(interval.getMonths()); bb.putLong(interval.getMilliSeconds()); break; case BLOB: - byte [] bytes = tuple.get(i).asByteArray(); + byte [] bytes = tuple.getBytes(i); bb.putInt(bytes.length); bb.put(bytes); break; case INET4: - byte [] ipBytes = tuple.get(i).asByteArray(); + byte [] ipBytes = tuple.getBytes(i); bb.put(ipBytes); break; - case INET6: bb.put(tuple.get(i).asByteArray()); break; + case INET6: bb.put(tuple.getBytes(i)); break; default: throw new RuntimeException(new UnknownDataTypeException(col.getDataType().getType().name())); } @@ -263,7 +255,7 @@ public class RowStoreUtil { Column col; for (int i = 0; i < schema.size(); i++) { - if (tuple.isNull(i)) { + if (tuple.isBlankOrNull(i)) { continue; } @@ -286,9 +278,9 @@ public class RowStoreUtil { case FLOAT8: size += 8; break; case INTERVAL: size += 12; break; case TEXT: - case BLOB: size += (4 + tuple.get(i).asByteArray().length); break; + case BLOB: size += (4 + tuple.getBytes(i).length); break; case INET4: - case INET6: size += tuple.get(i).asByteArray().length; break; + case INET6: size += tuple.getBytes(i).length; break; default: throw new RuntimeException(new UnknownDataTypeException(col.getDataType().getType().name())); } http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/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 65342e8..093a8be 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 @@ -47,7 +47,7 @@ public class DateDatum extends Datum { dayOfMonth = tm.dayOfMonth; } - public TimeMeta toTimeMeta() { + public TimeMeta asTimeMeta() { TimeMeta tm = new TimeMeta(); tm.years = year; tm.monthOfYear = monthOfYear; @@ -56,7 +56,7 @@ public class DateDatum extends Datum { } public int getCenturyOfEra() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.getCenturyOfEra(); } @@ -65,7 +65,7 @@ public class DateDatum extends Datum { } public int getWeekyear() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.getWeekyear(); } @@ -74,22 +74,22 @@ public class DateDatum extends Datum { } public int getDayOfYear() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.getDayOfYear(); } public int getDayOfWeek() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.getDayOfWeek(); } public int getISODayOfWeek() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.getISODayOfWeek(); } public int getWeekOfYear() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.getWeekOfYear(); } @@ -110,18 +110,18 @@ public class DateDatum extends Datum { case INT8: case FLOAT4: case FLOAT8: { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); tm.plusDays(datum.asInt4()); return new DateDatum(tm); } case INTERVAL: IntervalDatum interval = (IntervalDatum) datum; - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); tm.plusInterval(interval.months, interval.milliseconds); return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm)); case TIME: { - TimeMeta tm1 = toTimeMeta(); - TimeMeta tm2 = ((TimeDatum)datum).toTimeMeta(); + TimeMeta tm1 = asTimeMeta(); + TimeMeta tm2 = datum.asTimeMeta(); tm1.plusTime(DateTimeUtil.toTime(tm2)); return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1)); } @@ -138,19 +138,19 @@ public class DateDatum extends Datum { case INT8: case FLOAT4: case FLOAT8: { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); tm.plusDays(0 - datum.asInt4()); return new DateDatum(tm); } case INTERVAL: { IntervalDatum interval = (IntervalDatum) datum; - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); tm.plusInterval(-interval.months, -interval.milliseconds); return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm)); } case TIME: { - TimeMeta tm1 = toTimeMeta(); - TimeMeta tm2 = ((TimeDatum)datum).toTimeMeta(); + TimeMeta tm1 = asTimeMeta(); + TimeMeta tm2 = datum.asTimeMeta(); tm1.plusTime(0 - DateTimeUtil.toTime(tm2)); return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1)); } @@ -231,8 +231,8 @@ public class DateDatum extends Datum { } else if (datum.type() == TajoDataTypes.Type.TIMESTAMP) { TimestampDatum another = (TimestampDatum) datum; TimeMeta myMeta, otherMeta; - myMeta = toTimeMeta(); - otherMeta = another.toTimeMeta(); + myMeta = asTimeMeta(); + otherMeta = another.asTimeMeta(); return myMeta.compareTo(otherMeta); } else if (datum instanceof NullDatum || datum.isNull()) { return -1; http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/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 1ff305d..e3e1295 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 @@ -26,6 +26,7 @@ import org.apache.tajo.exception.InvalidCastException; import org.apache.tajo.exception.InvalidOperationException; import org.apache.tajo.json.CommonGsonHelper; import org.apache.tajo.json.GsonObject; +import org.apache.tajo.util.datetime.TimeMeta; import static org.apache.tajo.common.TajoDataTypes.Type; @@ -102,6 +103,7 @@ public abstract class Datum implements Comparable<Datum>, GsonObject { throw new InvalidCastException(type, Type.TEXT); } + // todo remove this public char [] asUnicodeChars() { throw new InvalidCastException(type, Type.TEXT); } @@ -110,6 +112,10 @@ public abstract class Datum implements Comparable<Datum>, GsonObject { return asChars().getBytes(); } + public TimeMeta asTimeMeta() { + throw new InvalidCastException(type, Type.INT8); + } + public boolean isNumeric() { return isNumber() || isReal(); } @@ -133,6 +139,7 @@ public abstract class Datum implements Comparable<Datum>, GsonObject { public abstract int size(); + // belows should be extracted out of datum public Datum and(Datum datum) { throw new InvalidOperationException(datum.type); } http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/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 bd1b88f..480582a 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 @@ -433,7 +433,7 @@ public class DatumFactory { case TIMESTAMP: { TimestampDatum timestampDatum = (TimestampDatum)operandDatum; if (tz != null) { - return DatumFactory.createText(timestampDatum.asChars(tz, false)); + return DatumFactory.createText(TimestampDatum.asChars(operandDatum.asTimeMeta(), tz, false)); } else { return DatumFactory.createText(timestampDatum.asChars()); } @@ -441,7 +441,7 @@ public class DatumFactory { case TIME: { TimeDatum timeDatum = (TimeDatum)operandDatum; if (tz != null) { - return DatumFactory.createText(timeDatum.asChars(tz, false)); + return DatumFactory.createText(TimeDatum.asChars(operandDatum.asTimeMeta(), tz, false)); } else { return DatumFactory.createText(timeDatum.asChars()); } http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/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 e71a201..0fe598a 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 @@ -214,8 +214,7 @@ public class Float4Datum extends NumericDatum { case FLOAT8: return DatumFactory.createFloat8(val + datum.asFloat8()); case DATE: - DateDatum dateDatum = (DateDatum)datum; - TimeMeta tm = dateDatum.toTimeMeta(); + TimeMeta tm = datum.asTimeMeta(); tm.plusDays(asInt4()); return new DateDatum(tm); case NULL_TYPE: @@ -239,8 +238,7 @@ public class Float4Datum extends NumericDatum { case FLOAT8: return DatumFactory.createFloat8(val - datum.asFloat8()); case DATE: - DateDatum dateDatum = (DateDatum)datum; - TimeMeta tm = dateDatum.toTimeMeta(); + TimeMeta tm = datum.asTimeMeta(); tm.plusDays(0 - asInt4()); return new DateDatum(tm); case NULL_TYPE: http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/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 a0298f2..6ebe10b 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 @@ -203,8 +203,7 @@ public class Float8Datum extends NumericDatum { case FLOAT8: return DatumFactory.createFloat8(val + datum.asFloat8()); case DATE: - DateDatum dateDatum = (DateDatum)datum; - TimeMeta tm = dateDatum.toTimeMeta(); + TimeMeta tm = datum.asTimeMeta(); tm.plusDays(asInt4()); return new DateDatum(tm); case NULL_TYPE: @@ -228,8 +227,7 @@ public class Float8Datum extends NumericDatum { case FLOAT8: return DatumFactory.createFloat8(val - datum.asFloat8()); case DATE: - DateDatum dateDatum = (DateDatum)datum; - TimeMeta tm = dateDatum.toTimeMeta(); + TimeMeta tm = datum.asTimeMeta(); tm.plusDays(0 - asInt4()); return new DateDatum(tm); case NULL_TYPE: http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/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 f11a5c5..6145c75 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 @@ -205,8 +205,7 @@ public class Int2Datum extends NumericDatum { case FLOAT8: return DatumFactory.createFloat8(val + datum.asFloat8()); case DATE: - DateDatum dateDatum = (DateDatum)datum; - TimeMeta tm = dateDatum.toTimeMeta(); + TimeMeta tm = datum.asTimeMeta(); tm.plusDays(asInt2()); return new DateDatum(tm); case NULL_TYPE: @@ -230,8 +229,7 @@ public class Int2Datum extends NumericDatum { case FLOAT8: return DatumFactory.createFloat8(val - datum.asFloat8()); case DATE: - DateDatum dateDatum = (DateDatum)datum; - TimeMeta tm = dateDatum.toTimeMeta(); + TimeMeta tm = datum.asTimeMeta(); tm.plusDays(0 - asInt2()); return new DateDatum(tm); case NULL_TYPE: http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/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 ea531b9..530ef84 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 @@ -209,8 +209,7 @@ public class Int4Datum extends NumericDatum { case FLOAT8: return DatumFactory.createFloat8(val + datum.asFloat8()); case DATE: - DateDatum dateDatum = (DateDatum)datum; - TimeMeta tm = dateDatum.toTimeMeta(); + TimeMeta tm = datum.asTimeMeta(); tm.plusDays(asInt4()); return new DateDatum(tm); case NULL_TYPE: @@ -234,8 +233,7 @@ public class Int4Datum extends NumericDatum { case FLOAT8: return DatumFactory.createFloat8(val - datum.asFloat8()); case DATE: - DateDatum dateDatum = (DateDatum)datum; - TimeMeta tm = dateDatum.toTimeMeta(); + TimeMeta tm = datum.asTimeMeta(); tm.plusDays(0 - asInt4()); return new DateDatum(tm); case NULL_TYPE: http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/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 cd448e3..66c093a 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 @@ -217,8 +217,7 @@ public class Int8Datum extends NumericDatum { case FLOAT8: return DatumFactory.createFloat8(val + datum.asFloat8()); case DATE: - DateDatum dateDatum = (DateDatum)datum; - TimeMeta tm = dateDatum.toTimeMeta(); + TimeMeta tm = datum.asTimeMeta(); tm.plusDays(asInt4()); return new DateDatum(tm); case NULL_TYPE: @@ -242,8 +241,7 @@ public class Int8Datum extends NumericDatum { case FLOAT8: return DatumFactory.createFloat8(val - datum.asFloat8()); case DATE: - DateDatum dateDatum = (DateDatum)datum; - TimeMeta tm = dateDatum.toTimeMeta(); + TimeMeta tm = datum.asTimeMeta(); tm.plusDays(0 - asInt4()); return new DateDatum(tm); case NULL_TYPE: http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/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 e8d439d..d3cb6c7 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 @@ -231,12 +231,12 @@ public class IntervalDatum extends Datum { return new IntervalDatum(months + other.months, milliseconds + other.milliseconds); case DATE: { DateDatum dateDatum = (DateDatum) datum; - TimeMeta tm = dateDatum.toTimeMeta(); + TimeMeta tm = dateDatum.asTimeMeta(); tm.plusInterval(months, milliseconds); return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm)); } case TIME: { - TimeMeta tm = ((TimeDatum) datum).toTimeMeta(); + TimeMeta tm = datum.asTimeMeta(); tm.plusInterval(months, milliseconds); return new TimeDatum(DateTimeUtil.toTime(tm)); } @@ -303,7 +303,7 @@ public class IntervalDatum extends Datum { private IntervalDatum createIntervalDatum(double monthValue, double millisValue) { int month = (int)(monthValue); - return new IntervalDatum(month, Math.round((monthValue - (double)month) * (double)MONTH_MILLIS + (double)millisValue)); + return new IntervalDatum(month, Math.round((monthValue - (double)month) * (double)MONTH_MILLIS + millisValue)); } @Override http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/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 04cce54..5786657 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 @@ -38,7 +38,8 @@ public class TimeDatum extends Datum { this.time = time; } - public TimeMeta toTimeMeta() { + @Override + public TimeMeta asTimeMeta() { TimeMeta tm = new TimeMeta(); DateTimeUtil.date2j(time, tm); @@ -46,12 +47,12 @@ public class TimeDatum extends Datum { } public int getHourOfDay() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.hours; } public int getMinuteOfHour() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.minutes; } @@ -62,7 +63,7 @@ public class TimeDatum extends Datum { } public int getMillisOfSecond() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.fsecs / 1000; } @@ -92,12 +93,11 @@ public class TimeDatum extends Datum { @Override public String asChars() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return DateTimeUtil.encodeTime(tm, DateStyle.ISO_DATES); } - public String asChars(TimeZone timeZone, boolean includeTimeZone) { - TimeMeta tm = toTimeMeta(); + public static String asChars(TimeMeta tm, TimeZone timeZone, boolean includeTimeZone) { DateTimeUtil.toUserTimezone(tm, timeZone); if (includeTimeZone) { tm.timeZone = timeZone.getRawOffset() / 1000; @@ -106,7 +106,7 @@ public class TimeDatum extends Datum { } public String toString(TimeZone timeZone, boolean includeTimeZone) { - return asChars(timeZone, includeTimeZone); + return asChars(asTimeMeta(), timeZone, includeTimeZone); } @Override @@ -124,12 +124,12 @@ public class TimeDatum extends Datum { switch(datum.type()) { case INTERVAL: IntervalDatum interval = ((IntervalDatum)datum); - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); tm.plusInterval(interval.months, interval.milliseconds); return new TimeDatum(DateTimeUtil.toTime(tm)); case DATE: { DateDatum dateDatum = (DateDatum) datum; - TimeMeta dateTm = dateDatum.toTimeMeta(); + TimeMeta dateTm = dateDatum.asTimeMeta(); dateTm.plusTime(time); return new TimestampDatum(DateTimeUtil.toJulianTimestamp(dateTm)); } @@ -143,7 +143,7 @@ public class TimeDatum extends Datum { switch(datum.type()) { case INTERVAL: IntervalDatum interval = ((IntervalDatum)datum); - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); tm.plusInterval(-interval.months, -interval.milliseconds); return new TimeDatum(DateTimeUtil.toTime(tm)); case TIME: http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/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 ad73c74..02425eb 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 @@ -61,57 +61,57 @@ public class TimestampDatum extends Datum { public int getCenturyOfEra() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.getCenturyOfEra(); } public int getYear() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.years; } public int getMonthOfYear() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.monthOfYear; } public int getDayOfYear() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.getDayOfYear(); } public int getDayOfWeek() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.getDayOfYear(); } public int getWeekOfYear() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.getWeekOfYear(); } public int getDayOfMonth() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.dayOfMonth; } public int getHourOfDay() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.hours; } public int getMinuteOfHour() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.minutes; } public int getSecondOfMinute() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.secs; } public int getMillisOfSecond() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.fsecs / 1000; } @@ -123,17 +123,16 @@ public class TimestampDatum extends Datum { return asChars(); } - public String asChars(TimeZone timeZone, boolean includeTimeZone) { - TimeMeta tm = toTimeMeta(); + public static String asChars(TimeMeta tm, TimeZone timeZone, boolean includeTimeZone) { DateTimeUtil.toUserTimezone(tm, timeZone); if (includeTimeZone) { tm.timeZone = timeZone.getRawOffset() / 1000; } - return DateTimeUtil.encodeDateTime(tm, DateStyle.ISO_DATES); + return DateTimeUtil.encodeDateTime(tm, DateStyle.ISO_DATES); } public String toString(TimeZone timeZone, boolean includeTimeZone) { - return asChars(timeZone, includeTimeZone); + return asChars(asTimeMeta(), timeZone, includeTimeZone); } @Override @@ -143,12 +142,12 @@ public class TimestampDatum extends Datum { @Override public String asChars() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return DateTimeUtil.encodeDateTime(tm, DateStyle.ISO_DATES); } public String toChars(String format) { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return DateTimeFormat.to_char(tm, format); } @@ -180,10 +179,9 @@ public class TimestampDatum extends Datum { TimestampDatum another = (TimestampDatum) datum; return Longs.compare(timestamp, another.timestamp); } else if (datum.type() == TajoDataTypes.Type.DATE) { - DateDatum another = (DateDatum) datum; TimeMeta myMeta, otherMeta; - myMeta = toTimeMeta(); - otherMeta = another.toTimeMeta(); + myMeta = asTimeMeta(); + otherMeta = datum.asTimeMeta(); return myMeta.compareTo(otherMeta); } else if (datum.isNull()) { return -1; @@ -206,7 +204,7 @@ public class TimestampDatum extends Datum { public Datum plus(Datum datum) { if (datum.type() == TajoDataTypes.Type.INTERVAL) { IntervalDatum interval = (IntervalDatum)datum; - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); tm.plusInterval(interval.months, interval.milliseconds); return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm)); } else { @@ -219,7 +217,7 @@ public class TimestampDatum extends Datum { switch(datum.type()) { case INTERVAL: IntervalDatum interval = (IntervalDatum)datum; - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); tm.plusInterval(-interval.months, -interval.milliseconds); return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm)); case TIMESTAMP: @@ -234,7 +232,8 @@ public class TimestampDatum extends Datum { return Longs.hashCode(timestamp); } - public TimeMeta toTimeMeta() { + @Override + public TimeMeta asTimeMeta() { TimeMeta tm = new TimeMeta(); DateTimeUtil.toJulianTimeMeta(timestamp, tm); http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/storage/EmptyTuple.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/java/org/apache/tajo/storage/EmptyTuple.java b/tajo-common/src/main/java/org/apache/tajo/storage/EmptyTuple.java index cdcebd7..d3ad4f3 100644 --- a/tajo-common/src/main/java/org/apache/tajo/storage/EmptyTuple.java +++ b/tajo-common/src/main/java/org/apache/tajo/storage/EmptyTuple.java @@ -18,12 +18,19 @@ package org.apache.tajo.storage; +import org.apache.tajo.common.TajoDataTypes; +import org.apache.tajo.datum.Datum; +import org.apache.tajo.datum.NullDatum; +import org.apache.tajo.datum.ProtobufDatum; +import org.apache.tajo.util.datetime.TimeMeta; + /* This class doesnât have content datum. if selected column is zero, this is useful * e.g. select count(*) from table * */ public class EmptyTuple extends NullTuple { private static EmptyTuple tuple; + private static Datum[] EMPTY_VALUES = new Datum[0]; static { tuple = new EmptyTuple(); @@ -38,7 +45,139 @@ public class EmptyTuple extends NullTuple { } @Override - public Tuple clone() { + public int size() { + return 0; + } + + public boolean contains(int fieldId) { + return false; + } + + @Override + public boolean isBlank(int fieldid) { + return true; + } + + @Override + public boolean isBlankOrNull(int fieldid) { + return true; + } + + @Override + public void clear() { + } + + @Override + public void put(int fieldId, Datum value) { + throw new UnsupportedOperationException(); + } + + @Override + public Datum asDatum(int fieldId) { + return NullDatum.get(); + } + + @Override + public TajoDataTypes.Type type(int fieldId) { + return null; + } + + @Override + public int size(int fieldId) { + return 0; + } + + @Override + public void setOffset(long offset) { + } + + @Override + public long getOffset() { + return -1; + } + + @Override + public boolean getBool(int fieldId) { + return NullDatum.get().asBool(); + } + + @Override + public byte getByte(int fieldId) { + return NullDatum.get().asByte(); + } + + @Override + public char getChar(int fieldId) { + return NullDatum.get().asChar(); + } + + @Override + public byte[] getBytes(int fieldId) { + return NullDatum.get().asByteArray(); + } + + @Override + public byte[] getTextBytes(int fieldId) { + return NullDatum.get().asTextBytes(); + } + + @Override + public short getInt2(int fieldId) { + return NullDatum.get().asInt2(); + } + + @Override + public int getInt4(int fieldId) { + return NullDatum.get().asInt4(); + } + + @Override + public long getInt8(int fieldId) { + return NullDatum.get().asInt8(); + } + + @Override + public float getFloat4(int fieldId) { + return NullDatum.get().asFloat4(); + } + + @Override + public double getFloat8(int fieldId) { + return NullDatum.get().asFloat8(); + } + + @Override + public String getText(int fieldId) { + return NullDatum.get().asChars(); + } + + @Override + public TimeMeta getTimeDate(int fieldId) { + throw new UnsupportedOperationException(); + } + + @Override + public ProtobufDatum getProtobufDatum(int fieldId) { + throw new UnsupportedOperationException(); + } + + @Override + public Datum getInterval(int fieldId) { + return NullDatum.get(); + } + + @Override + public char[] getUnicodeChars(int fieldId) { + return NullDatum.get().asUnicodeChars(); + } + + @Override + public Datum[] getValues() { + return EMPTY_VALUES; + } + + @Override + public Tuple clone() throws CloneNotSupportedException { return this; } } http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/storage/NullTuple.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/java/org/apache/tajo/storage/NullTuple.java b/tajo-common/src/main/java/org/apache/tajo/storage/NullTuple.java index 45eb859..a17ef01 100644 --- a/tajo-common/src/main/java/org/apache/tajo/storage/NullTuple.java +++ b/tajo-common/src/main/java/org/apache/tajo/storage/NullTuple.java @@ -18,9 +18,11 @@ package org.apache.tajo.storage; +import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.NullDatum; import org.apache.tajo.datum.ProtobufDatum; +import org.apache.tajo.util.datetime.TimeMeta; import java.util.Arrays; @@ -33,6 +35,8 @@ public class NullTuple implements Tuple, Cloneable { return new NullTuple(size); } + private static final byte[] NULL_TEXT_BYTES = new byte[0]; + private final int size; NullTuple(int size) { @@ -49,13 +53,13 @@ public class NullTuple implements Tuple, Cloneable { } @Override - public boolean isNull(int fieldid) { - return true; + public boolean isBlank(int fieldid) { + return false; } @Override - public boolean isNotNull(int fieldid) { - return false; + public boolean isBlankOrNull(int fieldid) { + return true; } @Override @@ -68,23 +72,28 @@ public class NullTuple implements Tuple, Cloneable { } @Override - public void put(int fieldId, Datum[] values) { - throw new UnsupportedOperationException(); + public Datum asDatum(int fieldId) { + return NullDatum.get(); } @Override - public void put(int fieldId, Tuple tuple) { - throw new UnsupportedOperationException(); + public TajoDataTypes.Type type(int fieldId) { + return null; } @Override - public void put(Datum[] values) { + public int size(int fieldId) { + return 0; + } + + @Override + public void put(int fieldId, Tuple tuple) { throw new UnsupportedOperationException(); } @Override - public Datum get(int fieldId) { - return NullDatum.get(); + public void put(Datum[] values) { + throw new UnsupportedOperationException(); } @Override @@ -117,6 +126,11 @@ public class NullTuple implements Tuple, Cloneable { } @Override + public byte[] getTextBytes(int fieldId) { + return NULL_TEXT_BYTES; + } + + @Override public short getInt2(int fieldId) { return NullDatum.get().asInt2(); } @@ -147,6 +161,11 @@ public class NullTuple implements Tuple, Cloneable { } @Override + public TimeMeta getTimeDate(int fieldId) { + return null; + } + + @Override public ProtobufDatum getProtobufDatum(int fieldId) { throw new UnsupportedOperationException(); } @@ -163,7 +182,7 @@ public class NullTuple implements Tuple, Cloneable { @Override public Tuple clone() throws CloneNotSupportedException { - return new NullTuple(size); + return this; } @Override http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/storage/Tuple.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/java/org/apache/tajo/storage/Tuple.java b/tajo-common/src/main/java/org/apache/tajo/storage/Tuple.java index fce10a3..7eb56bd 100644 --- a/tajo-common/src/main/java/org/apache/tajo/storage/Tuple.java +++ b/tajo-common/src/main/java/org/apache/tajo/storage/Tuple.java @@ -18,62 +18,71 @@ package org.apache.tajo.storage; +import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.datum.Datum; +import org.apache.tajo.util.datetime.TimeMeta; public interface Tuple extends Cloneable { - - int size(); - - boolean contains(int fieldid); - boolean isNull(int fieldid); + int size(); - @SuppressWarnings("unused") - boolean isNotNull(int fieldid); - - void clear(); - - void put(int fieldId, Datum value); + boolean contains(int fieldid); - void put(int fieldId, Datum[] values); + boolean isBlank(int fieldid); + + boolean isBlankOrNull(int fieldid); void put(int fieldId, Tuple tuple); - - void put(Datum[] values); - - Datum get(int fieldId); - void setOffset(long offset); - - long getOffset(); + void put(int fieldId, Datum value); + + void put(Datum[] values); + + void clear(); + + Datum asDatum(int fieldId); + + TajoDataTypes.Type type(int fieldId); - boolean getBool(int fieldId); + int size(int fieldId); - byte getByte(int fieldId); + void setOffset(long offset); + + long getOffset(); + + boolean getBool(int fieldId); + + byte getByte(int fieldId); char getChar(int fieldId); - - byte [] getBytes(int fieldId); - - short getInt2(int fieldId); - - int getInt4(int fieldId); - - long getInt8(int fieldId); - - float getFloat4(int fieldId); - - double getFloat8(int fieldId); - - String getText(int fieldId); + + byte[] getBytes(int fieldId); + + byte[] getTextBytes(int fieldId); + + short getInt2(int fieldId); + + int getInt4(int fieldId); + + long getInt8(int fieldId); + + float getFloat4(int fieldId); + + double getFloat8(int fieldId); + + String getText(int fieldId); + + TimeMeta getTimeDate(int fieldId); Datum getProtobufDatum(int fieldId); Datum getInterval(int fieldId); + // todo remove this char [] getUnicodeChars(int fieldId); Tuple clone() throws CloneNotSupportedException; + // todo remove this Datum[] getValues(); } http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/storage/VTuple.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/java/org/apache/tajo/storage/VTuple.java b/tajo-common/src/main/java/org/apache/tajo/storage/VTuple.java index da69eb0..2c81e54 100644 --- a/tajo-common/src/main/java/org/apache/tajo/storage/VTuple.java +++ b/tajo-common/src/main/java/org/apache/tajo/storage/VTuple.java @@ -19,22 +19,24 @@ package org.apache.tajo.storage; import com.google.gson.annotations.Expose; +import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.Inet4Datum; import org.apache.tajo.datum.IntervalDatum; import org.apache.tajo.datum.ProtobufDatum; import org.apache.tajo.exception.UnimplementedException; +import org.apache.tajo.util.datetime.TimeMeta; import java.net.InetAddress; import java.util.Arrays; public class VTuple implements Tuple, Cloneable { - @Expose public Datum [] values; - @Expose private long offset; - - public VTuple(int size) { - values = new Datum[size]; - } + @Expose public Datum [] values; + @Expose private long offset; + + public VTuple(int size) { + values = new Datum[size]; + } public VTuple(Tuple tuple) { this.values = tuple.getValues().clone(); @@ -42,84 +44,90 @@ public class VTuple implements Tuple, Cloneable { public VTuple(Datum[] datum) { this(datum.length); - put(datum); + this.values = Arrays.copyOf(datum, datum.length); } - @Override - public int size() { - return values.length; - } - - public boolean contains(int fieldId) { - return values[fieldId] != null; - } + @Override + public int size() { + return values.length; + } + + public boolean contains(int fieldId) { + return values[fieldId] != null; + } @Override - public boolean isNull(int fieldid) { + public boolean isBlank(int fieldid) { + return values[fieldid] == null; + } + + @Override + public boolean isBlankOrNull(int fieldid) { return values[fieldid] == null || values[fieldid].isNull(); } @Override - public boolean isNotNull(int fieldid) { - return !isNull(fieldid); + public void put(int fieldId, Tuple tuple) { + this.put(fieldId, tuple.asDatum(fieldId)); } @Override - public void clear() { + public void clear() { for (int i=0; i < values.length; i++) { values[i] = null; } } - - ////////////////////////////////////////////////////// - // Setter - ////////////////////////////////////////////////////// - public void put(int fieldId, Datum value) { - values[fieldId] = value; - } + + ////////////////////////////////////////////////////// + // Setter + ////////////////////////////////////////////////////// + public void put(int fieldId, Datum value) { + values[fieldId] = value; + } @Override - public void put(int fieldId, Datum[] values) { - for (int i = fieldId, j = 0; j < values.length; i++, j++) { - values[i] = values[j]; - } + public Datum asDatum(int fieldId) { + return values[fieldId] == null ? null : values[fieldId]; } @Override - public void put(int fieldId, Tuple tuple) { - for (int i = fieldId, j = 0; j < tuple.size(); i++, j++) { - values[i] = tuple.get(j); - } + public TajoDataTypes.Type type(int fieldId) { + return values[fieldId].type(); + } + + @Override + public int size(int fieldId) { + return values[fieldId].size(); } public void put(Datum [] values) { System.arraycopy(values, 0, this.values, 0, values.length); - } - - ////////////////////////////////////////////////////// - // Getter - ////////////////////////////////////////////////////// - public Datum get(int fieldId) { - return this.values[fieldId]; - } - - public void setOffset(long offset) { - this.offset = offset; - } - - public long getOffset() { - return this.offset; - } - - @Override - public boolean getBool(int fieldId) { - return values[fieldId].asBool(); - } - - @Override - public byte getByte(int fieldId) { - return values[fieldId].asByte(); - } + } + + ////////////////////////////////////////////////////// + // Getter + ////////////////////////////////////////////////////// + public Datum get(int fieldId) { + return this.values[fieldId]; + } + + public void setOffset(long offset) { + this.offset = offset; + } + + public long getOffset() { + return this.offset; + } + + @Override + public boolean getBool(int fieldId) { + return values[fieldId].asBool(); + } + + @Override + public byte getByte(int fieldId) { + return values[fieldId].asByte(); + } @Override public char getChar(int fieldId) { @@ -127,55 +135,65 @@ public class VTuple implements Tuple, Cloneable { } @Override - public byte [] getBytes(int fieldId) { - return values[fieldId].asByteArray(); - } + public byte [] getBytes(int fieldId) { + return values[fieldId].asByteArray(); + } @Override - public short getInt2(int fieldId) { - return values[fieldId].asInt2(); - } + public byte[] getTextBytes(int fieldId) { + return values[fieldId].asTextBytes(); + } @Override - public int getInt4(int fieldId) { - return values[fieldId].asInt4(); - } + public short getInt2(int fieldId) { + return values[fieldId].asInt2(); + } @Override - public long getInt8(int fieldId) { - return values[fieldId].asInt8(); - } + public int getInt4(int fieldId) { + return values[fieldId].asInt4(); + } @Override - public float getFloat4(int fieldId) { - return values[fieldId].asFloat4(); - } + public long getInt8(int fieldId) { + return values[fieldId].asInt8(); + } @Override - public double getFloat8(int fieldId) { - return values[fieldId].asFloat8(); - } + public float getFloat4(int fieldId) { + return values[fieldId].asFloat4(); + } - public Inet4Datum getIPv4(int fieldId) { - return (Inet4Datum) values[fieldId]; - } + @Override + public double getFloat8(int fieldId) { + return values[fieldId].asFloat8(); + } - public byte [] getIPv4Bytes(int fieldId) { - return values[fieldId].asByteArray(); - } + public Inet4Datum getIPv4(int fieldId) { + return (Inet4Datum) values[fieldId]; + } + + public byte [] getIPv4Bytes(int fieldId) { + return values[fieldId].asByteArray(); + } - public InetAddress getIPv6(int fieldId) { - throw new UnimplementedException("IPv6 is unsupported yet"); - } + public InetAddress getIPv6(int fieldId) { + throw new UnimplementedException("IPv6 is unsupported yet"); + } + + public byte[] getIPv6Bytes(int fieldId) { + throw new UnimplementedException("IPv6 is unsupported yet"); + } - public byte[] getIPv6Bytes(int fieldId) { - throw new UnimplementedException("IPv6 is unsupported yet"); - } + @Override + public String getText(int fieldId) { + return values[fieldId].asChars(); + } @Override - public String getText(int fieldId) { - return values[fieldId].asChars(); - } + public TimeMeta getTimeDate(int fieldId) { + return values[fieldId].asTimeMeta(); + } @Override public ProtobufDatum getProtobufDatum(int fieldId) { @@ -193,7 +211,7 @@ public class VTuple implements Tuple, Cloneable { } @Override - public Tuple clone() throws CloneNotSupportedException { + public VTuple clone() throws CloneNotSupportedException { VTuple tuple = (VTuple) super.clone(); tuple.values = new Datum[size()]; @@ -203,13 +221,13 @@ public class VTuple implements Tuple, Cloneable { @Override public String toString() { - return toDisplayString(getValues()); - } + return toDisplayString(getValues()); + } - @Override - public int hashCode() { - return Arrays.hashCode(values); - } + @Override + public int hashCode() { + return Arrays.hashCode(values); + } @Override public Datum[] getValues() { http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/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 15b4236..570873d 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 @@ -2170,13 +2170,17 @@ public class DateTimeUtil { } public static TimeMeta getUTCDateTime(Int8Datum int8Datum){ - long usecs = int8Datum.asInt8()%DateTimeConstants.USECS_PER_MSEC; - long julianTimestamp = javaTimeToJulianTime(int8Datum.asInt8()/DateTimeConstants.USECS_PER_MSEC); + return getUTCDateTime(int8Datum.asInt8()); + } + + public static TimeMeta getUTCDateTime(long time) { + long usecs = time % DateTimeConstants.USECS_PER_MSEC; + long julianTimestamp = javaTimeToJulianTime(time / DateTimeConstants.USECS_PER_MSEC); TimeMeta tm = new TimeMeta(); - + julianTimestamp += usecs; toJulianTimeMeta(julianTimestamp, tm); return tm; } - + } http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/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 06e50f7..7cb3123 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 @@ -120,7 +120,7 @@ public class TestTimestampDatum { 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-02 00:20:30+09", datum.asChars(TimeZone.getTimeZone("GMT+9"), true)); + assertEquals("2014-05-02 00:20:30+09", TimestampDatum.asChars(datum.asTimeMeta(), TimeZone.getTimeZone("GMT+9"), true)); } @Test http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeFormat.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeFormat.java b/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeFormat.java index 2b5dba0..a9af36c 100644 --- a/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeFormat.java +++ b/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeFormat.java @@ -142,7 +142,7 @@ public class TestDateTimeFormat { private void evalToCharAndAssert(String dateTimeText, String toTimestampFormatText, String toCharFormatText, String expected) { TimestampDatum datum = DateTimeFormat.toTimestamp(dateTimeText, toTimestampFormatText); - String toCharResult = DateTimeFormat.to_char(datum.toTimeMeta(), toCharFormatText); + String toCharResult = DateTimeFormat.to_char(datum.asTimeMeta(), toCharFormatText); assertEquals(expected, toCharResult); } } http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java index 3ccb02d..a1805c4 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java @@ -59,9 +59,8 @@ public class AvgDouble extends AggFunction<Datum> { @Override public void eval(FunctionContext ctx, Tuple params) { AvgContext avgCtx = (AvgContext) ctx; - Datum datum = params.get(0); - if (datum.isNotNull()) { - avgCtx.sum += datum.asFloat8(); + if (!params.isBlankOrNull(0)) { + avgCtx.sum += params.getFloat8(0); avgCtx.count++; } } @@ -69,11 +68,10 @@ public class AvgDouble extends AggFunction<Datum> { @Override public void merge(FunctionContext ctx, Tuple part) { AvgContext avgCtx = (AvgContext) ctx; - Datum d = part.get(0); - if (d instanceof NullDatum) { + if (part.isBlankOrNull(0)) { return; } - ProtobufDatum datum = (ProtobufDatum) d; + ProtobufDatum datum = (ProtobufDatum) part.getProtobufDatum(0); AvgDoubleProto proto = (AvgDoubleProto) datum.get(); avgCtx.sum += proto.getSum(); avgCtx.count += proto.getCount(); http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java index 8162319..1e778a8 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java @@ -44,9 +44,8 @@ public class AvgFloat extends AvgDouble { @Override public void eval(FunctionContext ctx, Tuple params) { AvgContext avgCtx = (AvgContext) ctx; - Datum datum = params.get(0); - if (datum.isNotNull()) { - avgCtx.sum += datum.asFloat4(); + if (!params.isBlankOrNull(0)) { + avgCtx.sum += params.getFloat4(0); avgCtx.count++; } } http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java index 1950fb1..b49c61b 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java @@ -45,9 +45,8 @@ public class AvgInt extends AvgLong { @Override public void eval(FunctionContext ctx, Tuple params) { AvgContext avgCtx = (AvgContext) ctx; - Datum datum = params.get(0); - if (datum.isNotNull()) { - avgCtx.sum += datum.asInt4(); + if (!params.isBlankOrNull(0)) { + avgCtx.sum += params.getInt4(0); avgCtx.count++; } } http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java index 88f8486..651f540 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java @@ -57,9 +57,8 @@ public class AvgLong extends AggFunction<Datum> { @Override public void eval(FunctionContext ctx, Tuple params) { AvgContext avgCtx = (AvgContext) ctx; - Datum datum = params.get(0); - if (datum.isNotNull()) { - avgCtx.sum += datum.asInt8(); + if (!params.isBlankOrNull(0)) { + avgCtx.sum += params.getInt8(0); avgCtx.count++; } } @@ -67,11 +66,10 @@ public class AvgLong extends AggFunction<Datum> { @Override public void merge(FunctionContext ctx, Tuple part) { AvgContext avgCtx = (AvgContext) ctx; - Datum d = part.get(0); - if (d instanceof NullDatum) { + if (part.isBlankOrNull(0)) { return; } - ProtobufDatum datum = (ProtobufDatum) d; + ProtobufDatum datum = (ProtobufDatum) part.getProtobufDatum(0); AvgLongProto proto = (AvgLongProto) datum.get(); avgCtx.sum += proto.getSum(); avgCtx.count += proto.getCount(); http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Coalesce.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Coalesce.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Coalesce.java index 474f771..05847ad 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Coalesce.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Coalesce.java @@ -33,11 +33,10 @@ public abstract class Coalesce extends GeneralFunction { public Datum eval(Tuple params) { int paramSize = params.size(); for (int i = 0; i < paramSize; i++) { - Datum datum = params.get(i); - if (datum instanceof NullDatum) { + if (params.isBlankOrNull(i)) { continue; } - return datum; + return params.asDatum(i); } return NullDatum.get(); } http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java index 5e41dc9..2eabe0b 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java @@ -60,7 +60,7 @@ public class CountRows extends AggFunction<Datum> { @Override public void merge(FunctionContext ctx, Tuple part) { - ((CountRowContext) ctx).count += part.get(0).asInt8(); + ((CountRowContext) ctx).count += part.getInt8(0); } @Override http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java index 1abfcb7..a2f06ff 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java @@ -47,7 +47,7 @@ public final class CountValue extends CountRows { @Override public void eval(FunctionContext ctx, Tuple params) { - if (!(params.get(0) instanceof NullDatum)) { + if (!params.isBlankOrNull(0)) { ((CountRowContext) ctx).count++; } } http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java index 675193f..f247968 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java @@ -53,13 +53,14 @@ public final class CountValueDistinct extends CountRows { } @Override - public void merge(FunctionContext context, Tuple part) { + public void merge(FunctionContext context, Tuple params) { CountDistinctValueContext distinctContext = (CountDistinctValueContext) context; - Datum value = part.get(0); - - if (!value.isNull() && (distinctContext.latest == null || (!distinctContext.latest.equals(value)))) { - distinctContext.latest = value; - distinctContext.count++; + if (!params.isBlankOrNull(0)) { + Datum value = params.asDatum(0); + if (distinctContext.latest == null || !distinctContext.latest.equals(value)) { + distinctContext.latest = value; + distinctContext.count++; + } } } http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Date.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Date.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Date.java index aee7c60..05928d6 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Date.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Date.java @@ -53,7 +53,7 @@ public class Date extends GeneralFunction { public Int8Datum eval(Tuple params) { try { return DatumFactory.createInt8(new SimpleDateFormat(dateFormat) - .parse(params.get(0).asChars()).getTime()); + .parse(params.getText(0)).getTime()); } catch (ParseException e) { LOG.error(e); return null; http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/LastValue.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/LastValue.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/LastValue.java index 16edb17..190bd81 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/LastValue.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/LastValue.java @@ -40,9 +40,8 @@ public abstract class LastValue extends AggFunction<Datum> { @Override public void eval(FunctionContext ctx, Tuple params) { LastValueContext lastValueCtx = (LastValueContext) ctx; - Datum datum = params.get(0); - if ( datum.isNotNull() ) { - lastValueCtx.last = datum; + if (!params.isBlankOrNull(0)) { + lastValueCtx.last = params.asDatum(0); } } http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Lead.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Lead.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Lead.java index 2e95eb7..8edf1fb 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Lead.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Lead.java @@ -45,19 +45,19 @@ public abstract class Lead extends AggFunction<Datum> { if (params.size() == 1) { leadCtx.leadNum = 1; } else { - leadCtx.leadNum = params.get(1).asInt4(); + leadCtx.leadNum = params.getInt4(1); } } if (leadCtx.leadNum > 0) { leadCtx.leadNum --; } else { - leadCtx.leadBuffer.add(params.get(0)); + leadCtx.leadBuffer.add(params.asDatum(0)); } if (leadCtx.defaultDatum == null) { if (params.size() == 3) { - leadCtx.defaultDatum = params.get(2); + leadCtx.defaultDatum = params.asDatum(2); } else { leadCtx.defaultDatum = NullDatum.get(); }
