From 358b0aa313090653ea200b4e08aed975f7e16100 Mon Sep 17 00:00:00 2001 From: "navis.ryu" Date: Thu, 26 Mar 2015 23:19:52 +0900 Subject: [PATCH] TAJO-1450 Encapsulate Datum in Tuple --- .../apache/tajo/jdbc/TajoResultSetBase.java | 306 +++++++----------- .../org/apache/tajo/storage/RowStoreUtil.java | 48 ++- .../java/org/apache/tajo/datum/DateDatum.java | 34 +- .../java/org/apache/tajo/datum/Datum.java | 7 + .../org/apache/tajo/datum/DatumFactory.java | 4 +- .../org/apache/tajo/datum/Float4Datum.java | 6 +- .../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 | 36 ++- .../java/org/apache/tajo/storage/Tuple.java | 79 ++--- .../java/org/apache/tajo/storage/VTuple.java | 45 ++- .../tajo/util/datetime/DateTimeUtil.java | 12 +- .../apache/tajo/datum/TestTimestampDatum.java | 2 +- .../apache/tajo/util/TestDateTimeFormat.java | 2 +- .../engine/function/builtin/AvgDouble.java | 10 +- .../engine/function/builtin/AvgFloat.java | 5 +- .../tajo/engine/function/builtin/AvgInt.java | 5 +- .../tajo/engine/function/builtin/AvgLong.java | 10 +- .../engine/function/builtin/Coalesce.java | 5 +- .../engine/function/builtin/CountRows.java | 2 +- .../engine/function/builtin/CountValue.java | 2 +- .../function/builtin/CountValueDistinct.java | 13 +- .../tajo/engine/function/builtin/Date.java | 2 +- .../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 +- .../engine/function/builtin/RandomInt.java | 2 +- .../engine/function/builtin/SumDouble.java | 5 +- .../function/builtin/SumDoubleDistinct.java | 10 +- .../engine/function/builtin/SumFloat.java | 5 +- .../function/builtin/SumFloatDistinct.java | 10 +- .../function/builtin/SumIntDistinct.java | 10 +- .../tajo/engine/function/builtin/SumLong.java | 5 +- .../function/builtin/SumLongDistinct.java | 10 +- .../engine/function/builtin/Variance.java | 13 +- .../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 +- .../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 +- .../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 +- .../tajo/engine/function/math/Acos.java | 5 +- .../tajo/engine/function/math/Asin.java | 5 +- .../tajo/engine/function/math/Atan.java | 5 +- .../tajo/engine/function/math/Atan2.java | 6 +- .../tajo/engine/function/math/Cbrt.java | 5 +- .../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 +- .../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 +- .../tajo/engine/function/math/Round.java | 5 +- .../engine/function/math/RoundFloat8.java | 9 +- .../tajo/engine/function/math/Sign.java | 5 +- .../apache/tajo/engine/function/math/Sin.java | 5 +- .../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 +- .../engine/function/string/BitLength.java | 8 +- .../engine/function/string/CharLength.java | 7 +- .../tajo/engine/function/string/Chr.java | 7 +- .../tajo/engine/function/string/Concat.java | 9 +- .../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 +- .../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 +- .../tajo/engine/function/string/Md5.java | 11 +- .../engine/function/string/OctetLength.java | 5 +- .../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 +- .../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 +- .../engine/function/string/ToCharLong.java | 4 +- .../tajo/engine/function/string/ToHex.java | 5 +- .../tajo/engine/function/string/Upper.java | 7 +- .../engine/function/window/FirstValue.java | 6 +- .../tajo/engine/function/window/Lag.java | 8 +- .../tajo/engine/function/window/Rank.java | 2 +- .../planner/RangePartitionAlgorithm.java | 66 ++-- .../engine/planner/UniformRangePartition.java | 214 ++++++------ .../planner/physical/BSTIndexScanExec.java | 3 +- .../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 +- .../physical/HashFullOuterJoinExec.java | 4 +- .../engine/planner/physical/HashJoinExec.java | 4 +- .../physical/HashLeftOuterJoinExec.java | 4 +- .../planner/physical/HashPartitioner.java | 2 +- .../planner/physical/JoinTupleComparator.java | 4 +- .../physical/RangeShuffleFileWriteExec.java | 23 +- .../planner/physical/SortAggregateExec.java | 9 +- .../SortBasedColPartitionStoreExec.java | 5 +- .../planner/physical/WindowAggExec.java | 8 +- .../apache/tajo/engine/utils/TupleUtil.java | 4 +- .../NonForwardQueryResultSystemScanner.java | 20 +- .../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 | 204 ++++++------ .../planner/global/TestBroadcastJoinPlan.java | 2 +- .../planner/physical/TestBNLJoinExec.java | 10 +- .../planner/physical/TestBSTIndexExec.java | 4 +- .../physical/TestExternalSortExec.java | 2 +- .../physical/TestFullOuterHashJoinExec.java | 6 +- .../physical/TestFullOuterMergeJoinExec.java | 8 +- .../physical/TestHashAntiJoinExec.java | 10 +- .../planner/physical/TestHashJoinExec.java | 10 +- .../planner/physical/TestHashPartitioner.java | 10 +- .../physical/TestHashSemiJoinExec.java | 10 +- .../physical/TestLeftOuterHashJoinExec.java | 6 +- .../physical/TestLeftOuterNLJoinExec.java | 6 +- .../planner/physical/TestMergeJoinExec.java | 10 +- .../planner/physical/TestNLJoinExec.java | 10 +- .../planner/physical/TestPhysicalPlanner.java | 68 ++-- .../TestProgressExternalSortExec.java | 2 +- .../physical/TestRightOuterHashJoinExec.java | 6 +- .../physical/TestRightOuterMergeJoinExec.java | 8 +- .../engine/planner/physical/TestSortExec.java | 8 +- .../planner/physical/TestTupleSorter.java | 4 +- .../tajo/engine/util/TestTupleUtil.java | 23 +- ...estNonForwardQueryResultSystemScanner.java | 16 +- .../org/apache/tajo/storage/TestRowFile.java | 4 +- .../org/apache/tajo/jdbc/MetaDataTuple.java | 53 +-- .../tajo/jdbc/TajoMetaDataResultSet.java | 14 +- .../org/apache/tajo/plan/ExprAnnotator.java | 2 +- .../org/apache/tajo/plan/expr/FieldEval.java | 2 +- .../function/python/PythonScriptEngine.java | 2 +- .../function/stream/CSVLineSerializer.java | 2 +- .../TextFieldSerializerDeserializer.java | 4 +- .../tajo/storage/BaseTupleComparator.java | 4 +- .../storage/BinarySerializerDeserializer.java | 46 +-- .../org/apache/tajo/storage/FrameTuple.java | 68 ++-- .../org/apache/tajo/storage/LazyTuple.java | 47 +-- .../org/apache/tajo/storage/RowStoreUtil.java | 46 +-- .../tajo/storage/SerializerDeserializer.java | 7 +- .../apache/tajo/storage/TableStatistics.java | 31 +- .../storage/TextSerializerDeserializer.java | 67 ++-- .../org/apache/tajo/storage/TupleRange.java | 14 +- .../apache/tajo/tuple/offheap/HeapTuple.java | 49 +-- .../tajo/tuple/offheap/UnSafeTuple.java | 63 ++-- .../apache/tajo/storage/TestFrameTuple.java | 14 +- .../apache/tajo/storage/TestLazyTuple.java | 26 +- .../tajo/storage/TestTupleComparator.java | 7 +- .../org/apache/tajo/storage/TestVTuple.java | 23 +- .../tuple/offheap/TestOffHeapRowBlock.java | 26 +- .../storage/hbase/AbstractHBaseAppender.java | 15 +- .../HBaseBinarySerializerDeserializer.java | 35 ++ .../tajo/storage/hbase/HBasePutAppender.java | 6 +- .../storage/hbase/HBaseStorageManager.java | 4 +- .../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 +- .../tajo/storage/avro/AvroAppender.java | 5 +- .../tajo/storage/json/JsonLineSerializer.java | 2 +- .../tajo/storage/parquet/ParquetAppender.java | 2 +- .../storage/parquet/TajoRecordConverter.java | 2 +- .../storage/parquet/TajoWriteSupport.java | 22 +- .../apache/tajo/storage/rcfile/RCFile.java | 22 +- .../sequencefile/SequenceFileAppender.java | 23 +- .../sequencefile/SequenceFileScanner.java | 3 +- .../storage/text/CSVLineDeserializer.java | 3 +- .../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 | 8 +- .../org/apache/tajo/storage/TestStorages.java | 45 ++- .../tajo/storage/index/TestBSTIndex.java | 92 +++--- .../index/TestSingleCSVFileBSTIndex.java | 24 +- .../tajo/storage/json/TestJsonSerDe.java | 3 +- .../tajo/storage/parquet/TestReadWrite.java | 2 +- 220 files changed, 1719 insertions(+), 1864 deletions(-) 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 77cbbf278a..ed06cf3db5 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 @@ protected void init() { 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 void beforeFirst() throws SQLException { @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 @@ private Date getDate(DateDatum datum, TimeZone tz) { @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 @@ private Time getTime(TimeDatum datum, TimeZone tz) { @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); } 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 385f99cb5a..6b735b1a33 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 @@ -44,14 +44,6 @@ public static int[] getTargetIds(Schema inSchema, Schema outSchema) { 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); } @@ -76,7 +68,7 @@ private RowStoreDecoder(Schema schema) { 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; @@ -187,7 +179,7 @@ private RowStoreEncoder(Schema schema) { 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; } @@ -195,39 +187,39 @@ private RowStoreEncoder(Schema schema) { 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 CHAR: bb.put(tuple.get(i).asByte()); 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 BOOLEAN: bb.put(tuple.getByte(i)); break; + case BIT: bb.put(tuple.getByte(i)); break; + case CHAR: 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 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())); } @@ -251,7 +243,7 @@ private int estimateTupleDataSize(Tuple tuple) { Column col; for (int i = 0; i < schema.size(); i++) { - if (tuple.isNull(i)) { + if (tuple.isBlankOrNull(i)) { continue; } @@ -270,9 +262,9 @@ private int estimateTupleDataSize(Tuple tuple) { 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())); } 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 65342e8df0..093a8be003 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 DateDatum(TimeMeta tm) { dayOfMonth = tm.dayOfMonth; } - public TimeMeta toTimeMeta() { + public TimeMeta asTimeMeta() { TimeMeta tm = new TimeMeta(); tm.years = year; tm.monthOfYear = monthOfYear; @@ -56,7 +56,7 @@ public TimeMeta toTimeMeta() { } public int getCenturyOfEra() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.getCenturyOfEra(); } @@ -65,7 +65,7 @@ public int getYear() { } public int getWeekyear() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.getWeekyear(); } @@ -74,22 +74,22 @@ public int getMonthOfYear() { } 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 Datum plus(Datum 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 Datum minus(Datum 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 int compareTo(Datum 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; 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 1ff305df50..e3e12956e8 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.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 String asChars() { throw new InvalidCastException(type, Type.TEXT); } + // todo remove this public char [] asUnicodeChars() { throw new InvalidCastException(type, Type.TEXT); } @@ -110,6 +112,10 @@ public byte[] asTextBytes() { return asChars().getBytes(); } + public TimeMeta asTimeMeta() { + throw new InvalidCastException(type, Type.INT8); + } + public boolean isNumeric() { return isNumber() || isReal(); } @@ -133,6 +139,7 @@ protected static void initAbortWhenDivideByZero(TajoConf tajoConf) { public abstract int size(); + // belows should be extracted out of datum public Datum and(Datum datum) { throw new InvalidOperationException(datum.type); } 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 bd1b88fa6b..480582ae7b 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 static Datum cast(Datum operandDatum, DataType target, @Nullable TimeZone 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 static Datum cast(Datum operandDatum, DataType target, @Nullable TimeZone 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()); } 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 e71a20189b..0fe598a2e6 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 Datum plus(Datum datum) { 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 Datum minus(Datum datum) { 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: 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 a0298f2a15..6ebe10be87 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 Datum plus(Datum datum) { 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 Datum minus(Datum datum) { 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: 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 f11a5c5d3b..6145c758ae 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 Datum plus(Datum datum) { 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 Datum minus(Datum datum) { 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: 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 ea531b9a7d..530ef8450e 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 Datum plus(Datum datum) { 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 Datum minus(Datum datum) { 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: 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 cd448e3a73..66c093ab05 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 Datum plus(Datum datum) { 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 Datum minus(Datum datum) { 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: 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 e8d439df2e..d3cb6c78b3 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 Datum plus(Datum 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 Datum divide(Datum 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 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 04cce54bcc..578665737b 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 TimeDatum(long time) { this.time = time; } - public TimeMeta toTimeMeta() { + @Override + public TimeMeta asTimeMeta() { TimeMeta tm = new TimeMeta(); DateTimeUtil.date2j(time, tm); @@ -46,12 +47,12 @@ public TimeMeta toTimeMeta() { } 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 int getSecondOfMinute() { } public int getMillisOfSecond() { - TimeMeta tm = toTimeMeta(); + TimeMeta tm = asTimeMeta(); return tm.fsecs / 1000; } @@ -92,12 +93,11 @@ public double asFloat8() { @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 String asChars(TimeZone timeZone, boolean includeTimeZone) { } public String toString(TimeZone timeZone, boolean includeTimeZone) { - return asChars(timeZone, includeTimeZone); + return asChars(asTimeMeta(), timeZone, includeTimeZone); } @Override @@ -124,12 +124,12 @@ public Datum plus(Datum 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 Datum minus(Datum 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: 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 ad73c749ba..02425ebe4a 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 long getJavaTimestamp() { 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 String toString() { 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 long asInt8() { @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 int compareTo(Datum 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 boolean equals(Object obj) { 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 Datum minus(Datum 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 int hashCode(){ return Longs.hashCode(timestamp); } - public TimeMeta toTimeMeta() { + @Override + public TimeMeta asTimeMeta() { TimeMeta tm = new TimeMeta(); DateTimeUtil.toJulianTimeMeta(timestamp, tm); 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 89e72ed092..e65b63b468 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,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; /* This class doesn’t have content datum. if selected column is zero, this is useful * e.g. select count(*) from table @@ -51,13 +53,13 @@ public boolean contains(int fieldId) { } @Override - public boolean isNull(int fieldid) { + public boolean isBlank(int fieldid) { return true; } @Override - public boolean isNotNull(int fieldid) { - return false; + public boolean isBlankOrNull(int fieldid) { + return true; } @Override @@ -70,28 +72,22 @@ public void put(int fieldId, Datum value) { } @Override - public void put(int fieldId, Datum[] values) { - throw new UnsupportedOperationException(); - } - - @Override - public void put(int fieldId, Tuple tuple) { - throw new UnsupportedOperationException(); + public Datum asDatum(int fieldId) { + return NullDatum.get(); } @Override - public void put(Datum[] values) { - throw new UnsupportedOperationException(); + public TajoDataTypes.Type type(int fieldId) { + return null; } @Override - public Datum get(int fieldId) { - return NullDatum.get(); + public int size(int fieldId) { + return 0; } @Override public void setOffset(long offset) { - } @Override @@ -119,6 +115,11 @@ 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(); @@ -149,6 +150,11 @@ 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(); 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 aec784fc52..5263d0ac2e 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,67 @@ 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); - void put(int fieldId, Tuple tuple); - - void put(Datum[] values); - - Datum get(int fieldId); - - void setOffset(long offset); - - long getOffset(); + boolean isBlankOrNull(int fieldid); - boolean getBool(int fieldId); + void clear(); - byte getByte(int fieldId); + void put(int fieldId, Datum value); + + Datum asDatum(int fieldId); + + TajoDataTypes.Type type(int fieldId); + + int size(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(); } 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 5e839b7e58..0acf0a35c6 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,11 +19,13 @@ 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; @@ -42,7 +44,7 @@ public VTuple(Tuple tuple) { public VTuple(Datum[] datum) { this(datum.length); - put(datum); + this.values = Arrays.copyOf(datum, datum.length); } @Override @@ -55,17 +57,17 @@ public boolean contains(int fieldId) { } @Override - public boolean isNull(int fieldid) { - return values[fieldid] == null || values[fieldid].isNull(); + public boolean isBlank(int fieldid) { + return values[fieldid] == null; } @Override - public boolean isNotNull(int fieldid) { - return !isNull(fieldid); + public boolean isBlankOrNull(int fieldid) { + return values[fieldid] == null || values[fieldid].isNull(); } @Override - public void clear() { + public void clear() { for (int i=0; i < values.length; i++) { values[i] = null; } @@ -79,23 +81,24 @@ public void put(int fieldId, Datum 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 ////////////////////////////////////////////////////// @@ -131,6 +134,11 @@ public char getChar(int fieldId) { return values[fieldId].asByteArray(); } + @Override + public byte[] getTextBytes(int fieldId) { + return values[fieldId].asTextBytes(); + } + @Override public short getInt2(int fieldId) { return values[fieldId].asInt2(); @@ -177,6 +185,11 @@ public String getText(int fieldId) { return values[fieldId].asChars(); } + @Override + public TimeMeta getTimeDate(int fieldId) { + return values[fieldId].asTimeMeta(); + } + @Override public ProtobufDatum getProtobufDatum(int fieldId) { return (ProtobufDatum) values[fieldId]; @@ -193,7 +206,7 @@ public char[] getUnicodeChars(int fieldId) { } @Override - public Tuple clone() throws CloneNotSupportedException { + public VTuple clone() throws CloneNotSupportedException { VTuple tuple = (VTuple) super.clone(); tuple.values = new Datum[size()]; 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 15b423667a..570873d1ab 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 static long getYear(TimeMeta dateTime) { } 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; } - + } 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 06e50f7563..7cb31231c3 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 final void testToJson() { 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 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 2b5dba090b..a9af36cc1f 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 @@ private void evalToCharAndAssert(String dateTimeText, String toTimestampFormatTe 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); } } 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 3ccb02dbc0..a1805c477b 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 AvgContext newContext() { @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 void eval(FunctionContext ctx, Tuple params) { @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(); 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 8162319459..1e778a87e9 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 AvgFloat() { @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++; } } 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 1950fb1208..b49c61b908 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 AvgInt() { @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++; } } 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 88f84861b2..651f540120 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 AvgContext newContext() { @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 void eval(FunctionContext ctx, Tuple params) { @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(); 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 474f771938..05847ad186 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 Coalesce(Column[] definedArgs) { 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(); } 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 5e41dc9dde..2eabe0b370 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 void eval(FunctionContext ctx, Tuple params) { @Override public void merge(FunctionContext ctx, Tuple part) { - ((CountRowContext) ctx).count += part.get(0).asInt8(); + ((CountRowContext) ctx).count += part.getInt8(0); } @Override 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 1abfcb748e..a2f06ff5e5 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 CountValue() { @Override public void eval(FunctionContext ctx, Tuple params) { - if (!(params.get(0) instanceof NullDatum)) { + if (!params.isBlankOrNull(0)) { ((CountRowContext) ctx).count++; } } 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 675193f6ac..f247968639 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 void eval(FunctionContext context, Tuple params) { } @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++; + } } } 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 aee7c60fcc..05928d6d1e 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 Date() { 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; 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 16edb170ae..190bd81137 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 FunctionContext newContext() { @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); } } 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 2e95eb7e8e..8edf1fb48e 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 void eval(FunctionContext ctx, Tuple params) { 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(); } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Max.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Max.java index 6931ffc77f..e2636beabd 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Max.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Max.java @@ -38,11 +38,11 @@ public FunctionContext newContext() { @Override public void eval(FunctionContext ctx, Tuple params) { MaxContext maxCtx = (MaxContext) ctx; - Datum datum = params.get(0); - if (datum.isNotNull()) { - if (maxCtx.max == null || maxCtx.max.compareTo(datum) < 0) { - maxCtx.max = datum; - } + if (!params.isBlankOrNull(0)) { + Datum datum = params.asDatum(0); + if (maxCtx.max == null || maxCtx.max.compareTo(datum) < 0) { + maxCtx.max = datum; + } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Min.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Min.java index 9a2e3ad793..21058f2346 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Min.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Min.java @@ -38,8 +38,8 @@ public FunctionContext newContext() { @Override public void eval(FunctionContext ctx, Tuple params) { MinContext minCtx = (MinContext) ctx; - Datum datum = params.get(0); - if (datum.isNotNull()) { + if (!params.isBlankOrNull(0)) { + Datum datum = params.asDatum(0); if (minCtx.min == null || minCtx.min.compareTo(datum) > 0) { minCtx.min = datum; } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/RandomInt.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/RandomInt.java index 6901d7b1ad..97288a0720 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/RandomInt.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/RandomInt.java @@ -51,7 +51,7 @@ public RandomInt() { @Override public Datum eval(Tuple params) { - return DatumFactory.createInt4(random.nextInt(params.get(0).asInt4())); + return DatumFactory.createInt4(random.nextInt(params.getInt4(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumDouble.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumDouble.java index ca33b6f827..2d1b2acd7f 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumDouble.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumDouble.java @@ -62,11 +62,10 @@ public FunctionContext newContext() { @Override public void eval(FunctionContext ctx, Tuple params) { - Datum datum = params.get(0); - if (datum.isNotNull()) { + if (!params.isBlankOrNull(0)) { SumContext sumCtx = (SumContext)ctx; sumCtx.hasNonNull = true; - sumCtx.sum += datum.asFloat8(); + sumCtx.sum += params.getFloat8(0); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumDoubleDistinct.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumDoubleDistinct.java index 76c79f2c2b..bb615dd4c2 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumDoubleDistinct.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumDoubleDistinct.java @@ -65,10 +65,12 @@ public void eval(FunctionContext ctx, Tuple params) { @Override public void merge(FunctionContext context, Tuple params) { SumContext distinctContext = (SumContext) context; - Datum value = params.get(0); - if ((distinctContext.latest == null || (!distinctContext.latest.equals(value)) && !(value instanceof NullDatum))) { - distinctContext.latest = value; - distinctContext.sum += value.asFloat8(); + if (!params.isBlankOrNull(0)) { + Datum value = params.asDatum(0); + if (distinctContext.latest == null || !distinctContext.latest.equals(value)) { + distinctContext.latest = value; + distinctContext.sum += value.asFloat8(); + } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumFloat.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumFloat.java index f63aa561be..4390e71477 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumFloat.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumFloat.java @@ -51,11 +51,10 @@ public SumFloat() { @Override public void eval(FunctionContext ctx, Tuple params) { - Datum datum = params.get(0); - if (datum.isNotNull()) { + if (!params.isBlankOrNull(0)) { SumContext sumCtx = (SumContext)ctx; sumCtx.hasNonNull = true; - sumCtx.sum += datum.asFloat4(); + sumCtx.sum += params.getFloat4(0); } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumFloatDistinct.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumFloatDistinct.java index a1855b41e9..6cad5c9258 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumFloatDistinct.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumFloatDistinct.java @@ -65,10 +65,12 @@ public void eval(FunctionContext ctx, Tuple params) { @Override public void merge(FunctionContext context, Tuple params) { SumContext distinctContext = (SumContext) context; - Datum value = params.get(0); - if ((distinctContext.latest == null || (!distinctContext.latest.equals(value)) && !(value instanceof NullDatum))) { - distinctContext.latest = value; - distinctContext.sum += value.asFloat4(); + if (!params.isBlankOrNull(0)) { + Datum value = params.asDatum(0); + if (distinctContext.latest == null || !distinctContext.latest.equals(value)) { + distinctContext.latest = value; + distinctContext.sum += value.asFloat4(); + } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumIntDistinct.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumIntDistinct.java index 77eb7a67f6..f3cda4aa3d 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumIntDistinct.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumIntDistinct.java @@ -65,10 +65,12 @@ public void eval(FunctionContext ctx, Tuple params) { @Override public void merge(FunctionContext context, Tuple params) { SumContext distinctContext = (SumContext) context; - Datum value = params.get(0); - if ((distinctContext.latest == null || (!distinctContext.latest.equals(value)) && !(value instanceof NullDatum))) { - distinctContext.latest = value; - distinctContext.sum += value.asInt4(); + if (!params.isBlankOrNull(0)) { + Datum value = params.asDatum(0); + if (distinctContext.latest == null || !distinctContext.latest.equals(value)) { + distinctContext.latest = value; + distinctContext.sum += value.asInt4(); + } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumLong.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumLong.java index 6503a83d32..f00a33bde6 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumLong.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumLong.java @@ -62,11 +62,10 @@ public FunctionContext newContext() { @Override public void eval(FunctionContext ctx, Tuple params) { - Datum datum = params.get(0); - if (datum.isNotNull()) { + if (!params.isBlankOrNull(0)) { SumContext sumCtx = (SumContext) ctx; sumCtx.hasNonNull = true; - sumCtx.sum += datum.asInt8(); + sumCtx.sum += params.getInt8(0); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumLongDistinct.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumLongDistinct.java index f22a4836c3..2be6d8183c 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumLongDistinct.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/SumLongDistinct.java @@ -65,10 +65,12 @@ public void eval(FunctionContext ctx, Tuple params) { @Override public void merge(FunctionContext context, Tuple params) { SumContext distinctContext = (SumContext) context; - Datum value = params.get(0); - if ((distinctContext.latest == null || (!distinctContext.latest.equals(value)) && !(value instanceof NullDatum))) { - distinctContext.latest = value; - distinctContext.sum += value.asInt8(); + if (!params.isBlankOrNull(0)) { + Datum value = params.asDatum(0); + if (distinctContext.latest == null || !distinctContext.latest.equals(value)) { + distinctContext.latest = value; + distinctContext.sum += value.asInt8(); + } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Variance.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Variance.java index 3d925d1cfd..5fa58afe3a 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Variance.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Variance.java @@ -44,23 +44,22 @@ public VarianceContext newContext() { @Override public void eval(FunctionContext ctx, Tuple params) { VarianceContext varianceCtx = (VarianceContext) ctx; - Datum datum = params.get(0); - if (datum.isNotNull()) { - double delta = datum.asFloat8() - varianceCtx.avg; + if (!params.isBlankOrNull(0)) { + double value = params.getFloat8(0); + double delta = value - varianceCtx.avg; varianceCtx.count++; varianceCtx.avg += delta/varianceCtx.count; - varianceCtx.squareSumOfDiff += delta * (datum.asFloat8() - varianceCtx.avg); + varianceCtx.squareSumOfDiff += delta * (value - varianceCtx.avg); } } @Override public void merge(FunctionContext ctx, Tuple part) { VarianceContext varianceCtx = (VarianceContext) 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); VarianceProto proto = (VarianceProto) datum.get(); double delta = proto.getAvg() - varianceCtx.avg; varianceCtx.avg += delta * proto.getCount() / (varianceCtx.count + proto.getCount()); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddDays.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddDays.java index 643e2c0fe6..5543024f98 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddDays.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddDays.java @@ -53,8 +53,8 @@ public AddDays() { @Override public Datum eval(Tuple params) { - Datum dateDatum = params.get(0); - long val = params.get(1).asInt8(); + Datum dateDatum = params.asDatum(0); + long val = params.getInt8(1); if (val >= 0) { return dateDatum.plus(new IntervalDatum(val * IntervalDatum.DAY_MILLIS)); } else { diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddMonths.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddMonths.java index aef258afe6..016a25cfec 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddMonths.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddMonths.java @@ -53,12 +53,12 @@ public AddMonths() { @Override public Datum eval(Tuple params) { - Datum dateDatum = params.get(0); - int val = params.get(1).asInt4(); + Datum dateDatum = params.asDatum(0); + int val = params.getInt4(1); if (val >= 0) { return dateDatum.plus(new IntervalDatum(val, 0)); } else { - return dateDatum.minus(new IntervalDatum(0- val, 0)); + return dateDatum.minus(new IntervalDatum(-val, 0)); } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromDate.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromDate.java index 069a7ee969..1f897ca14c 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromDate.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromDate.java @@ -25,6 +25,7 @@ import org.apache.tajo.engine.function.annotation.Description; import org.apache.tajo.engine.function.annotation.ParamTypes; import org.apache.tajo.storage.Tuple; +import org.apache.tajo.util.datetime.TimeMeta; import static org.apache.tajo.common.TajoDataTypes.Type.*; @@ -48,21 +49,15 @@ public DatePartFromDate() { @Override public Datum eval(Tuple params) { - Datum target = params.get(0); - if(target instanceof NullDatum || params.get(1) instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1) || params.type(1) != DATE) { return NullDatum.get(); } - DateDatum date; - if(params.get(1) instanceof DateDatum) { - date = (DateDatum)(params.get(1)); - } else { - return NullDatum.get(); - } + TimeMeta timeMeta = params.getTimeDate(1); if (extractor == null) { - String extractType = target.asChars().toLowerCase(); + String extractType = params.getText(0).toLowerCase(); if (extractType.equals("century")) { extractor = new CenturyExtractorFromDate(); @@ -93,100 +88,100 @@ public Datum eval(Tuple params) { } } - return extractor.extract(date); + return extractor.extract(timeMeta); } private interface DatePartExtractorFromDate { - public Datum extract(DateDatum date); + public Datum extract(TimeMeta timeMeta); } private static class CenturyExtractorFromDate implements DatePartExtractorFromDate { @Override - public Datum extract(DateDatum date) { - return DatumFactory.createFloat8((double) date.getCenturyOfEra()); + public Datum extract(TimeMeta timeMeta) { + return DatumFactory.createFloat8((double) timeMeta.getCenturyOfEra()); } } private static class DayExtractorFromDate implements DatePartExtractorFromDate { @Override - public Datum extract(DateDatum date) { - return DatumFactory.createFloat8((double) date.getDayOfMonth()); + public Datum extract(TimeMeta timeMeta) { + return DatumFactory.createFloat8((double) timeMeta.dayOfMonth); } } private static class DecadeExtractorFromDate implements DatePartExtractorFromDate { @Override - public Datum extract(DateDatum date) { - return DatumFactory.createFloat8((date.getYear() / 10.0d)); + public Datum extract(TimeMeta timeMeta) { + return DatumFactory.createFloat8((timeMeta.years / 10.0d)); } } private static class DowExtractorFromDate implements DatePartExtractorFromDate { @Override - public Datum extract(DateDatum date) { - return DatumFactory.createFloat8((double) date.getDayOfWeek()); + public Datum extract(TimeMeta timeMeta) { + return DatumFactory.createFloat8((double) timeMeta.getDayOfWeek()); } } private static class DoyExtractorFromDate implements DatePartExtractorFromDate { @Override - public Datum extract(DateDatum date) { - return DatumFactory.createFloat8((double) date.getDayOfYear()); + public Datum extract(TimeMeta timeMeta) { + return DatumFactory.createFloat8((double) timeMeta.getDayOfYear()); } } private static class ISODowExtractorFromDate implements DatePartExtractorFromDate { @Override - public Datum extract(DateDatum date) { - return DatumFactory.createFloat8((double) date.getISODayOfWeek()); + public Datum extract(TimeMeta timeMeta) { + return DatumFactory.createFloat8((double) timeMeta.getISODayOfWeek()); } } private static class ISOYearExtractorFromDate implements DatePartExtractorFromDate { @Override - public Datum extract(DateDatum date) { - return DatumFactory.createFloat8((double) date.getWeekyear()); + public Datum extract(TimeMeta timeMeta) { + return DatumFactory.createFloat8((double) timeMeta.getWeekyear()); } } private static class MillenniumExtractorFromDate implements DatePartExtractorFromDate { @Override - public Datum extract(DateDatum date) { - return DatumFactory.createFloat8((double) (((date.getYear() - 1) / 1000) + 1)); + public Datum extract(TimeMeta timeMeta) { + return DatumFactory.createFloat8((double) (((timeMeta.years - 1) / 1000) + 1)); } } private static class MonthExtractorFromDate implements DatePartExtractorFromDate { @Override - public Datum extract(DateDatum date) { - return DatumFactory.createFloat8((double) date.getMonthOfYear()); + public Datum extract(TimeMeta timeMeta) { + return DatumFactory.createFloat8((double) timeMeta.monthOfYear); } } private static class QuarterExtractorFromDate implements DatePartExtractorFromDate { @Override - public Datum extract(DateDatum date) { - return DatumFactory.createFloat8((double) (((date.getMonthOfYear() - 1) / 3) + 1)); + public Datum extract(TimeMeta timeMeta) { + return DatumFactory.createFloat8((double) (((timeMeta.monthOfYear - 1) / 3) + 1)); } } private static class WeekExtractorFromDate implements DatePartExtractorFromDate { @Override - public Datum extract(DateDatum date) { - return DatumFactory.createFloat8((double) date.getWeekOfYear()); + public Datum extract(TimeMeta timeMeta) { + return DatumFactory.createFloat8((double) timeMeta.getWeekOfYear()); } } private static class YearExtractorFromDate implements DatePartExtractorFromDate { @Override - public Datum extract(DateDatum date) { - return DatumFactory.createFloat8((double) date.getYear()); + public Datum extract(TimeMeta timeMeta) { + return DatumFactory.createFloat8((double) timeMeta.years); } } private static class NullExtractorFromDate implements DatePartExtractorFromDate { @Override - public Datum extract(DateDatum date) { + public Datum extract(TimeMeta timeMeta) { return NullDatum.get(); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTime.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTime.java index 8100379eaa..8848af6522 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTime.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTime.java @@ -27,7 +27,6 @@ import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.DatumFactory; import org.apache.tajo.datum.NullDatum; -import org.apache.tajo.datum.TimeDatum; import org.apache.tajo.engine.function.annotation.Description; import org.apache.tajo.engine.function.annotation.ParamTypes; import org.apache.tajo.plan.expr.FunctionEval; @@ -39,6 +38,7 @@ import java.util.TimeZone; +import static org.apache.tajo.common.TajoDataTypes.Type.TIME; import static org.apache.tajo.common.TajoDataTypes.Type.FLOAT8; import static org.apache.tajo.common.TajoDataTypes.Type.TEXT; @@ -69,21 +69,13 @@ public void init(OverridableConf context, FunctionEval.ParamType [] types) { @Override public Datum eval(Tuple params) { - Datum target = params.get(0); - TimeDatum time = null; - if(target instanceof NullDatum || params.get(1) instanceof NullDatum) { - return NullDatum.get(); - } - - if(params.get(1) instanceof TimeDatum) { - time = (TimeDatum)(params.get(1)); - } else { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1) || params.type(1) != TIME) { return NullDatum.get(); } if (extractor == null) { - String extractType = target.asChars().toLowerCase(); + String extractType = params.getText(0).toLowerCase(); if (extractType.equals("hour")) { extractor = new HourExtractorFromTime(); @@ -100,7 +92,7 @@ public Datum eval(Tuple params) { } } - TimeMeta tm = time.toTimeMeta(); + TimeMeta tm = params.getTimeDate(1); DateTimeUtil.toUserTimezone(tm, timezone); return extractor.extract(tm); } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTimestamp.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTimestamp.java index a115d001f3..05fa8e495f 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTimestamp.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTimestamp.java @@ -65,21 +65,13 @@ public void init(OverridableConf context, FunctionEval.ParamType [] types) { @Override public Datum eval(Tuple params) { - Datum target = params.get(0); - TimestampDatum timestamp; - if(target instanceof NullDatum || params.get(1) instanceof NullDatum) { - return NullDatum.get(); - } - - if(params.get(1) instanceof TimestampDatum) { - timestamp = (TimestampDatum)(params.get(1)); - } else { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1) || params.type(1) != TIMESTAMP) { return NullDatum.get(); } if (extractor == null) { - String extractType = target.asChars().toLowerCase(); + String extractType = params.getText(0).toLowerCase(); if (extractType.equals("century")) { extractor = new CenturyExtractorFromTimestamp(); @@ -128,7 +120,7 @@ public Datum eval(Tuple params) { } } - TimeMeta tm = timestamp.toTimeMeta(); + TimeMeta tm = params.getTimeDate(1); DateTimeUtil.toUserTimezone(tm, timezone); return extractor.extract(tm); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DateTimePartFromUnixTimestamp.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DateTimePartFromUnixTimestamp.java index 6bf99dd4aa..d017b36c77 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DateTimePartFromUnixTimestamp.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DateTimePartFromUnixTimestamp.java @@ -57,24 +57,16 @@ public DateTimePartFromUnixTimestamp() { @Override public Datum eval(Tuple params) { - Datum target = params.get(0); - TimeMeta dateTime; - Int4Datum dayOfWeek = null; - - if (target instanceof NullDatum || params.get(1) instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1) || params.type(1) != INT8) { return NullDatum.get(); } - if (params.get(1) instanceof Int8Datum) { - dateTime = DateTimeUtil.getUTCDateTime((Int8Datum) (params.get(1))); - } else { - return NullDatum.get(); - } + TimeMeta dateTime = DateTimeUtil.getUTCDateTime(params.getInt8(1)); - if ( null == extractor || null == weekExtractor) { + if (extractor == null && weekExtractor == null) { - String extractType = target.asChars().toLowerCase(); + String extractType = params.getText(0).toLowerCase(); if (extractType.equals("day")) { extractor = new DayExtractorFromTime(); @@ -85,15 +77,15 @@ public Datum eval(Tuple params) { } else if (extractType.equals("year")) { extractor = new YearExtractorFromTime(); } else if (extractType.equals("week")) { - if (params.get(2) instanceof NullDatum) { - return NullDatum.get(); - } - dayOfWeek = (Int4Datum) params.get(2); weekExtractor = new WeekExtractorFromTime(); } } - return null != weekExtractor ? weekExtractor.extract(dateTime, dayOfWeek.asInt4()) : extractor.extract(dateTime); + if (extractor != null) { + return extractor.extract(dateTime); + } + + return params.isBlankOrNull(2) ? NullDatum.get() : weekExtractor.extract(dateTime, params.getInt4(2)); } private interface DateTimePartExtractorFromUnixTime { diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToCharTimestamp.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToCharTimestamp.java index 1053ecb55c..7b620e989c 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToCharTimestamp.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToCharTimestamp.java @@ -27,7 +27,6 @@ import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.DatumFactory; import org.apache.tajo.datum.NullDatum; -import org.apache.tajo.datum.TimestampDatum; import org.apache.tajo.engine.function.annotation.Description; import org.apache.tajo.engine.function.annotation.ParamTypes; import org.apache.tajo.plan.expr.FunctionEval; @@ -68,16 +67,15 @@ public void init(OverridableConf context, FunctionEval.ParamType[] paramTypes) { @Override public Datum eval(Tuple params) { - if(params.isNull(0) || params.isNull(1)) { + if(params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - TimestampDatum valueDatum = (TimestampDatum) params.get(0); - Datum pattern = params.get(1); + TimeMeta tm = params.getTimeDate(0); + String pattern = params.getText(1); - TimeMeta tm = valueDatum.toTimeMeta(); DateTimeUtil.toUserTimezone(tm, timezone); - return DatumFactory.createText(DateTimeFormat.to_char(tm, pattern.asChars())); + return DatumFactory.createText(DateTimeFormat.to_char(tm, pattern)); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToDate.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToDate.java index 9575e12a88..43f00144be 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToDate.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToDate.java @@ -48,12 +48,12 @@ public ToDate() { @Override public Datum eval(Tuple params) { - if(params.isNull(0) || params.isNull(1)) { + if(params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - String value = params.get(0).asChars(); - String pattern = params.get(1).asChars(); + String value = params.getText(0); + String pattern = params.getText(1); TimeMeta tm = DateTimeFormat.parseDateTime(value, pattern); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestampInt.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestampInt.java index 3821d76af3..5468b19825 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestampInt.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestampInt.java @@ -46,10 +46,9 @@ public ToTimestampInt() { @Override public Datum eval(Tuple params) { - Datum value = params.get(0); - if (value instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createTimestmpDatumWithUnixTime(value.asInt4()); + return DatumFactory.createTimestmpDatumWithUnixTime(params.getInt4(0)); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestampText.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestampText.java index 6b199f6cdd..ff927950ac 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestampText.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestampText.java @@ -60,14 +60,11 @@ public void init(OverridableConf queryContext, FunctionEval.ParamType [] paramTy @Override public Datum eval(Tuple params) { - if(params.isNull(0) || params.isNull(1)) { + if(params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - TextDatum dateTimeTextDatum = (TextDatum) params.get(0); - TextDatum patternDatum = (TextDatum) params.get(1); - - TimeMeta tm = DateTimeFormat.parseDateTime(dateTimeTextDatum.asChars(), patternDatum.asChars()); + TimeMeta tm = DateTimeFormat.parseDateTime(params.getText(0), params.getText(1)); DateTimeUtil.toUTCTimezone(tm, timezone); return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm)); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPCountryInet4.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPCountryInet4.java index 3789709976..8e69766ca0 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPCountryInet4.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPCountryInet4.java @@ -46,10 +46,9 @@ public GeoIPCountryInet4() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if (valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return new TextDatum(GeoIPUtil.getCountryCode(params.get(0).asChars())); + return new TextDatum(GeoIPUtil.getCountryCode(params.getText(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPCountryText.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPCountryText.java index 232e41419c..42dc8587e9 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPCountryText.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPCountryText.java @@ -47,10 +47,9 @@ public GeoIPCountryText() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if (valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return new TextDatum(GeoIPUtil.getCountryCode(params.get(0).asChars())); + return new TextDatum(GeoIPUtil.getCountryCode(params.getText(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPInCountryInet4.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPInCountryInet4.java index 46257a4766..91673569c0 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPInCountryInet4.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPInCountryInet4.java @@ -48,12 +48,12 @@ public GeoIPInCountryInet4() { @Override public Datum eval(Tuple params) { - if (params.get(0) instanceof NullDatum || params.get(1) instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - String addr = params.get(0).asChars(); - String otherCode = params.get(1).asChars(); + String addr = params.getText(0); + String otherCode = params.getText(1); String thisCode = GeoIPUtil.getCountryCode(addr); return DatumFactory.createBool(thisCode.equals(otherCode)); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPInCountryText.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPInCountryText.java index ebd4fad6fe..ec19063e5e 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPInCountryText.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/geoip/GeoIPInCountryText.java @@ -47,12 +47,12 @@ public GeoIPInCountryText() { @Override public Datum eval(Tuple params) { - if (params.get(0) instanceof NullDatum || params.get(1) instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - String addr = params.get(0).asChars(); - String otherCode = params.get(1).asChars(); + String addr = params.getText(0); + String otherCode = params.getText(1); String thisCode = GeoIPUtil.getCountryCode(addr); return DatumFactory.createBool(thisCode.equals(otherCode)); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/json/JsonExtractPathText.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/json/JsonExtractPathText.java index 27d342e2b5..84c14c6d97 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/json/JsonExtractPathText.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/json/JsonExtractPathText.java @@ -67,19 +67,16 @@ public JsonExtractPathText() { @Override public Datum eval(Tuple params) { - Datum json = params.get(0); - Datum xPath = params.get(1); - - if (json instanceof NullDatum || xPath instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } // default is JsonSmartMappingProvider try { - JSONObject object = (JSONObject) parser.parse(json.asTextBytes()); + JSONObject object = (JSONObject) parser.parse(params.getBytes(0)); if (jsonPath == null) { - jsonPath = JsonPath.compile(xPath.asChars()); + jsonPath = JsonPath.compile(params.getText(1)); } return DatumFactory.createText(jsonPath.read(object).toString()); } catch (Exception e) { diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsDouble.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsDouble.java index c5357219fb..114b281d1e 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsDouble.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsDouble.java @@ -51,11 +51,10 @@ public AbsDouble() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.abs(valueDatum.asFloat8())); + return DatumFactory.createFloat8(Math.abs(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsFloat.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsFloat.java index 002b4452ab..112db52a3c 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsFloat.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsFloat.java @@ -51,11 +51,10 @@ public AbsFloat() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createFloat4(Math.abs(valueDatum.asFloat4())); + return DatumFactory.createFloat4(Math.abs(params.getFloat4(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsInt.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsInt.java index 00523ec3da..b11fc8bee0 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsInt.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsInt.java @@ -51,11 +51,10 @@ public AbsInt() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createInt4(Math.abs(valueDatum.asInt4())); + return DatumFactory.createInt4(Math.abs(params.getInt4(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsLong.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsLong.java index 82a6ba80a3..a8064895e7 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsLong.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/AbsLong.java @@ -50,11 +50,10 @@ public AbsLong() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createInt8(Math.abs(valueDatum.asInt8())); + return DatumFactory.createInt8(Math.abs(params.getInt8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Acos.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Acos.java index f5e44150ef..0002acfa79 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Acos.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Acos.java @@ -51,11 +51,10 @@ public Acos() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.acos(valueDatum.asFloat8())); + return DatumFactory.createFloat8(Math.acos(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Asin.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Asin.java index 898b73c674..989c962c51 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Asin.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Asin.java @@ -50,11 +50,10 @@ public Asin() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.asin(valueDatum.asFloat8())); + return DatumFactory.createFloat8(Math.asin(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Atan.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Atan.java index 15b9fb7ddc..f082a7d6df 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Atan.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Atan.java @@ -50,11 +50,10 @@ public Atan() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.atan(valueDatum.asFloat8())); + return DatumFactory.createFloat8(Math.atan(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Atan2.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Atan2.java index e8401af0e7..13af81cfa6 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Atan2.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Atan2.java @@ -51,12 +51,10 @@ public Atan2() { @Override public Datum eval(Tuple params) { - Datum valueDatumx = params.get(0); - Datum valueDatumy = params.get(1); - if(valueDatumx instanceof NullDatum || valueDatumy instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.atan2(valueDatumx.asFloat8(), valueDatumy.asFloat8())); + return DatumFactory.createFloat8(Math.atan2(params.getFloat8(0), params.getFloat8(1))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Cbrt.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Cbrt.java index 0f83ea016e..af599dad07 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Cbrt.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Cbrt.java @@ -51,11 +51,10 @@ public Cbrt() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.cbrt(valueDatum.asFloat8())); + return DatumFactory.createFloat8(Math.cbrt(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Ceil.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Ceil.java index 4bfe501ceb..b8f5c7d896 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Ceil.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Ceil.java @@ -52,12 +52,11 @@ public Ceil() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createInt8((long)Math.ceil(valueDatum.asFloat8())); + return DatumFactory.createInt8((long)Math.ceil(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Cos.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Cos.java index 3a71ae7410..96f3e507e9 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Cos.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Cos.java @@ -50,11 +50,10 @@ public Cos() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.cos(valueDatum.asFloat8())); + return DatumFactory.createFloat8(Math.cos(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Degrees.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Degrees.java index 61d87fbd4f..036eef67c5 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Degrees.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Degrees.java @@ -51,11 +51,10 @@ public Degrees() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.toDegrees(valueDatum.asFloat8())); + return DatumFactory.createFloat8(Math.toDegrees(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Div.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Div.java index 4c82a79122..2f831d71a2 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Div.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Div.java @@ -55,18 +55,12 @@ public Div() { @Override public Datum eval(Tuple params) { - Datum value1Datum = params.get(0); - if(value1Datum instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - Datum value2Datum = params.get(1); - if(value2Datum instanceof NullDatum) { - return NullDatum.get(); - } - - long value1 = value1Datum.asInt8(); - long value2 = value2Datum.asInt8(); + long value1 = params.getInt8(0); + long value2 = params.getInt8(1); if (value2 == 0) { return NullDatum.get(); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Exp.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Exp.java index 2657d80730..c0d3d678fd 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Exp.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Exp.java @@ -51,11 +51,10 @@ public Exp() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.exp(valueDatum.asFloat8())); + return DatumFactory.createFloat8(Math.exp(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Floor.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Floor.java index aca0821c38..139ff79316 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Floor.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Floor.java @@ -51,11 +51,10 @@ public Floor() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createInt8((long)Math.floor(valueDatum.asFloat8())); + return DatumFactory.createInt8((long)Math.floor(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Mod.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Mod.java index bfb4d54c78..3b1511db47 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Mod.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Mod.java @@ -55,18 +55,12 @@ public Mod() { @Override public Datum eval(Tuple params) { - Datum value1Datum = params.get(0); - if(value1Datum instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - Datum value2Datum = params.get(1); - if(value2Datum instanceof NullDatum) { - return NullDatum.get(); - } - - long value1 = value1Datum.asInt8(); - long value2 = value2Datum.asInt8(); + long value1 = params.getInt8(0); + long value2 = params.getInt8(1); if (value2 == 0) { return NullDatum.get(); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Pow.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Pow.java index 8a28c84749..e39e4fb3ca 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Pow.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Pow.java @@ -54,12 +54,10 @@ public Pow() { @Override public Datum eval(Tuple params) { - Datum value1Datum = params.get(0); - Datum value2Datum = params.get(1); - if(value1Datum instanceof NullDatum || value2Datum instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.pow(value1Datum.asFloat8(), value2Datum.asFloat8())); + return DatumFactory.createFloat8(Math.pow(params.getFloat8(0), params.getFloat8(1))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Radians.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Radians.java index 26e767c7e1..8edb3313d3 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Radians.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Radians.java @@ -52,11 +52,10 @@ public Radians() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.toRadians(valueDatum.asFloat8())); + return DatumFactory.createFloat8(Math.toRadians(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Round.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Round.java index 2a13378550..8c8d303de2 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Round.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Round.java @@ -54,12 +54,11 @@ public Round() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - double value = valueDatum.asFloat8(); + double value = params.getFloat8(0); // Note: there are various round up/down approaches (https://en.wikipedia.org/wiki/Rounding#Tie-breaking). // Math.round uses an approach different from other programming languages, so the results of round function diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/RoundFloat8.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/RoundFloat8.java index f6a92f9d6c..765026140f 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/RoundFloat8.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/RoundFloat8.java @@ -56,15 +56,12 @@ public RoundFloat8() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - Datum roundDatum = params.get(1); - - if(valueDatum instanceof NullDatum || roundDatum instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - double value = valueDatum.asFloat8(); - int rountPoint = roundDatum.asInt4(); + double value = params.getFloat8(0); + int rountPoint = params.getInt4(1); if (Double.isNaN(value)) { throw new InvalidOperationException("value is not a number."); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Sign.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Sign.java index 71e4d01306..f5f26ac422 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Sign.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Sign.java @@ -54,11 +54,10 @@ public Sign() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.signum(valueDatum.asFloat8())); + return DatumFactory.createFloat8(Math.signum(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Sin.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Sin.java index e4f7877409..8eb22a1aaf 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Sin.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Sin.java @@ -50,11 +50,10 @@ public Sin() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.sin(valueDatum.asFloat8())); + return DatumFactory.createFloat8(Math.sin(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Sqrt.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Sqrt.java index 4e11908794..357d864911 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Sqrt.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Sqrt.java @@ -52,11 +52,10 @@ public Sqrt() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.sqrt(valueDatum.asFloat8())); + return DatumFactory.createFloat8(Math.sqrt(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Tan.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Tan.java index ff3099027d..1b90edeb26 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Tan.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/math/Tan.java @@ -50,11 +50,10 @@ public Tan() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createFloat8(Math.tan(valueDatum.asFloat8())); + return DatumFactory.createFloat8(Math.tan(params.getFloat8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Ascii.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Ascii.java index 0a43947f47..86ea283ef0 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Ascii.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Ascii.java @@ -54,10 +54,11 @@ public Ascii() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if (datum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0)) { + return NullDatum.get(); + } - byte[] bytes = datum.asByteArray(); + byte[] bytes = params.getBytes(0); if (bytes.length > 0) { return DatumFactory.createInt4(bytes[0]); } else { diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/BTrim.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/BTrim.java index 9864b0de21..99767ad474 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/BTrim.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/BTrim.java @@ -67,13 +67,15 @@ public void init(OverridableConf context, FunctionEval.ParamType[] paramTypes) { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0)) { + return NullDatum.get(); + } + String input = params.getText(0); if (!hasTrimCharacters) { - return DatumFactory.createText(StringUtils.strip(datum.asChars(), null)); + return DatumFactory.createText(StringUtils.strip(input, null)); } else { - return DatumFactory.createText(StringUtils.strip(datum.asChars(), params.get(1).asChars())); + return DatumFactory.createText(StringUtils.strip(input, params.getText(1))); } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/BitLength.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/BitLength.java index c099c77d89..08bd9072b9 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/BitLength.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/BitLength.java @@ -50,9 +50,9 @@ public BitLength() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) return NullDatum.get(); - - return DatumFactory.createInt4(datum.asByteArray().length*8); + if (params.isBlankOrNull(0)) { + return NullDatum.get(); + } + return DatumFactory.createInt4(params.getBytes(0).length * 8); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/CharLength.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/CharLength.java index b287c93bc5..e9cade30ec 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/CharLength.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/CharLength.java @@ -51,9 +51,10 @@ public CharLength() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0)) { + return NullDatum.get(); + } - return DatumFactory.createInt4(datum.asChars().length()); + return DatumFactory.createInt4(params.getText(0).length()); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Chr.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Chr.java index 4d0a4a9c74..7644eefa84 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Chr.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Chr.java @@ -52,10 +52,11 @@ public Chr() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if (datum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0)) { + return NullDatum.get(); + } - int value = datum.asInt4(); + int value = params.getInt4(0); if (value <= 0 || value > 65525) { return NullDatum.get(); } else { diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat.java index 3268817bd4..32e5c17b4f 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat.java @@ -22,7 +22,6 @@ import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.DatumFactory; -import org.apache.tajo.datum.NullDatum; import org.apache.tajo.plan.function.GeneralFunction; import org.apache.tajo.engine.function.annotation.Description; import org.apache.tajo.engine.function.annotation.ParamTypes; @@ -56,11 +55,11 @@ public Datum eval(Tuple params) { StringBuilder result = new StringBuilder(); int paramSize = params.size(); - for(int i = 0 ; i < paramSize; i++) { - Datum tmpDatum = params.get(i); - if(tmpDatum instanceof NullDatum) + for (int i = 0; i < paramSize; i++) { + if (params.isBlankOrNull(i)) { continue; - result.append(tmpDatum.asChars()); + } + result.append(params.getText(i)); } return DatumFactory.createText(result.toString()); } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java index 4a723cb04a..bbddeb16d6 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Concat_ws.java @@ -24,7 +24,6 @@ import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.DatumFactory; import org.apache.tajo.datum.NullDatum; -import org.apache.tajo.datum.TextDatum; import org.apache.tajo.plan.function.GeneralFunction; import org.apache.tajo.engine.function.annotation.Description; import org.apache.tajo.engine.function.annotation.ParamTypes; @@ -57,24 +56,23 @@ public Concat_ws() { @Override public Datum eval(Tuple params) { - Datum sepDatum = params.get(0); - - if(sepDatum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0)) { + return NullDatum.get(); + } - String seperator = ((TextDatum)sepDatum).asChars(); + String separator = params.getText(0); - String opSperator = ""; StringBuilder result = new StringBuilder(); int paramSize = params.size(); for(int i = 1; i < paramSize; i++) { - Datum datum = params.get(i); - if(datum instanceof NullDatum) { + if (params.isBlankOrNull(i)) { continue; - } else { - result.append(opSperator).append(datum.asChars()); } - opSperator = seperator; + if (result.length() > 0) { + result.append(separator); + } + result.append(params.getText(i)); } return DatumFactory.createText(result.toString()); } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Decode.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Decode.java index 72d350110b..11ec2425eb 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Decode.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Decode.java @@ -56,18 +56,17 @@ public Decode() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - Datum formatType = params.get(1); + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { + return NullDatum.get(); + } + String formatType = params.getText(1).toLowerCase(); String decodedBase64Text=""; String decodedHexString=""; - if(datum instanceof NullDatum) return NullDatum.get(); - if(formatType instanceof NullDatum) return NullDatum.get(); - - if(formatType.asChars().toLowerCase().equals("base64")) { + if (formatType.equals("base64")) { try { // Base64 - decodedBase64Text = new String(Base64.decodeBase64(datum.asChars().getBytes())); + decodedBase64Text = new String(Base64.decodeBase64(params.getTextBytes(0))); } catch (Exception e) { return NullDatum.get(); @@ -75,10 +74,10 @@ public Datum eval(Tuple params) { return DatumFactory.createText(StringEscapeUtils.escapeJava(decodedBase64Text)); } - else if(formatType.asChars().toLowerCase().equals("hex")) { + else if (formatType.equals("hex")) { try { // Hex - decodedHexString = HexStringConverter.getInstance().decodeHex(datum.asChars()); + decodedHexString = HexStringConverter.getInstance().decodeHex(params.getText(0)); } catch (Exception e) { return NullDatum.get(); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Digest.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Digest.java index 3de914a849..0d275b288b 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Digest.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Digest.java @@ -74,12 +74,12 @@ String digest(byte [] data, String type) throws NoSuchAlgorithmException{ @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - Datum typeDatum = params.get(1); - if(datum instanceof NullDatum || typeDatum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { + return NullDatum.get(); + } try { - return DatumFactory.createText(digest(datum.asByteArray(), typeDatum.asChars())); + return DatumFactory.createText(digest(params.getBytes(0), params.getText(1))); } catch (NoSuchAlgorithmException e){ return NullDatum.get(); } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Encode.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Encode.java index 4cdbc24a29..a8b6714c9e 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Encode.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Encode.java @@ -56,19 +56,19 @@ public Encode() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - Datum formatType = params.get(1); String encodedBase64Text=""; String encodedHexString=""; - if(datum instanceof NullDatum) return NullDatum.get(); - if(formatType instanceof NullDatum) return NullDatum.get(); - + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { + return NullDatum.get(); + } - if(formatType.asChars().toLowerCase().equals("base64")) { + String input = params.getText(0); + String formatType = params.getText(1).toLowerCase(); + if(formatType.equals("base64")) { try { // Base64 - encodedBase64Text = new String(Base64.encodeBase64(StringEscapeUtils.unescapeJava(datum.asChars()).getBytes())); + encodedBase64Text = new String(Base64.encodeBase64(StringEscapeUtils.unescapeJava(input).getBytes())); } catch (Exception e) { return NullDatum.get(); @@ -76,10 +76,10 @@ public Datum eval(Tuple params) { return DatumFactory.createText(encodedBase64Text); } - else if(formatType.asChars().toLowerCase().equals("hex")) { + else if(formatType.equals("hex")) { try { // Hex - encodedHexString = HexStringConverter.getInstance().encodeHex(StringEscapeUtils.unescapeJava(datum.asChars())); + encodedHexString = HexStringConverter.getInstance().encodeHex(StringEscapeUtils.unescapeJava(input)); } catch (Exception e) { return NullDatum.get(); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/FindInSet.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/FindInSet.java index ced7d4e71c..7cf20cb035 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/FindInSet.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/FindInSet.java @@ -59,32 +59,29 @@ public FindInSet() { @Override public Datum eval(Tuple params) { - Datum finding = params.get(0); - Datum textArray = params.get(1); - - if (finding instanceof NullDatum || textArray instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - byte[] searchBytes = finding.asByteArray(); + byte[] searchBytes = params.getBytes(0); // Returns 0 if the first argument has any commas. - for (int i = 0; i < finding.size(); i++) { - if (searchBytes[i] == ',') { + for (byte searchByte : searchBytes) { + if (searchByte == ',') { return DatumFactory.createInt4(0); } } - byte[] arrayData = textArray.asByteArray(); - int findingLength = finding.size(); + byte[] arrayData = params.getBytes(1); + int findingLength = searchBytes.length; int posInTextArray = 0; int curLengthOfCandidate = 0; boolean matching = true; - for (int i = 0; i < textArray.size(); i++) { + for (byte abyte : arrayData) { - if (arrayData[i] == ',') { + if (abyte == ',') { posInTextArray++; if (matching && curLengthOfCandidate == findingLength) { return DatumFactory.createInt4(posInTextArray); @@ -94,7 +91,7 @@ public Datum eval(Tuple params) { } } else { if (curLengthOfCandidate + 1 <= findingLength) { - if (!matching || searchBytes[curLengthOfCandidate] != arrayData[i]) { + if (!matching || searchBytes[curLengthOfCandidate] != abyte) { matching = false; } } else { diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/InitCap.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/InitCap.java index 35bb1640b0..5405792927 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/InitCap.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/InitCap.java @@ -52,9 +52,10 @@ public InitCap() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0)) { + return NullDatum.get(); + } - return DatumFactory.createText(WordUtils.capitalizeFully(datum.asChars())); + return DatumFactory.createText(WordUtils.capitalizeFully(params.getText(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/LTrim.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/LTrim.java index 5d95c38ec1..40477ba96a 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/LTrim.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/LTrim.java @@ -67,13 +67,15 @@ public void init(OverridableConf context, FunctionEval.ParamType[] paramTypes) { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0)) { + return NullDatum.get(); + } + String input = params.getText(0); if (!hasTrimCharacters) { - return DatumFactory.createText(StringUtils.stripStart(datum.asChars(), null)); + return DatumFactory.createText(StringUtils.stripStart(input, null)); } else { - return DatumFactory.createText(StringUtils.stripStart(datum.asChars(), params.get(1).asChars())); + return DatumFactory.createText(StringUtils.stripStart(input, params.getText(1))); } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Left.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Left.java index bf3fbfb6ee..958486e052 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Left.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Left.java @@ -64,19 +64,17 @@ public int getSize(int length, int size) { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) return NullDatum.get(); - - Datum sizeDatum = params.get(1); - if(sizeDatum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { + return NullDatum.get(); + } - String data = datum.asChars(); + String data = params.getText(0); int length = data.length(); - int size = sizeDatum.asInt4(); + int size = params.getInt4(1); size = getSize(length, size); if (size == 0) { - return TextDatum.EMPTY_TEXT; + return TextDatum.EMPTY_TEXT; } return DatumFactory.createText(data.substring(0, size)); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Length.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Length.java index 39bdd2fd8c..08dc0cdab4 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Length.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Length.java @@ -51,11 +51,10 @@ public Length() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createInt4(datum.asChars().length()); + return DatumFactory.createInt4(params.getText(0).length()); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Locate.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Locate.java index 7b703992bd..c50bdcbaa3 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Locate.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Locate.java @@ -78,18 +78,13 @@ private int locate(String str, String substr, int pos) { @Override public Datum eval(Tuple params) { - Datum strDatum = params.get(0); - if(strDatum instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - Datum substrDatum = params.get(1); - if (substrDatum instanceof NullDatum) { - return NullDatum.get(); - } - + int pos = 1; // one-based index if (params.size() > 2) { - pos = params.get(2).asInt4(); + pos = params.getInt4(2); if (pos < 0) { return DatumFactory.createInt4(0); // negative value is not acceptable. } @@ -98,8 +93,8 @@ public Datum eval(Tuple params) { } } - String str = strDatum.asChars(); - String substr = substrDatum.asChars(); + String str = params.getText(0); + String substr = params.getText(1); return DatumFactory.createInt4(locate(str, substr, pos)); } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lower.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lower.java index 7c1e33e4cb..b47690f76a 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lower.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lower.java @@ -50,9 +50,10 @@ public Lower() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0)) { + return NullDatum.get(); + } - return DatumFactory.createText(datum.asChars().toLowerCase()); + return DatumFactory.createText(params.getText(0).toLowerCase()); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lpad.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lpad.java index da11f194c0..b31ca5fdcb 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lpad.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Lpad.java @@ -67,26 +67,27 @@ public void init(OverridableConf context, FunctionEval.ParamType[] paramTypes) { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - Datum lengthDatum = params.get(1); - if (datum instanceof NullDatum) return NullDatum.get(); - if (lengthDatum instanceof NullDatum) return NullDatum.get(); - - Datum fillText = NullDatum.get(); + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { + return NullDatum.get(); + } + String fillText; if (hasFillCharacters) { - fillText = params.get(2); + fillText = params.getText(2); } else { - fillText = DatumFactory.createText(" "); + fillText = " "; } - int templen = lengthDatum.asInt4() - datum.asChars().length(); + String input = params.getText(0); + int expected = params.getInt4(1); + + int templen = expected - params.size(0); if (templen <= 0) { - return DatumFactory.createText(datum.asChars().substring(0,lengthDatum.asInt4())); + return DatumFactory.createText(input.substring(0, expected)); } else { - return DatumFactory.createText(StringUtils.leftPad(datum.asChars(), lengthDatum.asInt4(), fillText.asChars())); + return DatumFactory.createText(StringUtils.leftPad(input, expected, fillText)); } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Md5.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Md5.java index f4cb7cb230..209b3ccfba 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Md5.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Md5.java @@ -52,14 +52,15 @@ public Md5() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0)) { + return NullDatum.get(); + } try { - MessageDigest md = MessageDigest.getInstance("MD5"); - return DatumFactory.createText(new String(Hex.encodeHex(md.digest(datum.asByteArray())))); + MessageDigest md = MessageDigest.getInstance("MD5"); + return DatumFactory.createText(new String(Hex.encodeHex(md.digest(params.getBytes(0))))); } catch (NoSuchAlgorithmException e){ - return NullDatum.get(); + return NullDatum.get(); } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/OctetLength.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/OctetLength.java index cb5af15e13..6d8bffb213 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/OctetLength.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/OctetLength.java @@ -51,11 +51,10 @@ public OctetLength() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createInt4(datum.asByteArray().length); + return DatumFactory.createInt4(params.getBytes(0).length); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/QuoteIdent.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/QuoteIdent.java index aaef10d802..c7bd7b8811 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/QuoteIdent.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/QuoteIdent.java @@ -56,12 +56,10 @@ public QuoteIdent() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - - if(datum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createText("\"" + datum.asChars() + "\""); + return DatumFactory.createText("\"" + params.getText(0) + "\""); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RTrim.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RTrim.java index 03b9c25893..ff4e4ba619 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RTrim.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RTrim.java @@ -66,13 +66,15 @@ public void init(OverridableConf context, FunctionEval.ParamType[] paramTypes) { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0)) { + return NullDatum.get(); + } + String value = params.getText(0); if (!hasTrimCharacters) { - return DatumFactory.createText(StringUtils.stripEnd(datum.asChars(), null)); + return DatumFactory.createText(StringUtils.stripEnd(value, null)); } else { - return DatumFactory.createText(StringUtils.stripEnd(datum.asChars(), params.get(1).asChars())); + return DatumFactory.createText(StringUtils.stripEnd(value, params.getText(1))); } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RegexpReplace.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RegexpReplace.java index e3abeb5d14..6257c422e6 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RegexpReplace.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/RegexpReplace.java @@ -22,7 +22,6 @@ import org.apache.tajo.OverridableConf; import org.apache.tajo.catalog.Column; import org.apache.tajo.common.TajoDataTypes; -import org.apache.tajo.datum.BooleanDatum; import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.DatumFactory; import org.apache.tajo.datum.NullDatum; @@ -80,39 +79,33 @@ public void init(OverridableConf context, ParamType[] paramTypes) { @Override public Datum eval(Tuple params) { - Datum thisValue = params.get(0); - Datum thisPattern = params.get(1); - Datum thisReplacement = params.get(2); - boolean nullResult = isAlwaysNull - || thisValue instanceof NullDatum - || thisReplacement instanceof NullDatum - || thisPattern instanceof NullDatum; + if (isAlwaysNull || params.isBlankOrNull(0) || params.isBlankOrNull(1) || params.isBlankOrNull(2)) { + return NullDatum.get(); + } - Pattern thisCompiled; - if (!nullResult) { - if (compiled != null) { - thisCompiled = compiled; - } else { - thisCompiled = Pattern.compile(thisPattern.asChars()); + String value = params.getText(0); + String replacement = params.getText(2); - // if a regular expression pattern is a constant, - // it will be reused in every call - if (isPatternConstant) { - compiled = thisCompiled; - } - } + Pattern thisCompiled; + if (compiled != null) { + thisCompiled = compiled; + } else { + thisCompiled = Pattern.compile(params.getText(1)); - Matcher matcher = thisCompiled.matcher(thisValue.asChars()); - String replacement = thisReplacement.asChars(); - StringBuffer sb = new StringBuffer(); - while (matcher.find()) { - matcher.appendReplacement(sb, replacement); + // if a regular expression pattern is a constant, + // it will be reused in every call + if (isPatternConstant) { + compiled = thisCompiled; } - matcher.appendTail(sb); + } - return DatumFactory.createText(sb.toString()); - } else { - return NullDatum.get(); + Matcher matcher = thisCompiled.matcher(value); + StringBuffer sb = new StringBuffer(); + while (matcher.find()) { + matcher.appendReplacement(sb, replacement); } + matcher.appendTail(sb); + + return DatumFactory.createText(sb.toString()); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Repeat.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Repeat.java index c02ef661d9..339c4eab50 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Repeat.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Repeat.java @@ -61,12 +61,10 @@ private String repeat(String word, int count) { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { + return NullDatum.get(); + } - Datum countDatum = params.get(1); - if(countDatum instanceof NullDatum) return NullDatum.get(); - - return DatumFactory.createText(repeat(datum.asChars(), countDatum.asInt4())); + return DatumFactory.createText(repeat(params.getText(0), params.getInt4(1))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Reverse.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Reverse.java index bf672940f1..44d2c49eeb 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Reverse.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Reverse.java @@ -50,9 +50,10 @@ public Reverse() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0)) { + return NullDatum.get(); + } - return DatumFactory.createText(new StringBuffer(datum.asChars()).reverse().toString()); + return DatumFactory.createText(new StringBuffer(params.getText(0)).reverse().toString()); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Right.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Right.java index 68af4236bb..0d0138ad66 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Right.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Right.java @@ -64,15 +64,13 @@ public int getSize(int length, int size) { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) return NullDatum.get(); - - Datum sizeDatum = params.get(1); - if(sizeDatum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { + return NullDatum.get(); + } - String data = datum.asChars(); + String data = params.getText(0); int length = data.length(); - int size = sizeDatum.asInt4(); + int size = params.getInt4(1); size = getSize(length, size); if (size == 0) { diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Rpad.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Rpad.java index 15091182e6..e50575d0f2 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Rpad.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Rpad.java @@ -68,25 +68,26 @@ public void init(OverridableConf context, FunctionEval.ParamType[] paramTypes) { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - Datum lengthDatum = params.get(1); - - if(datum instanceof NullDatum) return NullDatum.get(); - if(lengthDatum instanceof NullDatum) return NullDatum.get(); - - Datum fillText=NullDatum.get(); - if(hasFillCharacters) { - fillText=params.get(2); + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { + return NullDatum.get(); } - else { - fillText=DatumFactory.createText(" "); + + String fillText; + if (hasFillCharacters) { + fillText = params.getText(2); + } else { + fillText = " "; } - int templen = lengthDatum.asInt4() - datum.asChars().length(); + String input = params.getText(0); + int expected = params.getInt4(1); - if(templen<=0) - return DatumFactory.createText(datum.asChars().substring(0,lengthDatum.asInt4())); + int templen = expected - params.size(0); + + if (templen <= 0) { + return DatumFactory.createText(input.substring(0, expected)); + } - return DatumFactory.createText(StringUtils.rightPad(datum.asChars(), lengthDatum.asInt4(), fillText.asChars())); + return DatumFactory.createText(StringUtils.rightPad(input, expected, fillText)); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/SplitPart.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/SplitPart.java index 1c3be00299..9604d18257 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/SplitPart.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/SplitPart.java @@ -54,15 +54,12 @@ public SplitPart() { @Override public Datum eval(Tuple params) { - Datum text = params.get(0); - Datum part = params.get(2); - - if (text.isNull() || part.isNull()) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(2)) { return NullDatum.get(); } - String [] split = StringUtils.splitByWholeSeparatorPreserveAllTokens(text.asChars(), params.get(1).asChars(), -1); - int idx = params.get(2).asInt4() - 1; + String [] split = StringUtils.splitByWholeSeparatorPreserveAllTokens(params.getText(0), params.getText(1), -1); + int idx = params.getInt4(2) - 1; if (split.length > idx) { return DatumFactory.createText(split[idx]); } else { diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPos.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPos.java index 9c3e4f1e4c..3ff1a3bab2 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPos.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPos.java @@ -52,19 +52,12 @@ public StrPos() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - - Datum substringDatum = params.get(1); - if(substringDatum instanceof NullDatum) { - return NullDatum.get(); - } - - String value = valueDatum.asChars(); - String substring = substringDatum.asChars(); - if(substring.length() == 0) { + String value = params.getText(0); + String substring = params.getText(1); + if (substring.length() == 0) { return DatumFactory.createInt4(1); } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPosb.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPosb.java index c33200693c..5bfcc50b53 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPosb.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/StrPosb.java @@ -54,19 +54,13 @@ public StrPosb() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - if(valueDatum instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - Datum substringDatum = params.get(1); - if(substringDatum instanceof NullDatum) { - return NullDatum.get(); - } - - String value = valueDatum.asChars(); - String substring = substringDatum.asChars(); - if(substring.length() == 0) { + String value = params.getText(0); + String substring = params.getText(1); + if (substring.length() == 0) { return DatumFactory.createInt4(1); } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Substr.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Substr.java index 7e4ddd6d9e..43198536c1 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Substr.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Substr.java @@ -56,39 +56,28 @@ public Substr() { @Override public Datum eval(Tuple params) { - Datum valueDatum = params.get(0); - Datum fromDatum = params.get(1); - Datum countDatum = params.size() > 2 ? params.get(2) : null; - - if(valueDatum instanceof NullDatum || fromDatum instanceof NullDatum || countDatum instanceof NullDatum) { + if (params.isBlankOrNull(0) || params.isBlankOrNull(1)) { return NullDatum.get(); } - - String value = valueDatum.asChars(); - int from = fromDatum.asInt4(); - int strLength = value.length(); - int count; - - if (countDatum == null) { - count = strLength; - } else { - count = (countDatum.asInt4() + from) - 1; + if (params.size() > 2 && params.isBlankOrNull(2)) { + return NullDatum.get(); } - if (count > strLength) { - count = strLength; - } + String value = params.getText(0); + int start = params.getInt4(1) - 1; + + int from = Math.max(0, start); + int length = params.size() > 2 ? params.getInt4(2) : -1; - if (from < 1) { - from = 0; - } else { - from --; + int to = value.length(); + if (length >= 0) { + to = Math.min(start + length, to); } - if (from >= count) { + if (from >= to) { return DatumFactory.createText(""); } - return DatumFactory.createText(value.substring(from, count)); + return DatumFactory.createText(value.substring(from, to)); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToBin.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToBin.java index a9f85f37fa..a768e7f96f 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToBin.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToBin.java @@ -54,12 +54,11 @@ public ToBin() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - return DatumFactory.createText(Long.toBinaryString(datum.asInt8())); + return DatumFactory.createText(Long.toBinaryString(params.getInt8(0))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToCharLong.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToCharLong.java index 5fed940c47..71048354a4 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToCharLong.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToCharLong.java @@ -48,8 +48,8 @@ public ToCharLong() { @Override public Datum eval(Tuple params) { if (df == null) { - df = new DecimalFormat(params.get(1).asChars()); + df = new DecimalFormat(params.getText(1)); } - return new TextDatum(df.format(params.get(0).asInt8())); + return new TextDatum(df.format(params.getInt8(0))); } } \ No newline at end of file diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToHex.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToHex.java index 2e20008237..d410b9b2bc 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToHex.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/ToHex.java @@ -65,12 +65,11 @@ public String trimZero(String hexString) { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) { + if (params.isBlankOrNull(0)) { return NullDatum.get(); } - String ret = new String(Hex.encodeHex(datum.asByteArray())); + String ret = new String(Hex.encodeHex(params.getBytes(0))); return DatumFactory.createText(trimZero(ret)); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Upper.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Upper.java index fc6ff3a483..7525d95e8e 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Upper.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/string/Upper.java @@ -50,9 +50,10 @@ public Upper() { @Override public Datum eval(Tuple params) { - Datum datum = params.get(0); - if(datum instanceof NullDatum) return NullDatum.get(); + if (params.isBlankOrNull(0)) { + return NullDatum.get(); + } - return DatumFactory.createText(datum.asChars().toUpperCase()); + return DatumFactory.createText(params.getText(0).toUpperCase()); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/window/FirstValue.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/window/FirstValue.java index ba3b3b6f96..6a667ecec1 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/window/FirstValue.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/window/FirstValue.java @@ -38,10 +38,10 @@ public FunctionContext newContext() { @Override public void eval(FunctionContext ctx, Tuple params) { FirstValueContext firstValueCtx = (FirstValueContext)ctx; - if(firstValueCtx.isSet == false) { + if(!firstValueCtx.isSet) { firstValueCtx.isSet = true; - if (params.get(0).isNotNull()) { - firstValueCtx.first = params.get(0); + if (!params.isBlankOrNull(0)) { + firstValueCtx.first = params.asDatum(0); } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/window/Lag.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/window/Lag.java index 510729796d..eb7e8b703c 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/window/Lag.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/window/Lag.java @@ -45,20 +45,20 @@ public void eval(FunctionContext ctx, Tuple params) { if (params.size() == 1) { lagNum = 1; } else { - lagNum = params.get(1).asInt4(); + lagNum = params.getInt4(1); } lagCtx.lagBuffer = new CircularFifoBuffer(lagNum+1); } - if (params.get(0).isNotNull()) { - lagCtx.lagBuffer.add(params.get(0)); + if (!params.isBlankOrNull(0)) { + lagCtx.lagBuffer.add(params.asDatum(0)); } else { lagCtx.lagBuffer.add(NullDatum.get()); } if (lagCtx.defaultDatum == null) { if (params.size() == 3) { - lagCtx.defaultDatum = params.get(2); + lagCtx.defaultDatum = params.asDatum(2); } else { lagCtx.defaultDatum = NullDatum.get(); } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/window/Rank.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/window/Rank.java index e469c837c1..9cb95f7cad 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/function/window/Rank.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/window/Rank.java @@ -48,7 +48,7 @@ public Rank() { public static boolean checkIfDistinctValue(RankContext context, Tuple params) { for (int i = 0; i < context.latest.length; i++) { - if (!context.latest[i].equalsTo(params.get(i)).isTrue()) { + if (!context.latest[i].equalsTo(params.asDatum(i)).isTrue()) { return true; } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/RangePartitionAlgorithm.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/RangePartitionAlgorithm.java index 38aa9281bf..c505b77d92 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/RangePartitionAlgorithm.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/RangePartitionAlgorithm.java @@ -57,81 +57,83 @@ public RangePartitionAlgorithm(SortSpec [] sortSpecs, TupleRange totalRange, boo * It computes the value cardinality of a tuple range. * * @param dataType - * @param start - * @param end + * @param range + * @param i * @return */ - public static BigInteger computeCardinality(DataType dataType, Datum start, Datum end, + public static BigInteger computeCardinality(DataType dataType, TupleRange range, int i, boolean inclusive, boolean isAscending) { BigInteger columnCard; + Tuple start = range.getStart(); + Tuple end = range.getEnd(); switch (dataType.getType()) { case BOOLEAN: columnCard = BigInteger.valueOf(2); break; case CHAR: if (isAscending) { - columnCard = BigInteger.valueOf((int)end.asChar() - (int)start.asChar()); + columnCard = BigInteger.valueOf((int)end.getChar(i) - (int)start.getChar(i)); } else { - columnCard = BigInteger.valueOf(start.asChar() - end.asChar()); + columnCard = BigInteger.valueOf(start.getChar(i) - end.getChar(i)); } break; case BIT: if (isAscending) { - columnCard = BigInteger.valueOf(end.asByte() - start.asByte()); + columnCard = BigInteger.valueOf(end.getByte(i) - start.getByte(i)); } else { - columnCard = BigInteger.valueOf(start.asByte() - end.asByte()); + columnCard = BigInteger.valueOf(start.getByte(i) - end.getByte(i)); } break; case INT2: if (isAscending) { - columnCard = BigInteger.valueOf(end.asInt2() - start.asInt2()); + columnCard = BigInteger.valueOf(end.getInt2(i) - start.getInt2(i)); } else { - columnCard = BigInteger.valueOf(start.asInt2() - end.asInt2()); + columnCard = BigInteger.valueOf(start.getInt2(i) - end.getInt2(i)); } break; case INT4: if (isAscending) { - columnCard = BigInteger.valueOf(end.asInt4() - start.asInt4()); + columnCard = BigInteger.valueOf(end.getInt4(i) - start.getInt4(i)); } else { - columnCard = BigInteger.valueOf(start.asInt4() - end.asInt4()); + columnCard = BigInteger.valueOf(start.getInt4(i) - end.getInt4(i)); } break; case INT8: case TIME: case TIMESTAMP: if (isAscending) { - columnCard = BigInteger.valueOf(end.asInt8() - start.asInt8()); + columnCard = BigInteger.valueOf(end.getInt8(i) - start.getInt8(i)); } else { - columnCard = BigInteger.valueOf(start.asInt8() - end.asInt8()); + columnCard = BigInteger.valueOf(start.getInt8(i) - end.getInt8(i)); } break; case FLOAT4: if (isAscending) { - columnCard = BigInteger.valueOf(end.asInt4() - start.asInt4()); + columnCard = BigInteger.valueOf(end.getInt4(i) - start.getInt4(i)); } else { - columnCard = BigInteger.valueOf(start.asInt4() - end.asInt4()); + columnCard = BigInteger.valueOf(start.getInt4(i) - end.getInt4(i)); } break; case FLOAT8: if (isAscending) { - columnCard = BigInteger.valueOf(end.asInt8() - start.asInt8()); + columnCard = BigInteger.valueOf(end.getInt8(i) - start.getInt8(i)); } else { - columnCard = BigInteger.valueOf(start.asInt8() - end.asInt8()); + columnCard = BigInteger.valueOf(start.getInt8(i) - end.getInt8(i)); } break; case TEXT: { - boolean isPureAscii = StringUtils.isPureAscii(start.asChars()) && StringUtils.isPureAscii(end.asChars()); + boolean isPureAscii = StringUtils.isPureAscii(start.getText(i)) && StringUtils.isPureAscii(end.getText(i)); if (isPureAscii) { byte[] a; byte[] b; if (isAscending) { - a = start.asByteArray(); - b = end.asByteArray(); + a = start.getBytes(i); + b = end.getBytes(i); } else { - b = start.asByteArray(); - a = end.asByteArray(); + b = start.getBytes(i); + a = end.getBytes(i); } byte [][] padded = BytesUtils.padBytes(a, b); @@ -148,11 +150,11 @@ public static BigInteger computeCardinality(DataType dataType, Datum start, Datu char [] b; if (isAscending) { - a = start.asUnicodeChars(); - b = end.asUnicodeChars(); + a = start.getUnicodeChars(i); + b = end.getUnicodeChars(i); } else { - b = start.asUnicodeChars(); - a = end.asUnicodeChars(); + b = start.getUnicodeChars(i); + a = end.getUnicodeChars(i); } BigInteger startBI = UniformRangePartition.charsToBigInteger(a); @@ -165,16 +167,16 @@ public static BigInteger computeCardinality(DataType dataType, Datum start, Datu } case DATE: if (isAscending) { - columnCard = BigInteger.valueOf(end.asInt4() - start.asInt4()); + columnCard = BigInteger.valueOf(end.getInt4(i) - start.getInt4(i)); } else { - columnCard = BigInteger.valueOf(start.asInt4() - end.asInt4()); + columnCard = BigInteger.valueOf(start.getInt4(i) - end.getInt4(i)); } break; case INET4: if (isAscending) { - columnCard = BigInteger.valueOf(end.asInt4() - start.asInt4()); + columnCard = BigInteger.valueOf(end.getInt4(i) - start.getInt4(i)); } else { - columnCard = BigInteger.valueOf(start.asInt4() - end.asInt4()); + columnCard = BigInteger.valueOf(start.getInt4(i) - end.getInt4(i)); } break; default: @@ -189,13 +191,11 @@ public static BigInteger computeCardinality(DataType dataType, Datum start, Datu * @return */ public static BigInteger computeCardinalityForAllColumns(SortSpec[] sortSpecs, TupleRange range, boolean inclusive) { - Tuple start = range.getStart(); - Tuple end = range.getEnd(); BigInteger cardinality = BigInteger.ONE; BigInteger columnCard; for (int i = 0; i < sortSpecs.length; i++) { - columnCard = computeCardinality(sortSpecs[i].getSortKey().getDataType(), start.get(i), end.get(i), inclusive, + columnCard = computeCardinality(sortSpecs[i].getSortKey().getDataType(), range, i, inclusive, sortSpecs[i].isAscending()); if (BigInteger.ZERO.compareTo(columnCard) < 0) { diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/UniformRangePartition.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/UniformRangePartition.java index 551a9d025c..61a9e4895a 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/UniformRangePartition.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/UniformRangePartition.java @@ -24,7 +24,6 @@ import org.apache.tajo.catalog.Column; import org.apache.tajo.catalog.SortSpec; import org.apache.tajo.common.TajoDataTypes; -import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.DatumFactory; import org.apache.tajo.datum.NullDatum; import org.apache.tajo.datum.TextDatum; @@ -70,21 +69,18 @@ public UniformRangePartition(final TupleRange entireRange, final SortSpec[] sort // filling pure ascii flags isPureAscii = new boolean[sortSpecs.length]; for (int i = 0; i < sortSpecs.length; i++) { - Datum startValue = entireRange.getStart().get(i); - Datum endValue = entireRange.getEnd().get(i); - isPureAscii[i] = StringUtils.isPureAscii(startValue.asChars()) && StringUtils.isPureAscii(endValue.asChars()); - beginNulls[i] = startValue.isNull(); - endNulls[i] = endValue.isNull(); + String startValue = entireRange.getStart().getText(i); + String endValue = entireRange.getEnd().getText(i); + isPureAscii[i] = StringUtils.isPureAscii(startValue) && StringUtils.isPureAscii(endValue); + beginNulls[i] = entireRange.getStart().isBlankOrNull(i); + endNulls[i] = entireRange.getEnd().isBlankOrNull(i); } colCards = new BigInteger[sortSpecs.length]; normalize(sortSpecs, this.mergedRange); for (int i = 0; i < sortSpecs.length; i++) { - Datum startValue = entireRange.getStart().get(i); - Datum endValue = entireRange.getEnd().get(i); - - colCards[i] = computeCardinality(sortSpecs[i].getSortKey().getDataType(), startValue, endValue, + colCards[i] = computeCardinality(sortSpecs[i].getSortKey().getDataType(), entireRange, i, inclusive, sortSpecs[i].isAscending()); } @@ -132,14 +128,14 @@ public TupleRange[] partition(int partNum) { BigInteger term = x.divide(BigDecimal.valueOf(partNum), RoundingMode.CEILING).toBigInteger(); BigInteger reminder = reverseCardsForDigit[0]; - Tuple last = mergedRange.getStart(); + VTuple last = mergedRange.getStart(); TupleRange tupleRange; while(reminder.compareTo(BigInteger.ZERO) > 0) { if (reminder.compareTo(term) <= 0) { // final one is inclusive tupleRange = new TupleRange(sortSpecs, last, mergedRange.getEnd()); } else { - Tuple next = increment(last, term, variableId); + VTuple next = increment(last, term, variableId); tupleRange = new TupleRange(sortSpecs, last, next); } @@ -177,13 +173,13 @@ public void normalize(final SortSpec [] sortSpecs, TupleRange range) { if (isPureAscii[i]) { byte[] startBytes; byte[] endBytes; - if (range.getStart().isNull(i)) { + if (range.getStart().isBlankOrNull(i)) { startBytes = BigInteger.ZERO.toByteArray(); } else { startBytes = range.getStart().getBytes(i); } - if (range.getEnd().isNull(i)) { + if (range.getEnd().isBlankOrNull(i)) { endBytes = BigInteger.ZERO.toByteArray(); } else { endBytes = range.getEnd().getBytes(i); @@ -196,13 +192,13 @@ public void normalize(final SortSpec [] sortSpecs, TupleRange range) { } else { char[] startChars; char[] endChars; - if (range.getStart().isNull(i)) { + if (range.getStart().isBlankOrNull(i)) { startChars = new char[] {0}; } else { startChars = range.getStart().getUnicodeChars(i); } - if (range.getEnd().isNull(i)) { + if (range.getEnd().isBlankOrNull(i)) { endChars = new char[] {0}; } else { endChars = range.getEnd().getUnicodeChars(i); @@ -220,12 +216,12 @@ public void normalize(final SortSpec [] sortSpecs, TupleRange range) { * Check whether an overflow occurs or not. * * @param colId The column id to be checked - * @param last + * @param tuple * @param inc * @param sortSpecs * @return */ - public boolean isOverflow(int colId, Datum last, BigInteger inc, SortSpec [] sortSpecs) { + public boolean isOverflow(int colId, Tuple tuple, int i, BigInteger inc, SortSpec [] sortSpecs) { Column column = sortSpecs[colId].getSortKey(); BigDecimal incDecimal = new BigDecimal(inc); BigDecimal candidate; @@ -234,74 +230,74 @@ public boolean isOverflow(int colId, Datum last, BigInteger inc, SortSpec [] sor switch (column.getDataType().getType()) { case BIT: { if (sortSpecs[colId].isAscending()) { - candidate = incDecimal.add(new BigDecimal(last.asByte())); - return new BigDecimal(mergedRange.getEnd().get(colId).asByte()).compareTo(candidate) < 0; + candidate = incDecimal.add(new BigDecimal(tuple.getByte(i))); + return new BigDecimal(mergedRange.getEnd().getByte(colId)).compareTo(candidate) < 0; } else { - candidate = new BigDecimal(last.asByte()).subtract(incDecimal); - return candidate.compareTo(new BigDecimal(mergedRange.getEnd().get(colId).asByte())) < 0; + candidate = new BigDecimal(tuple.getByte(i)).subtract(incDecimal); + return candidate.compareTo(new BigDecimal(mergedRange.getEnd().getByte(colId))) < 0; } } case CHAR: { if (sortSpecs[colId].isAscending()) { - candidate = incDecimal.add(new BigDecimal((int)last.asChar())); - return new BigDecimal((int) mergedRange.getEnd().get(colId).asChar()).compareTo(candidate) < 0; + candidate = incDecimal.add(new BigDecimal((int)tuple.getChar(i))); + return new BigDecimal((int) mergedRange.getEnd().getChar(colId)).compareTo(candidate) < 0; } else { - candidate = new BigDecimal((int)last.asChar()).subtract(incDecimal); - return candidate.compareTo(new BigDecimal((int) mergedRange.getEnd().get(colId).asChar())) < 0; + candidate = new BigDecimal((int)tuple.getChar(i)).subtract(incDecimal); + return candidate.compareTo(new BigDecimal((int) mergedRange.getEnd().getChar(colId))) < 0; } } case INT2: { if (sortSpecs[colId].isAscending()) { - candidate = incDecimal.add(new BigDecimal(last.asInt2())); - return new BigDecimal(mergedRange.getEnd().get(colId).asInt2()).compareTo(candidate) < 0; + candidate = incDecimal.add(new BigDecimal(tuple.getInt2(i))); + return new BigDecimal(mergedRange.getEnd().getInt2(colId)).compareTo(candidate) < 0; } else { - candidate = new BigDecimal(last.asInt2()).subtract(incDecimal); - return candidate.compareTo(new BigDecimal(mergedRange.getEnd().get(colId).asInt2())) < 0; + candidate = new BigDecimal(tuple.getInt2(i)).subtract(incDecimal); + return candidate.compareTo(new BigDecimal(mergedRange.getEnd().getInt2(colId))) < 0; } } case DATE: case INT4: { if (sortSpecs[colId].isAscending()) { - candidate = incDecimal.add(new BigDecimal(last.asInt4())); - return new BigDecimal(mergedRange.getEnd().get(colId).asInt4()).compareTo(candidate) < 0; + candidate = incDecimal.add(new BigDecimal(tuple.getInt4(i))); + return new BigDecimal(mergedRange.getEnd().getInt4(colId)).compareTo(candidate) < 0; } else { - candidate = new BigDecimal(last.asInt4()).subtract(incDecimal); - return candidate.compareTo(new BigDecimal(mergedRange.getEnd().get(colId).asInt4())) < 0; + candidate = new BigDecimal(tuple.getInt4(i)).subtract(incDecimal); + return candidate.compareTo(new BigDecimal(mergedRange.getEnd().getInt4(colId))) < 0; } } case TIME: case TIMESTAMP: case INT8: { if (sortSpecs[colId].isAscending()) { - candidate = incDecimal.add(new BigDecimal(last.asInt8())); - return new BigDecimal(mergedRange.getEnd().get(colId).asInt8()).compareTo(candidate) < 0; + candidate = incDecimal.add(new BigDecimal(tuple.getInt8(i))); + return new BigDecimal(mergedRange.getEnd().getInt8(colId)).compareTo(candidate) < 0; } else { - candidate = new BigDecimal(last.asInt8()).subtract(incDecimal); - return candidate.compareTo(new BigDecimal(mergedRange.getEnd().get(colId).asInt8())) < 0; + candidate = new BigDecimal(tuple.getInt8(i)).subtract(incDecimal); + return candidate.compareTo(new BigDecimal(mergedRange.getEnd().getInt8(colId))) < 0; } } case FLOAT4: { if (sortSpecs[colId].isAscending()) { - candidate = incDecimal.add(new BigDecimal(last.asFloat4())); - return new BigDecimal(mergedRange.getEnd().get(colId).asFloat4()).compareTo(candidate) < 0; + candidate = incDecimal.add(new BigDecimal(tuple.getFloat4(i))); + return new BigDecimal(mergedRange.getEnd().getFloat4(colId)).compareTo(candidate) < 0; } else { - candidate = new BigDecimal(last.asFloat4()).subtract(incDecimal); - return candidate.compareTo(new BigDecimal(mergedRange.getEnd().get(colId).asFloat4())) < 0; + candidate = new BigDecimal(tuple.getFloat4(i)).subtract(incDecimal); + return candidate.compareTo(new BigDecimal(mergedRange.getEnd().getFloat4(colId))) < 0; } } case FLOAT8: { if (sortSpecs[colId].isAscending()) { - candidate = incDecimal.add(new BigDecimal(last.asFloat8())); - return new BigDecimal(mergedRange.getEnd().get(colId).asFloat8()).compareTo(candidate) < 0; + candidate = incDecimal.add(new BigDecimal(tuple.getFloat8(i))); + return new BigDecimal(mergedRange.getEnd().getFloat8(colId)).compareTo(candidate) < 0; } else { - candidate = new BigDecimal(last.asFloat8()).subtract(incDecimal); - return candidate.compareTo(new BigDecimal(mergedRange.getEnd().get(colId).asFloat8())) < 0; + candidate = new BigDecimal(tuple.getFloat8(i)).subtract(incDecimal); + return candidate.compareTo(new BigDecimal(mergedRange.getEnd().getFloat8(colId))) < 0; } } case TEXT: { if (isPureAscii[colId]) { - byte[] lastBytes = last.asByteArray(); + byte[] lastBytes = tuple.getBytes(i); byte[] endBytes = mergedRange.getEnd().getBytes(colId); Preconditions.checkState(lastBytes.length == endBytes.length); @@ -314,7 +310,7 @@ public boolean isOverflow(int colId, Datum last, BigInteger inc, SortSpec [] sor return candidate.compareTo(new BigDecimal(new BigInteger(endBytes))) < 0; } } else { - char[] lastChars = last.asUnicodeChars(); + char[] lastChars = tuple.getUnicodeChars(i); char[] endChars = mergedRange.getEnd().getUnicodeChars(colId); Preconditions.checkState(lastChars.length == endChars.length); @@ -335,45 +331,45 @@ public boolean isOverflow(int colId, Datum last, BigInteger inc, SortSpec [] sor int candidateIntVal; byte[] candidateBytesVal = new byte[4]; if (sortSpecs[colId].isAscending()) { - candidateIntVal = incDecimal.intValue() + last.asInt4(); - if (candidateIntVal - incDecimal.intValue() != last.asInt4()) { + candidateIntVal = incDecimal.intValue() + tuple.getInt4(i); + if (candidateIntVal - incDecimal.intValue() != tuple.getInt4(i)) { return true; } Bytes.putInt(candidateBytesVal, 0, candidateIntVal); - return Bytes.compareTo(mergedRange.getEnd().get(colId).asByteArray(), candidateBytesVal) < 0; + return Bytes.compareTo(mergedRange.getEnd().getBytes(colId), candidateBytesVal) < 0; } else { - candidateIntVal = last.asInt4() - incDecimal.intValue(); - if (candidateIntVal + incDecimal.intValue() != last.asInt4()) { + candidateIntVal = tuple.getInt4(i) - incDecimal.intValue(); + if (candidateIntVal + incDecimal.intValue() != tuple.getInt4(i)) { return true; } Bytes.putInt(candidateBytesVal, 0, candidateIntVal); - return Bytes.compareTo(candidateBytesVal, mergedRange.getEnd().get(colId).asByteArray()) < 0; + return Bytes.compareTo(candidateBytesVal, mergedRange.getEnd().getBytes(colId)) < 0; } } } return overflow; } - public long incrementAndGetReminder(int colId, Datum last, long inc) { + private long incrementAndGetReminder(int colId, Tuple last, long inc) { Column column = sortSpecs[colId].getSortKey(); long reminder = 0; switch (column.getDataType().getType()) { case BIT: { - long candidate = last.asByte() + inc; - byte end = mergedRange.getEnd().get(colId).asByte(); + long candidate = last.getByte(colId) + inc; + byte end = mergedRange.getEnd().getByte(colId); reminder = candidate - end; break; } case CHAR: { - long candidate = last.asChar() + inc; - char end = mergedRange.getEnd().get(colId).asChar(); + long candidate = last.getChar(colId) + inc; + char end = mergedRange.getEnd().getChar(colId); reminder = candidate - end; break; } case DATE: case INT4: { - int candidate = (int) (last.asInt4() + inc); - int end = mergedRange.getEnd().get(colId).asInt4(); + int candidate = (int) (last.getInt4(colId) + inc); + int end = mergedRange.getEnd().getInt4(colId); reminder = candidate - end; break; } @@ -381,26 +377,26 @@ public long incrementAndGetReminder(int colId, Datum last, long inc) { case TIMESTAMP: case INT8: case INET4: { - long candidate = last.asInt8() + inc; - long end = mergedRange.getEnd().get(colId).asInt8(); + long candidate = last.getInt8(colId) + inc; + long end = mergedRange.getEnd().getInt8(colId); reminder = candidate - end; break; } case FLOAT4: { - float candidate = last.asFloat4() + inc; - float end = mergedRange.getEnd().get(colId).asFloat4(); + float candidate = last.getFloat4(colId) + inc; + float end = mergedRange.getEnd().getFloat4(colId); reminder = (long) (candidate - end); break; } case FLOAT8: { - double candidate = last.asFloat8() + inc; - double end = mergedRange.getEnd().get(colId).asFloat8(); + double candidate = last.getFloat8(colId) + inc; + double end = mergedRange.getEnd().getFloat8(colId); reminder = (long) Math.ceil(candidate - end); break; } case TEXT: { - byte [] lastBytes = last.asByteArray(); - byte [] endBytes = mergedRange.getEnd().get(colId).asByteArray(); + byte [] lastBytes = last.getBytes(colId); + byte [] endBytes = mergedRange.getEnd().getBytes(colId); Preconditions.checkState(lastBytes.length == endBytes.length); @@ -424,7 +420,7 @@ public long incrementAndGetReminder(int colId, Datum last, long inc) { * @param interval * @return */ - public Tuple increment(final Tuple last, BigInteger interval, final int baseDigit) { + public VTuple increment(final Tuple last, BigInteger interval, final int baseDigit) { BigInteger [] incs = new BigInteger[last.size()]; boolean [] overflowFlag = new boolean[last.size()]; BigInteger [] result; @@ -447,12 +443,12 @@ public Tuple increment(final Tuple last, BigInteger interval, final int baseDigi int finalId = baseDigit; incs[finalId] = value; for (int i = finalId; i >= 0; i--) { - if (isOverflow(i, last.get(i), incs[i], sortSpecs)) { + if (isOverflow(i, last, i, incs[i], sortSpecs)) { if (i == 0) { throw new RangeOverflowException(mergedRange, last, incs[i].longValue(), sortSpecs[i].isAscending()); } // increment some volume of the serialized one-dimension key space - long rem = incrementAndGetReminder(i, last.get(i), value.longValue()); + long rem = incrementAndGetReminder(i, last, value.longValue()); incs[i] = BigInteger.valueOf(rem); incs[i - 1] = incs[i-1].add(BigInteger.ONE); overflowFlag[i] = true; @@ -470,107 +466,107 @@ public Tuple increment(final Tuple last, BigInteger interval, final int baseDigi } } - Tuple end = new VTuple(sortSpecs.length); + VTuple end = new VTuple(sortSpecs.length); Column column; for (int i = 0; i < last.size(); i++) { column = sortSpecs[i].getSortKey(); switch (column.getDataType().getType()) { case CHAR: if (overflowFlag[i]) { - end.put(i, DatumFactory.createChar((char) (mergedRange.getStart().get(i).asChar() + incs[i].longValue()))); + end.put(i, DatumFactory.createChar((char) (mergedRange.getStart().getChar(i) + incs[i].longValue()))); } else { if (sortSpecs[i].isAscending()) { - end.put(i, DatumFactory.createChar((char) (last.get(i).asChar() + incs[i].longValue()))); + end.put(i, DatumFactory.createChar((char) (last.getChar(i) + incs[i].longValue()))); } else { - end.put(i, DatumFactory.createChar((char) (last.get(i).asChar() - incs[i].longValue()))); + end.put(i, DatumFactory.createChar((char) (last.getChar(i) - incs[i].longValue()))); } } break; case BIT: if (overflowFlag[i]) { end.put(i, DatumFactory.createBit( - (byte) (mergedRange.getStart().get(i).asByte() + incs[i].longValue()))); + (byte) (mergedRange.getStart().getByte(i) + incs[i].longValue()))); } else { if (sortSpecs[i].isAscending()) { - end.put(i, DatumFactory.createBit((byte) (last.get(i).asByte() + incs[i].longValue()))); + end.put(i, DatumFactory.createBit((byte) (last.getByte(i) + incs[i].longValue()))); } else { - end.put(i, DatumFactory.createBit((byte) (last.get(i).asByte() - incs[i].longValue()))); + end.put(i, DatumFactory.createBit((byte) (last.getByte(i) - incs[i].longValue()))); } } break; case INT2: if (overflowFlag[i]) { end.put(i, DatumFactory.createInt2( - (short) (mergedRange.getStart().get(i).asInt2() + incs[i].longValue()))); + (short) (mergedRange.getStart().getInt2(i) + incs[i].longValue()))); } else { if (sortSpecs[i].isAscending()) { - end.put(i, DatumFactory.createInt2((short) (last.get(i).asInt2() + incs[i].longValue()))); + end.put(i, DatumFactory.createInt2((short) (last.getInt2(i) + incs[i].longValue()))); } else { - end.put(i, DatumFactory.createInt2((short) (last.get(i).asInt2() - incs[i].longValue()))); + end.put(i, DatumFactory.createInt2((short) (last.getInt2(i) - incs[i].longValue()))); } } break; case INT4: if (overflowFlag[i]) { end.put(i, DatumFactory.createInt4( - (int) (mergedRange.getStart().get(i).asInt4() + incs[i].longValue()))); + (int) (mergedRange.getStart().getInt4(i) + incs[i].longValue()))); } else { if (sortSpecs[i].isAscending()) { - end.put(i, DatumFactory.createInt4((int) (last.get(i).asInt4() + incs[i].longValue()))); + end.put(i, DatumFactory.createInt4((int) (last.getInt4(i) + incs[i].longValue()))); } else { - end.put(i, DatumFactory.createInt4((int) (last.get(i).asInt4() - incs[i].longValue()))); + end.put(i, DatumFactory.createInt4((int) (last.getInt4(i) - incs[i].longValue()))); } } break; case INT8: if (overflowFlag[i]) { end.put(i, DatumFactory.createInt8( - mergedRange.getStart().get(i).asInt8() + incs[i].longValue())); + mergedRange.getStart().getInt8(i) + incs[i].longValue())); } else { if (sortSpecs[i].isAscending()) { - end.put(i, DatumFactory.createInt8(last.get(i).asInt8() + incs[i].longValue())); + end.put(i, DatumFactory.createInt8(last.getInt8(i) + incs[i].longValue())); } else { - end.put(i, DatumFactory.createInt8(last.get(i).asInt8() - incs[i].longValue())); + end.put(i, DatumFactory.createInt8(last.getInt8(i) - incs[i].longValue())); } } break; case FLOAT4: if (overflowFlag[i]) { end.put(i, DatumFactory.createFloat4( - mergedRange.getStart().get(i).asFloat4() + incs[i].longValue())); + mergedRange.getStart().getFloat4(i) + incs[i].longValue())); } else { if (sortSpecs[i].isAscending()) { - end.put(i, DatumFactory.createFloat4(last.get(i).asFloat4() + incs[i].longValue())); + end.put(i, DatumFactory.createFloat4(last.getFloat4(i) + incs[i].longValue())); } else { - end.put(i, DatumFactory.createFloat4(last.get(i).asFloat4() - incs[i].longValue())); + end.put(i, DatumFactory.createFloat4(last.getFloat4(i) - incs[i].longValue())); } } break; case FLOAT8: if (overflowFlag[i]) { end.put(i, DatumFactory.createFloat8( - mergedRange.getStart().get(i).asFloat8() + incs[i].longValue())); + mergedRange.getStart().getFloat8(i) + incs[i].longValue())); } else { if (sortSpecs[i].isAscending()) { - end.put(i, DatumFactory.createFloat8(last.get(i).asFloat8() + incs[i].longValue())); + end.put(i, DatumFactory.createFloat8(last.getFloat8(i) + incs[i].longValue())); } else { - end.put(i, DatumFactory.createFloat8(last.get(i).asFloat8() - incs[i].longValue())); + end.put(i, DatumFactory.createFloat8(last.getFloat8(i) - incs[i].longValue())); } } break; case TEXT: if (overflowFlag[i]) { - end.put(i, DatumFactory.createText(((char) (mergedRange.getStart().get(i).asChars().charAt(0) + end.put(i, DatumFactory.createText(((char) (mergedRange.getStart().getText(i).charAt(0) + incs[i].longValue())) + "")); } else { BigInteger lastBigInt; - if (last.isNull(i)) { + if (last.isBlankOrNull(i)) { lastBigInt = BigInteger.valueOf(0); end.put(i, DatumFactory.createText(lastBigInt.add(incs[i]).toByteArray())); } else { if (isPureAscii[i]) { - lastBigInt = new BigInteger(last.get(i).asByteArray()); + lastBigInt = new BigInteger(last.getBytes(i)); if (sortSpecs[i].isAscending()) { end.put(i, DatumFactory.createText(lastBigInt.add(incs[i]).toByteArray())); } else { @@ -633,52 +629,52 @@ public Tuple increment(final Tuple last, BigInteger interval, final int baseDigi break; case DATE: if (overflowFlag[i]) { - end.put(i, DatumFactory.createDate((int) (mergedRange.getStart().get(i).asInt4() + incs[i].longValue()))); + end.put(i, DatumFactory.createDate((int) (mergedRange.getStart().getInt4(i) + incs[i].longValue()))); } else { if (sortSpecs[i].isAscending()) { - end.put(i, DatumFactory.createDate((int) (last.get(i).asInt4() + incs[i].longValue()))); + end.put(i, DatumFactory.createDate((int) (last.getInt4(i) + incs[i].longValue()))); } else { - end.put(i, DatumFactory.createDate((int) (last.get(i).asInt4() - incs[i].longValue()))); + end.put(i, DatumFactory.createDate((int) (last.getInt4(i) - incs[i].longValue()))); } } break; case TIME: if (overflowFlag[i]) { - end.put(i, DatumFactory.createTime(mergedRange.getStart().get(i).asInt8() + incs[i].longValue())); + end.put(i, DatumFactory.createTime(mergedRange.getStart().getInt8(i) + incs[i].longValue())); } else { if (sortSpecs[i].isAscending()) { - end.put(i, DatumFactory.createTime(last.get(i).asInt8() + incs[i].longValue())); + end.put(i, DatumFactory.createTime(last.getInt8(i) + incs[i].longValue())); } else { - end.put(i, DatumFactory.createTime(last.get(i).asInt8() - incs[i].longValue())); + end.put(i, DatumFactory.createTime(last.getInt8(i) - incs[i].longValue())); } } break; case TIMESTAMP: if (overflowFlag[i]) { end.put(i, DatumFactory.createTimestmpDatumWithJavaMillis( - mergedRange.getStart().get(i).asInt8() + incs[i].longValue())); + mergedRange.getStart().getInt8(i) + incs[i].longValue())); } else { if (sortSpecs[i].isAscending()) { - end.put(i, DatumFactory.createTimestmpDatumWithJavaMillis(last.get(i).asInt8() + incs[i].longValue())); + end.put(i, DatumFactory.createTimestmpDatumWithJavaMillis(last.getInt8(i) + incs[i].longValue())); } else { - end.put(i, DatumFactory.createTimestmpDatumWithJavaMillis(last.get(i).asInt8() - incs[i].longValue())); + end.put(i, DatumFactory.createTimestmpDatumWithJavaMillis(last.getInt8(i) - incs[i].longValue())); } } break; case INET4: byte[] ipBytes; if (overflowFlag[i]) { - ipBytes = mergedRange.getStart().get(i).asByteArray(); + ipBytes = mergedRange.getStart().getBytes(i); assert ipBytes.length == 4; end.put(i, DatumFactory.createInet4(ipBytes)); } else { if (sortSpecs[i].isAscending()) { - int lastVal = last.get(i).asInt4() + incs[i].intValue(); + int lastVal = last.getInt4(i) + incs[i].intValue(); ipBytes = new byte[4]; Bytes.putInt(ipBytes, 0, lastVal); end.put(i, DatumFactory.createInet4(ipBytes)); } else { - int lastVal = last.get(i).asInt4() - incs[i].intValue(); + int lastVal = last.getInt4(i) - incs[i].intValue(); ipBytes = new byte[4]; Bytes.putInt(ipBytes, 0, lastVal); end.put(i, DatumFactory.createInet4(ipBytes)); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java index 806d34c0f1..fe1057b5e1 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java @@ -80,8 +80,7 @@ public void init() throws IOException { public Tuple next() throws IOException { if(initialize) { //TODO : more complicated condition - Tuple key = new VTuple(datum.length); - key.put(datum); + Tuple key = new VTuple(datum); long offset = reader.find(key); if (offset == -1) { reader.close(); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ComparableVector.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ComparableVector.java index 9940608a2a..2d836f4685 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ComparableVector.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ComparableVector.java @@ -121,7 +121,7 @@ protected final void append(Tuple tuple, int field) { } protected final void set(int index, Tuple tuple, int field) { - if (tuple.isNull(field)) { + if (tuple.isBlankOrNull(field)) { nulls.set(index); return; } @@ -196,7 +196,7 @@ public int size() { public void set(Tuple tuple) { for (int i = 0; i < keyTypes.length; i++) { final int field = keyIndex[i]; - if (tuple.isNull(field)) { + if (tuple.isBlankOrNull(field)) { keys[i] = null; continue; } @@ -216,7 +216,7 @@ public void set(Tuple tuple) { case TEXT: case CHAR: case BLOB: keys[i] = tuple.getBytes(field); break; - case DATUM: keys[i] = tuple.get(field); break; + case DATUM: keys[i] = tuple.asDatum(field); break; default: throw new IllegalArgumentException(); } @@ -252,7 +252,7 @@ public boolean equals(Tuple tuple) { for (int i = 0; i < keys.length; i++) { final int field = keyIndex[i]; final boolean n1 = keys[i] == null; - final boolean n2 = tuple.isNull(field); + final boolean n2 = tuple.isBlankOrNull(field); if (n1 && n2) { continue; } @@ -275,7 +275,7 @@ public boolean equals(Tuple tuple) { case TEXT: case CHAR: case BLOB: if (!Arrays.equals((byte[])keys[i], tuple.getBytes(field))) return false; continue; - case DATUM: if (!keys[i].equals(tuple.get(field))) return false; continue; + case DATUM: if (!keys[i].equals(tuple.asDatum(field))) return false; continue; } } return true; diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyFirstAggregationExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyFirstAggregationExec.java index 94429a0d22..77848178fb 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyFirstAggregationExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyFirstAggregationExec.java @@ -175,7 +175,7 @@ private void prepareInputData() throws IOException { while(!context.isStopped() && (tuple = child.next()) != null) { Tuple groupingKey = new VTuple(groupingKeyIndexes.length); for (int i = 0; i < groupingKeyIndexes.length; i++) { - groupingKey.put(i, tuple.get(groupingKeyIndexes[i])); + groupingKey.put(i, tuple.asDatum(groupingKeyIndexes[i])); } for (int i = 0; i < distinctAggregators.length; i++) { distinctAggregators[i].compute(groupingKey, tuple); @@ -360,7 +360,7 @@ public int getTupleLength() { public void compute(Tuple groupingKey, Tuple tuple) throws IOException { Tuple distinctKeyTuple = new VTuple(distinctKeyIndexes.length); for (int i = 0; i < distinctKeyIndexes.length; i++) { - distinctKeyTuple.put(i, tuple.get(distinctKeyIndexes[i])); + distinctKeyTuple.put(i, tuple.asDatum(distinctKeyIndexes[i])); } Set distinctEntry = distinctAggrDatas.get(groupingKey); @@ -415,7 +415,7 @@ public Tuple next() { } // node sequence, groupingKeys, 1'st distinctKeys, 2'st distinctKeys, ... // If n'st == this.nodeSequence set with real data, otherwise set with NullDatum - Tuple tuple = new VTuple(resultTupleLength); + VTuple tuple = new VTuple(resultTupleLength); int tupleIndex = 0; tuple.put(tupleIndex++, nodeSequenceDatum); @@ -423,7 +423,7 @@ public Tuple next() { Tuple groupingKeyTuple = currentGroupingTuples.getKey(); int groupingKeyLength = groupingKeyTuple.size(); for (int i = 0; i < groupingKeyLength; i++, tupleIndex++) { - tuple.put(tupleIndex, groupingKeyTuple.get(i)); + tuple.put(tupleIndex, groupingKeyTuple.asDatum(i)); } // merge distinctKey @@ -432,13 +432,13 @@ public Tuple next() { Tuple distinctKeyTuple = distinctKeyIterator.next(); int distinctKeyLength = distinctKeyTuple.size(); for (int j = 0; j < distinctKeyLength; j++, tupleIndex++) { - tuple.put(tupleIndex, distinctKeyTuple.get(j)); + tuple.put(tupleIndex, distinctKeyTuple.asDatum(j)); } } else { Tuple dummyTuple = distinctAggregators[i].getDummyTuple(); int dummyTupleSize = dummyTuple.size(); for (int j = 0; j < dummyTupleSize; j++, tupleIndex++) { - tuple.put(tupleIndex, dummyTuple.get(j)); + tuple.put(tupleIndex, dummyTuple.asDatum(j)); } } } @@ -457,7 +457,7 @@ public Tuple next() { } int tupleSize = nonDistinctTuple.size(); for (int j = 0; j < tupleSize; j++, tupleIndex++) { - tuple.put(tupleIndex, nonDistinctTuple.get(j)); + tuple.put(tupleIndex, nonDistinctTuple.asDatum(j)); } } return tuple; diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyHashAggregationExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyHashAggregationExec.java index 0f25d6cbb9..c8a65885bb 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyHashAggregationExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyHashAggregationExec.java @@ -236,10 +236,10 @@ public Tuple next() throws IOException { // set group key tuple // Because each hashAggregator has different number of tuples, // sometimes getting group key from each hashAggregator will be null value. - mergedTuple.put(mergeTupleIndex, distinctGroupingKey.get(mergeTupleIndex)); + mergedTuple.put(mergeTupleIndex, distinctGroupingKey.asDatum(mergeTupleIndex)); } else { if (tuples[i] != null) { - mergedTuple.put(mergeTupleIndex, tuples[i].get(j)); + mergedTuple.put(mergeTupleIndex, tuples[i].asDatum(j)); } else { mergedTuple.put(mergeTupleIndex, NullDatum.get()); } @@ -388,12 +388,12 @@ public int getTupleSize() { public void compute(Tuple tuple) throws IOException { Tuple outerKeyTuple = new VTuple(distinctGroupingKeyIds.length); for (int i = 0; i < distinctGroupingKeyIds.length; i++) { - outerKeyTuple.put(i, tuple.get(distinctGroupingKeyIds[i])); + outerKeyTuple.put(i, tuple.asDatum(distinctGroupingKeyIds[i])); } Tuple keyTuple = new VTuple(groupingKeyIds.length); for (int i = 0; i < groupingKeyIds.length; i++) { - keyTuple.put(i, tuple.get(groupingKeyIds[i])); + keyTuple.put(i, tuple.asDatum(groupingKeyIds[i])); } Map distinctEntry = hashTable.get(outerKeyTuple); @@ -428,7 +428,7 @@ public List aggregate(Map groupTuples) { Tuple groupbyKey = entry.getKey(); int index = 0; for (; index < groupbyKey.size(); index++) { - tuple.put(index, groupbyKey.get(index)); + tuple.put(index, groupbyKey.asDatum(index)); } FunctionContext[] contexts = entry.getValue(); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbySecondAggregationExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbySecondAggregationExec.java index b39439038f..5a262a69aa 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbySecondAggregationExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbySecondAggregationExec.java @@ -192,7 +192,7 @@ public Tuple next() throws IOException { throw new IOException(e.getMessage(), e); } - int distinctSeq = tuple.get(0).asInt2(); + int distinctSeq = tuple.getInt2(0); Tuple keyTuple = getKeyTuple(distinctSeq, tuple); if (prevKeyTuple == null) { @@ -267,12 +267,12 @@ private Tuple getKeyTuple(int distinctSeq, Tuple tuple) { int[] columnIndexes = distinctKeyIndexes[distinctSeq]; Tuple keyTuple = new VTuple(numGroupingColumns + columnIndexes.length + 1); - keyTuple.put(0, tuple.get(0)); + keyTuple.put(0, tuple.asDatum(0)); for (int i = 0; i < numGroupingColumns; i++) { - keyTuple.put(i + 1, tuple.get(i + 1)); + keyTuple.put(i + 1, tuple.asDatum(i + 1)); } for (int i = 0; i < columnIndexes.length; i++) { - keyTuple.put(i + 1 + numGroupingColumns, tuple.get(columnIndexes[i])); + keyTuple.put(i + 1 + numGroupingColumns, tuple.asDatum(columnIndexes[i])); } return keyTuple; diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbySortAggregationExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbySortAggregationExec.java index 9ff479b5da..c91dcca137 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbySortAggregationExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbySortAggregationExec.java @@ -117,7 +117,7 @@ public Tuple next() throws IOException { int tupleSize = currentTuples[i].size(); for (int j = 0; j < tupleSize; j++) { if (resultColumnIdIndexes[mergeTupleIndex] >= 0) { - mergedTuple.put(resultColumnIdIndexes[mergeTupleIndex], currentTuples[i].get(j)); + mergedTuple.put(resultColumnIdIndexes[mergeTupleIndex], currentTuples[i].asDatum(j)); } mergeTupleIndex++; } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyThirdAggregationExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyThirdAggregationExec.java index e71976c9ee..571595d9df 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyThirdAggregationExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/DistinctGroupbyThirdAggregationExec.java @@ -156,7 +156,7 @@ public Tuple next() throws IOException { } for (int i = 0; i < numGroupingColumns; i++) { - resultTuple.put(resultTupleIndexes[i], prevTuple.get(i + 1)); + resultTuple.put(resultTupleIndexes[i], prevTuple.asDatum(i + 1)); } for (DistinctFinalAggregator eachAggr: aggregators) { eachAggr.terminate(resultTuple); @@ -171,7 +171,7 @@ public Tuple next() throws IOException { throw new IOException(e.getMessage(), e); } - int distinctSeq = tuple.get(0).asInt2(); + int distinctSeq = tuple.getInt2(0); Tuple keyTuple = getGroupingKeyTuple(tuple); // First tuple @@ -186,7 +186,7 @@ public Tuple next() throws IOException { if (!prevKeyTuple.equals(keyTuple)) { // new grouping key for (int i = 0; i < numGroupingColumns; i++) { - resultTuple.put(resultTupleIndexes[i], prevTuple.get(i + 1)); + resultTuple.put(resultTupleIndexes[i], prevTuple.asDatum(i + 1)); } for (DistinctFinalAggregator eachAggr: aggregators) { eachAggr.terminate(resultTuple); @@ -219,7 +219,7 @@ private Tuple makeEmptyTuple() { private Tuple getGroupingKeyTuple(Tuple tuple) { Tuple keyTuple = new VTuple(numGroupingColumns); for (int i = 0; i < numGroupingColumns; i++) { - keyTuple.put(i, tuple.get(i + 1)); + keyTuple.put(i, tuple.asDatum(i + 1)); } return keyTuple; @@ -272,7 +272,7 @@ public void merge(Tuple tuple) { } if (seq == 0 && nonDistinctAggr != null) { - if (!tuple.get(nonDistinctAggr.inTupleIndex).isNull()) { + if (!tuple.isBlankOrNull(nonDistinctAggr.inTupleIndex)) { nonDistinctAggr.merge(tuple); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashAggregateExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashAggregateExec.java index 8ffd5039aa..e6d1a96d1b 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashAggregateExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashAggregateExec.java @@ -52,7 +52,7 @@ private void compute() throws IOException { keyTuple = new VTuple(groupingKeyIds.length); // build one key tuple for(int i = 0; i < groupingKeyIds.length; i++) { - keyTuple.put(i, tuple.get(groupingKeyIds[i])); + keyTuple.put(i, tuple.asDatum(groupingKeyIds[i])); } FunctionContext [] contexts = hashTable.get(keyTuple); @@ -98,7 +98,7 @@ public Tuple next() throws IOException { int tupleIdx = 0; for (; tupleIdx < groupingKeyNum; tupleIdx++) { - tuple.put(tupleIdx, keyTuple.get(tupleIdx)); + tuple.put(tupleIdx, keyTuple.asDatum(tupleIdx)); } for (int funcIdx = 0; funcIdx < aggFunctionsNum; funcIdx++, tupleIdx++) { tuple.put(tupleIdx, aggFunctions[funcIdx].terminate(contexts[funcIdx])); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashBasedColPartitionStoreExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashBasedColPartitionStoreExec.java index e94bc262f5..0a812ee694 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashBasedColPartitionStoreExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashBasedColPartitionStoreExec.java @@ -20,7 +20,6 @@ import org.apache.tajo.catalog.statistics.StatisticsUtil; import org.apache.tajo.catalog.statistics.TableStats; -import org.apache.tajo.datum.Datum; import org.apache.tajo.plan.logical.StoreTableNode; import org.apache.tajo.storage.Appender; import org.apache.tajo.storage.Tuple; @@ -72,11 +71,10 @@ public Tuple next() throws IOException { sb.delete(0, sb.length()); if (keyIds != null) { for(int i = 0; i < keyIds.length; i++) { - Datum datum = tuple.get(keyIds[i]); if(i > 0) sb.append("/"); sb.append(keyNames[i]).append("="); - sb.append(StringUtils.escapePathName(datum.asChars())); + sb.append(StringUtils.escapePathName(tuple.getText(keyIds[i]))); } } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashFullOuterJoinExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashFullOuterJoinExec.java index 6e28ae0f55..f5b04fad72 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashFullOuterJoinExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashFullOuterJoinExec.java @@ -89,7 +89,7 @@ public HashFullOuterJoinExec(TaskAttemptContext context, JoinNode plan, Physical protected void getKeyLeftTuple(final Tuple outerTuple, Tuple keyTuple) { for (int i = 0; i < leftKeyList.length; i++) { - keyTuple.put(i, outerTuple.get(leftKeyList[i])); + keyTuple.put(i, outerTuple.asDatum(leftKeyList[i])); } } @@ -190,7 +190,7 @@ protected void loadRightToHashTable() throws IOException { while (!context.isStopped() && (tuple = rightChild.next()) != null) { keyTuple = new VTuple(joinKeyPairs.size()); for (int i = 0; i < rightKeyList.length; i++) { - keyTuple.put(i, tuple.get(rightKeyList[i])); + keyTuple.put(i, tuple.asDatum(rightKeyList[i])); } List newValue = tupleSlots.get(keyTuple); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java index 48f3682610..8484c8aa96 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashJoinExec.java @@ -81,7 +81,7 @@ public HashJoinExec(TaskAttemptContext context, JoinNode plan, PhysicalExec left protected void getKeyLeftTuple(final Tuple outerTuple, Tuple keyTuple) { for (int i = 0; i < leftKeyList.length; i++) { - keyTuple.put(i, outerTuple.get(leftKeyList[i])); + keyTuple.put(i, outerTuple.asDatum(leftKeyList[i])); } } @@ -174,7 +174,7 @@ private Map> buildRightToHashTable() throws IOException { while (!context.isStopped() && (tuple = rightChild.next()) != null) { keyTuple = new VTuple(joinKeyPairs.size()); for (int i = 0; i < rightKeyList.length; i++) { - keyTuple.put(i, tuple.get(rightKeyList[i])); + keyTuple.put(i, tuple.asDatum(rightKeyList[i])); } List newValue = map.get(keyTuple); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashLeftOuterJoinExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashLeftOuterJoinExec.java index 6f573d0e06..5e909f0960 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashLeftOuterJoinExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashLeftOuterJoinExec.java @@ -134,7 +134,7 @@ protected void compile() { protected void getKeyLeftTuple(final Tuple outerTuple, Tuple keyTuple) { for (int i = 0; i < leftKeyList.length; i++) { - keyTuple.put(i, outerTuple.get(leftKeyList[i])); + keyTuple.put(i, outerTuple.asDatum(leftKeyList[i])); } } @@ -249,7 +249,7 @@ private Map> buildRightToHashTable() throws IOException { while (!context.isStopped() && (tuple = rightChild.next()) != null) { keyTuple = new VTuple(joinKeyPairs.size()); for (int i = 0; i < rightKeyList.length; i++) { - keyTuple.put(i, tuple.get(rightKeyList[i])); + keyTuple.put(i, tuple.asDatum(rightKeyList[i])); } List newValue = map.get(keyTuple); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashPartitioner.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashPartitioner.java index 233d6ece7f..20a91284ec 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashPartitioner.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashPartitioner.java @@ -41,7 +41,7 @@ public int getPartition(Tuple tuple) { // build one key tuple for (int i = 0; i < partitionKeyIds.length; i++) { - keyTuple.put(i, tuple.get(partitionKeyIds[i])); + keyTuple.put(i, tuple.asDatum(partitionKeyIds[i])); } return (keyTuple.hashCode() & Integer.MAX_VALUE) % numPartitions; } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/JoinTupleComparator.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/JoinTupleComparator.java index a59f8d9853..515a2bd895 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/JoinTupleComparator.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/JoinTupleComparator.java @@ -64,13 +64,13 @@ public int compare(Tuple outerTuple, Tuple innerTuple) { if (outerTuple == null) { outer = NullDatum.get(); } else { - outer = outerTuple.get(outerSortKeyIds[i]); + outer = outerTuple.asDatum(outerSortKeyIds[i]); } if (innerTuple == null) { inner = NullDatum.get(); } else { - inner = innerTuple.get(innerSortKeyIds[i]); + inner = innerTuple.asDatum(innerSortKeyIds[i]); } if (outer instanceof NullDatum || inner instanceof NullDatum) { diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/RangeShuffleFileWriteExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/RangeShuffleFileWriteExec.java index 8da1a03638..e37dccf3da 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/RangeShuffleFileWriteExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/RangeShuffleFileWriteExec.java @@ -91,20 +91,25 @@ public void init() throws IOException { @Override public Tuple next() throws IOException { Tuple tuple; - Tuple keyTuple; + VTuple keyTuple; Tuple prevKeyTuple = null; long offset; - while(!context.isStopped() && (tuple = child.next()) != null) { - offset = appender.getOffset(); - appender.addTuple(tuple); - keyTuple = new VTuple(keySchema.size()); - RowStoreUtil.project(tuple, keyTuple, indexKeys); - if (prevKeyTuple == null || !prevKeyTuple.equals(keyTuple)) { - indexWriter.write(keyTuple, offset); - prevKeyTuple = keyTuple; + try { + while(!context.isStopped() && (tuple = child.next()) != null) { + offset = appender.getOffset(); + appender.addTuple(tuple); + keyTuple = new VTuple(keySchema.size()); + RowStoreUtil.project(tuple, keyTuple, indexKeys); + if (prevKeyTuple == null || !prevKeyTuple.equals(keyTuple)) { + indexWriter.write(keyTuple, offset); + prevKeyTuple = keyTuple; + } } + } catch (RuntimeException e) { + e.printStackTrace(); + throw e; } return null; diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SortAggregateExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SortAggregateExec.java index 9831d83ed3..2feecd1579 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SortAggregateExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SortAggregateExec.java @@ -18,7 +18,6 @@ package org.apache.tajo.engine.planner.physical; -import org.apache.tajo.datum.NullDatum; import org.apache.tajo.plan.function.FunctionContext; import org.apache.tajo.plan.logical.GroupbyNode; import org.apache.tajo.storage.Tuple; @@ -61,7 +60,7 @@ public Tuple next() throws IOException { // get a key tuple currentKey = new VTuple(groupingKeyIds.length); for(int i = 0; i < groupingKeyIds.length; i++) { - currentKey.put(i, tuple.get(groupingKeyIds[i])); + currentKey.put(i, tuple.asDatum(groupingKeyIds[i])); } /** Aggregation State */ @@ -72,7 +71,7 @@ public Tuple next() throws IOException { // Merge when aggregator doesn't receive NullDatum if (!(groupingKeyNum == 0 && aggFunctionsNum == tuple.size() - && tuple.get(i) == NullDatum.get())) { + && tuple.isBlankOrNull(i))) { aggFunctions[i].merge(contexts[i], tuple); } } @@ -90,7 +89,7 @@ public Tuple next() throws IOException { int tupleIdx = 0; for(; tupleIdx < groupingKeyNum; tupleIdx++) { - outputTuple.put(tupleIdx, lastKey.get(tupleIdx)); + outputTuple.put(tupleIdx, lastKey.asDatum(tupleIdx)); } for(int aggFuncIdx = 0; aggFuncIdx < aggFunctionsNum; tupleIdx++, aggFuncIdx++) { outputTuple.put(tupleIdx, aggFunctions[aggFuncIdx].terminate(contexts[aggFuncIdx])); @@ -114,7 +113,7 @@ public Tuple next() throws IOException { outputTuple = new VTuple(outSchema.size()); int tupleIdx = 0; for(; tupleIdx < groupingKeyNum; tupleIdx++) { - outputTuple.put(tupleIdx, lastKey.get(tupleIdx)); + outputTuple.put(tupleIdx, lastKey.asDatum(tupleIdx)); } for(int aggFuncIdx = 0; aggFuncIdx < aggFunctionsNum; tupleIdx++, aggFuncIdx++) { outputTuple.put(tupleIdx, aggFunctions[aggFuncIdx].terminate(contexts[aggFuncIdx])); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SortBasedColPartitionStoreExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SortBasedColPartitionStoreExec.java index ca90b0e78e..a40fc1d1f8 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SortBasedColPartitionStoreExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SortBasedColPartitionStoreExec.java @@ -52,7 +52,7 @@ public void init() throws IOException { private void fillKeyTuple(Tuple inTuple, Tuple keyTuple) { for (int i = 0; i < keyIds.length; i++) { - keyTuple.put(i, inTuple.get(keyIds[i])); + keyTuple.put(i, inTuple.asDatum(keyIds[i])); } } @@ -60,12 +60,11 @@ private String getSubdirectory(Tuple keyTuple) { StringBuilder sb = new StringBuilder(); for(int i = 0; i < keyIds.length; i++) { - Datum datum = keyTuple.get(i); if(i > 0) { sb.append("/"); } sb.append(keyNames[i]).append("="); - sb.append(StringUtils.escapePathName(datum.asChars())); + sb.append(StringUtils.escapePathName(keyTuple.getText(i))); } return sb.toString(); } diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/WindowAggExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/WindowAggExec.java index 05b0418113..d177c48333 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/WindowAggExec.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/WindowAggExec.java @@ -214,7 +214,7 @@ public Tuple next() throws IOException { if (readTuple != null && hasPartitionKeys) { // get a key tuple currentKey = new VTuple(partitionKeyIds.length); for (int i = 0; i < partitionKeyIds.length; i++) { - currentKey.put(i, readTuple.get(partitionKeyIds[i])); + currentKey.put(i, readTuple.asDatum(partitionKeyIds[i])); } } } @@ -273,7 +273,7 @@ private void accumulatingWindow(Tuple currentKey, Tuple inTuple) { private void preAccumulatingNextWindow(Tuple inTuple) { Tuple projectedTuple = new VTuple(outSchema.size()); for(int idx = 0; idx < nonFunctionColumnNum; idx++) { - projectedTuple.put(idx, inTuple.get(nonFunctionColumns[idx])); + projectedTuple.put(idx, inTuple.asDatum(nonFunctionColumns[idx])); } nextAccumulatedProjected = Lists.newArrayList(); nextAccumulatedProjected.add(projectedTuple); @@ -291,10 +291,10 @@ private void evaluationWindowFrame() { Tuple projectedTuple = new VTuple(schemaForOrderBy.size()); for (int c = 0; c < nonFunctionColumnNum; c++) { - projectedTuple.put(c, inTuple.get(nonFunctionColumns[c])); + projectedTuple.put(c, inTuple.asDatum(nonFunctionColumns[c])); } for (int c = 0; c < sortKeyColumns.length; c++) { - projectedTuple.put(outputColumnNum + c, inTuple.get(sortKeyColumns[c])); + projectedTuple.put(outputColumnNum + c, inTuple.asDatum(sortKeyColumns[c])); } evaluatedTuples.add(projectedTuple); diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/utils/TupleUtil.java b/tajo-core/src/main/java/org/apache/tajo/engine/utils/TupleUtil.java index 3a0a1c7566..de30c8bcdd 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/utils/TupleUtil.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/utils/TupleUtil.java @@ -126,8 +126,8 @@ public static TupleRange columnStatToRange(SortSpec [] sortSpecs, Schema target, "ERROR: Invalid Column Stats (column stats: " + colStats + ", there exists not target " + col); } - Tuple startTuple = new VTuple(target.size()); - Tuple endTuple = new VTuple(target.size()); + VTuple startTuple = new VTuple(target.size()); + VTuple endTuple = new VTuple(target.size()); int i = 0; int sortSpecIndex = 0; diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java index 958c252304..7cc6a18868 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java @@ -145,7 +145,7 @@ private List getTablespaces(Schema outSchema) { List tablespaces = masterContext.getCatalog().getAllTablespaces(); List tuples = new ArrayList(tablespaces.size()); List columns = outSchema.getColumns(); - Tuple aTuple; + VTuple aTuple; for (TablespaceProto tablespace: tablespaces) { aTuple = new VTuple(outSchema.size()); @@ -180,7 +180,7 @@ private List getDatabases(Schema outSchema) { List databases = masterContext.getCatalog().getAllDatabases(); List tuples = new ArrayList(databases.size()); List columns = outSchema.getColumns(); - Tuple aTuple; + VTuple aTuple; for (DatabaseProto database: databases) { aTuple = new VTuple(outSchema.size()); @@ -210,7 +210,7 @@ private List getTables(Schema outSchema) { List tables = masterContext.getCatalog().getAllTables(); List tuples = new ArrayList(tables.size()); List columns = outSchema.getColumns(); - Tuple aTuple; + VTuple aTuple; for (TableDescriptorProto table: tables) { aTuple = new VTuple(outSchema.size()); @@ -246,7 +246,7 @@ private List getColumns(Schema outSchema) { List columnsList = masterContext.getCatalog().getAllColumns(); List tuples = new ArrayList(columnsList.size()); List columns = outSchema.getColumns(); - Tuple aTuple; + VTuple aTuple; int columnId = 1, prevtid = -1, tid = 0; for (ColumnProto column: columnsList) { @@ -294,7 +294,7 @@ private List getIndexes(Schema outSchema) { List indexList = masterContext.getCatalog().getAllIndexes(); List tuples = new ArrayList(indexList.size()); List columns = outSchema.getColumns(); - Tuple aTuple; + VTuple aTuple; for (IndexProto index: indexList) { aTuple = new VTuple(outSchema.size()); @@ -333,7 +333,7 @@ private List getAllTableOptions(Schema outSchema) { List optionList = masterContext.getCatalog().getAllTableOptions(); List tuples = new ArrayList(optionList.size()); List columns = outSchema.getColumns(); - Tuple aTuple; + VTuple aTuple; for (TableOptionProto option: optionList) { aTuple = new VTuple(outSchema.size()); @@ -360,7 +360,7 @@ private List getAllTableStats(Schema outSchema) { List statList = masterContext.getCatalog().getAllTableStats(); List tuples = new ArrayList(statList.size()); List columns = outSchema.getColumns(); - Tuple aTuple; + VTuple aTuple; for (TableStatsProto stat: statList) { aTuple = new VTuple(outSchema.size()); @@ -387,7 +387,7 @@ private List getAllPartitions(Schema outSchema) { List partitionList = masterContext.getCatalog().getAllPartitions(); List tuples = new ArrayList(partitionList.size()); List columns = outSchema.getColumns(); - Tuple aTuple; + VTuple aTuple; for (TablePartitionProto partition: partitionList) { aTuple = new VTuple(outSchema.size()); @@ -418,7 +418,7 @@ private List getAllPartitions(Schema outSchema) { private Tuple getQueryMasterTuple(Schema outSchema, Worker aWorker) { List columns = outSchema.getColumns(); - Tuple aTuple = new VTuple(outSchema.size()); + VTuple aTuple = new VTuple(outSchema.size()); WorkerResource aResource = aWorker.getResource(); for (int fieldId = 0; fieldId < columns.size(); fieldId++) { @@ -464,7 +464,7 @@ private Tuple getQueryMasterTuple(Schema outSchema, Worker aWorker) { private Tuple getWorkerTuple(Schema outSchema, Worker aWorker) { List columns = outSchema.getColumns(); - Tuple aTuple = new VTuple(outSchema.size()); + VTuple aTuple = new VTuple(outSchema.size()); WorkerResource aResource = aWorker.getResource(); for (int fieldId = 0; fieldId < columns.size(); fieldId++) { diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java index ad1a8e35d8..0fc48b4ed6 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java @@ -277,7 +277,7 @@ public void execNonFromQuery(QueryContext queryContext, LogicalPlan plan, Submit try { // start script executor startScriptExecutors(queryContext, evalContext, targets); - final Tuple outTuple = new VTuple(targets.length); + final VTuple outTuple = new VTuple(targets.length); for (int i = 0; i < targets.length; i++) { EvalNode eval = targets[i].getEvalTree(); eval.bind(evalContext, null); diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java b/tajo-core/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java index 36ffd0c383..f1eade0986 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java @@ -301,14 +301,13 @@ public void testEval(OverridableConf context, Schema schema, String tableName, S } for (int i = 0; i < expected.length; i++) { - Datum datum = outTuple.get(i); String outTupleAsChars; - if (datum.type() == Type.TIMESTAMP) { - outTupleAsChars = ((TimestampDatum) datum).asChars(timeZone, false); - } else if (datum.type() == Type.TIME) { - outTupleAsChars = ((TimeDatum) datum).asChars(timeZone, false); + if (outTuple.type(i) == Type.TIMESTAMP) { + outTupleAsChars = TimestampDatum.asChars(outTuple.getTimeDate(i), timeZone, false); + } else if (outTuple.type(i) == Type.TIME) { + outTupleAsChars = TimeDatum.asChars(outTuple.getTimeDate(i), timeZone, false); } else { - outTupleAsChars = datum.asChars(); + outTupleAsChars = outTuple.getText(i); } assertEquals(query, expected[i], outTupleAsChars); } diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java b/tajo-core/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java index 0466a24480..86bb67f818 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java @@ -81,8 +81,8 @@ public TestSum() { @Override public Datum eval(Tuple params) { - x = params.get(0).asInt4(); - y = params.get(1).asInt4(); + x = params.getInt4(0); + y = params.getInt4(1); return DatumFactory.createInt4(x + y); } } diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/eval/TestSQLExpression.java b/tajo-core/src/test/java/org/apache/tajo/engine/eval/TestSQLExpression.java index 52982c0091..b04d544862 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/eval/TestSQLExpression.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/eval/TestSQLExpression.java @@ -861,7 +861,7 @@ public void testCastWithNestedFunction() throws IOException { int unixtime = 1389071574; // (int) (System.currentTimeMillis() / 1000); TimestampDatum expected = DatumFactory.createTimestmpDatumWithUnixTime(unixtime); testSimpleEval(context, String.format("select to_timestamp(CAST(split_part('%d.999', '.', 1) as INT8));", unixtime), - new String[] {expected.asChars(tz, false)}); + new String[] {TimestampDatum.asChars(expected.asTimeMeta(), tz, false)}); } @Test @@ -887,10 +887,11 @@ public void testCastFromTable() throws IOException { testEval(queryContext, schema, "table1", "1980-04-01 01:50:01,234", "select col1::timestamp as t1, col2::float from table1 where t1 = '1980-04-01 01:50:01'::timestamp", - new String[]{timestamp.asChars(tz, false), "234.0"} + new String[]{TimestampDatum.asChars(timestamp.asTimeMeta(), tz, false), "234.0"} ); - testSimpleEval("select '1980-04-01 01:50:01'::timestamp;", new String[]{timestamp.asChars(tz, false)}); + testSimpleEval("select '1980-04-01 01:50:01'::timestamp;", new String[]{ + TimestampDatum.asChars(timestamp.asTimeMeta(), tz, false)}); testSimpleEval("select '1980-04-01 01:50:01'::timestamp::text", new String[]{"1980-04-01 01:50:01"}); testSimpleEval("select (cast ('99999'::int8 as text))::int4 + 1", new String[]{"100000"}); diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestUniformRangePartition.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestUniformRangePartition.java index c5ef4efefe..73d33b1ea6 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestUniformRangePartition.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestUniformRangePartition.java @@ -43,8 +43,8 @@ public void testPartitionForINT2Asc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createInt2((short) 1)); e.put(0, DatumFactory.createInt2((short) 30000)); @@ -74,8 +74,8 @@ public void testPartitionForINT2Desc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); sortSpecs[0].setDescOrder(); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createInt2((short) 30000)); e.put(0, DatumFactory.createInt2((short) 1)); @@ -104,8 +104,8 @@ public void testPartitionForINT4Asc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createInt4(1)); e.put(0, DatumFactory.createInt4(10000)); @@ -135,8 +135,8 @@ public void testPartitionForINT4Desc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); sortSpecs[0].setDescOrder(); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createInt4(10000)); e.put(0, DatumFactory.createInt4(1)); @@ -165,8 +165,8 @@ public void testPartitionForINT8Asc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createInt8(1)); e.put(0, DatumFactory.createInt8(10000)); @@ -196,8 +196,8 @@ public void testPartitionForInt8Desc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); sortSpecs[0].setDescOrder(); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createInt8(10000)); e.put(0, DatumFactory.createInt8(1)); @@ -226,8 +226,8 @@ public void testPartitionForFloat4Asc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createFloat4((float) 1.0)); e.put(0, DatumFactory.createFloat4((float) 10000.0)); @@ -257,8 +257,8 @@ public void testPartitionForFloat4Desc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); sortSpecs[0].setDescOrder(); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createFloat4((float) 10000.0)); e.put(0, DatumFactory.createFloat4((float) 1.0)); @@ -287,8 +287,8 @@ public void testPartitionForFloat8Asc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createFloat8(1.0)); e.put(0, DatumFactory.createFloat8(10000.0)); @@ -318,8 +318,8 @@ public void testPartitionForFloat8Desc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); sortSpecs[0].setDescOrder(); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createFloat8((float) 10000.0)); e.put(0, DatumFactory.createFloat8((float) 1.0)); @@ -352,10 +352,10 @@ public void testIncrementOfText() { SortSpec[] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(2); + VTuple s = new VTuple(2); s.put(0, DatumFactory.createText("A")); s.put(1, DatumFactory.createText("A")); - Tuple e = new VTuple(2); + VTuple e = new VTuple(2); e.put(0, DatumFactory.createText("D")); e.put(1, DatumFactory.createText("C")); @@ -378,7 +378,7 @@ public void testIncrementOfText() { result[10] = "DB"; result[11] = "DC"; - Tuple end = partitioner.increment(s, BigInteger.valueOf(1), 1); + VTuple end = partitioner.increment(s, BigInteger.valueOf(1), 1); assertEquals("A", end.get(0).asChars()); assertEquals("B", end.get(1).asChars()); for (int i = 2; i < 11; i++ ) { @@ -399,10 +399,10 @@ public void testIncrementOfText2() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(2); + VTuple s = new VTuple(2); s.put(0, DatumFactory.createText("A")); s.put(1, DatumFactory.createText("A")); - Tuple e = new VTuple(2); + VTuple e = new VTuple(2); e.put(0, DatumFactory.createText("D")); e.put(1, DatumFactory.createText("C")); @@ -425,7 +425,7 @@ public void testIncrementOfText2() { result[10] = "DB"; result[11] = "DC"; - Tuple end = partitioner.increment(s, BigInteger.valueOf(6), 1); + VTuple end = partitioner.increment(s, BigInteger.valueOf(6), 1); assertEquals("C", end.get(0).asChars()); assertEquals("A", end.get(1).asChars()); end = partitioner.increment(end, BigInteger.valueOf(5), 1); @@ -445,11 +445,11 @@ public void testIncrementOfText3() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(3); + VTuple s = new VTuple(3); s.put(0, DatumFactory.createText("A")); s.put(1, DatumFactory.createText("A")); s.put(2, DatumFactory.createText("A")); - Tuple e = new VTuple(3); + VTuple e = new VTuple(3); e.put(0, DatumFactory.createText("D")); // 4 e.put(1, DatumFactory.createText("B")); // 2 e.put(2, DatumFactory.createText("C")); // x3 = 24 @@ -460,13 +460,13 @@ public void testIncrementOfText3() { assertEquals(24, partitioner.getTotalCardinality().intValue()); Tuple overflowBefore = partitioner.increment(s, BigInteger.valueOf(5), 2); - assertEquals("A", overflowBefore.get(0).asChars()); - assertEquals("B", overflowBefore.get(1).asChars()); - assertEquals("C", overflowBefore.get(2).asChars()); + assertEquals("A", overflowBefore.getText(0)); + assertEquals("B", overflowBefore.getText(1)); + assertEquals("C", overflowBefore.getText(2)); Tuple overflowed = partitioner.increment(overflowBefore, BigInteger.valueOf(1), 2); - assertEquals("B", overflowed.get(0).asChars()); - assertEquals("A", overflowed.get(1).asChars()); - assertEquals("A", overflowed.get(2).asChars()); + assertEquals("B", overflowed.getText(0)); + assertEquals("A", overflowed.getText(1)); + assertEquals("A", overflowed.getText(2)); } @Test @@ -476,9 +476,9 @@ public void testIncrementOfUnicode() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); + VTuple s = new VTuple(1); s.put(0, DatumFactory.createText("가가가")); - Tuple e = new VTuple(1); + VTuple e = new VTuple(1); e.put(0, DatumFactory.createText("하하하")); TupleRange expected = new TupleRange(sortSpecs, s, e); @@ -504,9 +504,9 @@ public void testIncrementOfUnicodeOneCharSinglePartition() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); + VTuple s = new VTuple(1); s.put(0, DatumFactory.createText("가")); - Tuple e = new VTuple(1); + VTuple e = new VTuple(1); e.put(0, DatumFactory.createText("다")); TupleRange expected = new TupleRange(sortSpecs, s, e); @@ -534,9 +534,9 @@ public void testIncrementOfUnicodeOneCharMultiPartition() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); + VTuple s = new VTuple(1); s.put(0, DatumFactory.createText("가")); - Tuple e = new VTuple(1); + VTuple e = new VTuple(1); e.put(0, DatumFactory.createText("꽥")); TupleRange expected = new TupleRange(sortSpecs, s, e); @@ -564,8 +564,8 @@ public void testPartitionForUnicodeTextAsc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createText("가가가")); e.put(0, DatumFactory.createText("하하하")); @@ -594,8 +594,8 @@ public void testPartitionForUnicodeDiffLenBeginTextAsc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createText("가")); e.put(0, DatumFactory.createText("하하하")); @@ -624,8 +624,8 @@ public void testPartitionForUnicodeDiffLenEndTextAsc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createText("가가가")); e.put(0, DatumFactory.createText("하")); @@ -655,8 +655,8 @@ public void testPartitionForUnicodeTextDesc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); sortSpecs[0].setDescOrder(); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createText("하하하")); e.put(0, DatumFactory.createText("가가가")); @@ -686,8 +686,8 @@ public void testPartitionForUnicodeDiffLenBeginTextDesc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); sortSpecs[0].setDescOrder(); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createText("하")); e.put(0, DatumFactory.createText("가가가")); @@ -717,8 +717,8 @@ public void testPartitionForUnicodeDiffLenEndTextDesc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); sortSpecs[0].setDescOrder(); - Tuple s = new VTuple(1); - Tuple e = new VTuple(1); + VTuple s = new VTuple(1); + VTuple e = new VTuple(1); s.put(0, DatumFactory.createText("하")); e.put(0, DatumFactory.createText("가가가")); @@ -748,10 +748,10 @@ public void testIncrementOfInt8() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(2); + VTuple s = new VTuple(2); s.put(0, DatumFactory.createInt8(10)); s.put(1, DatumFactory.createInt8(20)); - Tuple e = new VTuple(2); + VTuple e = new VTuple(2); e.put(0, DatumFactory.createInt8(19)); e.put(1, DatumFactory.createInt8(39)); @@ -761,11 +761,11 @@ public void testIncrementOfInt8() { assertEquals(200, partitioner.getTotalCardinality().longValue()); Tuple range2 = partitioner.increment(s, BigInteger.valueOf(100), 1); - assertEquals(15, range2.get(0).asInt4()); - assertEquals(20, range2.get(1).asInt4()); + assertEquals(15, range2.getInt4(0)); + assertEquals(20, range2.getInt4(1)); Tuple range3 = partitioner.increment(range2, BigInteger.valueOf(99), 1); - assertEquals(19, range3.get(0).asInt4()); - assertEquals(39, range3.get(1).asInt4()); + assertEquals(19, range3.getInt4(0)); + assertEquals(39, range3.getInt4(1)); } @Test public void testIncrementOfInt8AndFinal() { @@ -776,11 +776,11 @@ public void testIncrementOfInt8() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(3); + VTuple s = new VTuple(3); s.put(0, DatumFactory.createInt8(1)); s.put(1, DatumFactory.createInt8(1)); s.put(2, DatumFactory.createInt8(1)); - Tuple e = new VTuple(3); + VTuple e = new VTuple(3); e.put(0, DatumFactory.createInt8(4)); // 4 e.put(1, DatumFactory.createInt8(2)); // 2 e.put(2, DatumFactory.createInt8(3)); //x3 = 24 @@ -791,13 +791,13 @@ public void testIncrementOfInt8() { assertEquals(24, partitioner.getTotalCardinality().longValue()); Tuple beforeOverflow = partitioner.increment(s, BigInteger.valueOf(5), 2); - assertEquals(1, beforeOverflow.get(0).asInt8()); - assertEquals(2, beforeOverflow.get(1).asInt8()); - assertEquals(3, beforeOverflow.get(2).asInt8()); + assertEquals(1, beforeOverflow.getInt8(0)); + assertEquals(2, beforeOverflow.getInt8(1)); + assertEquals(3, beforeOverflow.getInt8(2)); Tuple overflow = partitioner.increment(beforeOverflow, BigInteger.valueOf(1), 2); - assertEquals(2, overflow.get(0).asInt8()); - assertEquals(1, overflow.get(1).asInt8()); - assertEquals(1, overflow.get(2).asInt8()); + assertEquals(2, overflow.getInt8(0)); + assertEquals(1, overflow.getInt8(1)); + assertEquals(1, overflow.getInt8(2)); } @Test @@ -809,11 +809,11 @@ public void testIncrementOfFloat8() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(3); + VTuple s = new VTuple(3); s.put(0, DatumFactory.createFloat8(1.1d)); s.put(1, DatumFactory.createFloat8(1.1d)); s.put(2, DatumFactory.createFloat8(1.1d)); - Tuple e = new VTuple(3); + VTuple e = new VTuple(3); e.put(0, DatumFactory.createFloat8(4.1d)); // 4 e.put(1, DatumFactory.createFloat8(2.1d)); // 2 e.put(2, DatumFactory.createFloat8(3.1d)); //x3 = 24 @@ -824,13 +824,13 @@ public void testIncrementOfFloat8() { assertEquals(24, partitioner.getTotalCardinality().longValue()); Tuple beforeOverflow = partitioner.increment(s, BigInteger.valueOf(5), 2); - assertTrue(1.1d == beforeOverflow.get(0).asFloat8()); - assertTrue(2.1d == beforeOverflow.get(1).asFloat8()); - assertTrue(3.1d == beforeOverflow.get(2).asFloat8()); + assertTrue(1.1d == beforeOverflow.getFloat8(0)); + assertTrue(2.1d == beforeOverflow.getFloat8(1)); + assertTrue(3.1d == beforeOverflow.getFloat8(2)); Tuple overflow = partitioner.increment(beforeOverflow, BigInteger.valueOf(1), 2); - assertTrue(2.1d == overflow.get(0).asFloat8()); - assertTrue(1.1d == overflow.get(1).asFloat8()); - assertTrue(1.1d == overflow.get(2).asFloat8()); + assertTrue(2.1d == overflow.getFloat8(0)); + assertTrue(1.1d == overflow.getFloat8(1)); + assertTrue(1.1d == overflow.getFloat8(2)); } @Test @@ -842,11 +842,11 @@ public void testIncrementOfInet4() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(3); + VTuple s = new VTuple(3); s.put(0, DatumFactory.createInet4("127.0.1.1")); s.put(1, DatumFactory.createInet4("127.0.0.1")); s.put(2, DatumFactory.createInet4("128.0.0.253")); - Tuple e = new VTuple(3); + VTuple e = new VTuple(3); e.put(0, DatumFactory.createInet4("127.0.1.4")); // 4 e.put(1, DatumFactory.createInet4("127.0.0.2")); // 2 e.put(2, DatumFactory.createInet4("128.0.0.255")); //x3 = 24 @@ -857,13 +857,13 @@ public void testIncrementOfInet4() { assertEquals(24, partitioner.getTotalCardinality().longValue()); Tuple beforeOverflow = partitioner.increment(s, BigInteger.valueOf(5), 2); - assertTrue("127.0.1.1".equals(beforeOverflow.get(0).asChars())); - assertTrue("127.0.0.2".equals(beforeOverflow.get(1).asChars())); - assertTrue("128.0.0.255".equals(beforeOverflow.get(2).asChars())); + assertTrue("127.0.1.1".equals(beforeOverflow.getText(0))); + assertTrue("127.0.0.2".equals(beforeOverflow.getText(1))); + assertTrue("128.0.0.255".equals(beforeOverflow.getText(2))); Tuple overflow = partitioner.increment(beforeOverflow, BigInteger.valueOf(1), 2); - assertTrue("127.0.1.2".equals(overflow.get(0).asChars())); - assertTrue("127.0.0.1".equals(overflow.get(1).asChars())); - assertTrue("128.0.0.253".equals(overflow.get(2).asChars())); + assertTrue("127.0.1.2".equals(overflow.getText(0))); + assertTrue("127.0.0.1".equals(overflow.getText(1))); + assertTrue("128.0.0.253".equals(overflow.getText(2))); } @Test @@ -874,10 +874,10 @@ public void testPartition() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(2); + VTuple s = new VTuple(2); s.put(0, DatumFactory.createText("A")); s.put(1, DatumFactory.createText("F")); - Tuple e = new VTuple(2); + VTuple e = new VTuple(2); e.put(0, DatumFactory.createText("R")); e.put(1, DatumFactory.createText("O")); TupleRange expected = new TupleRange(sortSpecs, s, e); @@ -903,10 +903,10 @@ public void testPartitionForOnePartNum() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(2); + VTuple s = new VTuple(2); s.put(0, DatumFactory.createText("A")); s.put(1, DatumFactory.createText("F")); - Tuple e = new VTuple(2); + VTuple e = new VTuple(2); e.put(0, DatumFactory.createText("R")); e.put(1, DatumFactory.createText("O")); TupleRange expected = new TupleRange(sortSpecs, s, e); @@ -925,10 +925,10 @@ public void testPartitionForOnePartNumWithOneOfTheValueNull() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(2); + VTuple s = new VTuple(2); s.put(0, DatumFactory.createNullDatum()); s.put(1, DatumFactory.createText("F")); - Tuple e = new VTuple(2); + VTuple e = new VTuple(2); e.put(0, DatumFactory.createText("R")); e.put(1, DatumFactory.createNullDatum()); TupleRange expected = new TupleRange(sortSpecs, s, e); @@ -946,9 +946,9 @@ public void testPartitionForMultipleChars() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); + VTuple s = new VTuple(1); s.put(0, DatumFactory.createText("AAA")); - Tuple e = new VTuple(1); + VTuple e = new VTuple(1); e.put(0, DatumFactory.createText("ZZZ")); TupleRange expected = new TupleRange(sortSpecs, s, e); @@ -975,9 +975,9 @@ public void testPartitionForMultipleChars2() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); + VTuple s = new VTuple(1); s.put(0, DatumFactory.createText("A1")); - Tuple e = new VTuple(1); + VTuple e = new VTuple(1); e.put(0, DatumFactory.createText("A999975")); final int partNum = 2; @@ -1007,9 +1007,9 @@ public void testPartitionForMultipleChars2Desc() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); sortSpecs[0].setDescOrder(); - Tuple s = new VTuple(1); + VTuple s = new VTuple(1); s.put(0, DatumFactory.createText("A999975")); - Tuple e = new VTuple(1); + VTuple e = new VTuple(1); e.put(0, DatumFactory.createText("A1")); final int partNum = 48; @@ -1038,9 +1038,9 @@ public void testPartitionForMultipleCharsWithSameFirstChar() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); + VTuple s = new VTuple(1); s.put(0, DatumFactory.createText("AAA")); - Tuple e = new VTuple(1); + VTuple e = new VTuple(1); e.put(0, DatumFactory.createText("AAZ")); final int partNum = 4; @@ -1070,10 +1070,10 @@ public void testPartitionForOnePartNumWithBothValueNull() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(2); + VTuple s = new VTuple(2); s.put(0, DatumFactory.createNullDatum()); s.put(1, DatumFactory.createNullDatum()); - Tuple e = new VTuple(2); + VTuple e = new VTuple(2); e.put(0, DatumFactory.createNullDatum()); e.put(1, DatumFactory.createNullDatum()); TupleRange expected = new TupleRange(sortSpecs, s, e); @@ -1092,10 +1092,10 @@ public void testPartitionWithNull() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(2); + VTuple s = new VTuple(2); s.put(0, DatumFactory.createNullDatum()); s.put(1, DatumFactory.createText("F")); - Tuple e = new VTuple(2); + VTuple e = new VTuple(2); e.put(0, DatumFactory.createNullDatum()); e.put(1, DatumFactory.createText("O")); TupleRange expected = new TupleRange(sortSpecs, s, e); @@ -1121,10 +1121,10 @@ public void testPartitionWithINET4() { SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(2); + VTuple s = new VTuple(2); s.put(0, DatumFactory.createInet4("127.0.1.10")); s.put(1, DatumFactory.createInet4("127.0.2.10")); - Tuple e = new VTuple(2); + VTuple e = new VTuple(2); e.put(0, DatumFactory.createInet4("127.0.1.20")); e.put(1, DatumFactory.createInet4("127.0.2.20")); TupleRange expected = new TupleRange(sortSpecs, s, e); diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/global/TestBroadcastJoinPlan.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/global/TestBroadcastJoinPlan.java index eb92bcfe8f..5bb52e3bff 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/global/TestBroadcastJoinPlan.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/global/TestBroadcastJoinPlan.java @@ -140,7 +140,7 @@ private TableDesc makeTestData(String tableName, Schema schema, int dataSize) th Appender appender = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(tableMeta, schema, dataPath); appender.init(); - Tuple tuple = new VTuple(schema.size()); + VTuple tuple = new VTuple(schema.size()); int writtenSize = 0; int count = 0; while (true) { diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestBNLJoinExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestBNLJoinExec.java index 842a120791..84da9c2c06 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestBNLJoinExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestBNLJoinExec.java @@ -90,7 +90,7 @@ public void setUp() throws Exception { Appender appender = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(employeeMeta, schema, employeePath); appender.init(); - Tuple tuple = new VTuple(schema.size()); + VTuple tuple = new VTuple(schema.size()); for (int i = 0; i < OUTER_TUPLE_NUM; i++) { tuple.put(new Datum[] { DatumFactory.createInt4(i), DatumFactory.createInt4(i), DatumFactory.createInt4(10 + i), @@ -213,10 +213,10 @@ public final void testBNLInnerJoin() throws IOException, PlanningException { exec.init(); while ((tuple = exec.next()) != null) { count++; - assertTrue(i == tuple.get(0).asInt4()); - assertTrue(i == tuple.get(1).asInt4()); - assertTrue(("dept_" + i).equals(tuple.get(2).asChars())); - assertTrue(10 + i == tuple.get(3).asInt4()); + assertTrue(i == tuple.getInt4(0)); + assertTrue(i == tuple.getInt4(1)); + assertTrue(("dept_" + i).equals(tuple.getText(2))); + assertTrue(10 + i == tuple.getInt4(3)); i += 2; } exec.close(); diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestBSTIndexExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestBSTIndexExec.java index b22a87e168..c55fa505d5 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestBSTIndexExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestBSTIndexExec.java @@ -119,10 +119,10 @@ public void setup() throws Exception { FileAppender appender = (FileAppender)sm.getAppender(meta, schema, tablePath); appender.init(); - Tuple tuple = new VTuple(schema.size()); + VTuple tuple = new VTuple(schema.size()); for (int i = 0; i < 10000; i++) { - Tuple key = new VTuple(this.idxSchema.size()); + VTuple key = new VTuple(this.idxSchema.size()); int rndKey = rnd.nextInt(250); if(this.randomValues.containsKey(rndKey)) { int t = this.randomValues.remove(rndKey) + 1; diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestExternalSortExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestExternalSortExec.java index 0ef8294f25..0ddc46d420 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestExternalSortExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestExternalSortExec.java @@ -87,7 +87,7 @@ public void setUp() throws Exception { .getAppender(employeeMeta, schema, employeePath); appender.enableStats(); appender.init(); - Tuple tuple = new VTuple(schema.size()); + VTuple tuple = new VTuple(schema.size()); for (int i = 0; i < numTuple; i++) { tuple.put(new Datum[] { DatumFactory.createInt4(rnd.nextInt(50)), diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterHashJoinExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterHashJoinExec.java index 780e698a4b..0c355cd756 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterHashJoinExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterHashJoinExec.java @@ -108,7 +108,7 @@ public void setUp() throws Exception { Appender appender1 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(dep3Meta, dep3Schema, dep3Path); appender1.init(); - Tuple tuple = new VTuple(dep3Schema.size()); + VTuple tuple = new VTuple(dep3Schema.size()); for (int i = 0; i < 10; i++) { tuple.put(new Datum[] { DatumFactory.createInt4(i), DatumFactory.createText("dept_" + i), @@ -138,7 +138,7 @@ public void setUp() throws Exception { Appender appender2 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(job3Meta, job3Schema, job3Path); appender2.init(); - Tuple tuple2 = new VTuple(job3Schema.size()); + VTuple tuple2 = new VTuple(job3Schema.size()); for (int i = 1; i < 4; i++) { int x = 100 + i; tuple2.put(new Datum[] { DatumFactory.createInt4(100 + i), @@ -178,7 +178,7 @@ public void setUp() throws Exception { Appender appender3 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(emp3Meta, emp3Schema, emp3Path); appender3.init(); - Tuple tuple3 = new VTuple(emp3Schema.size()); + VTuple tuple3 = new VTuple(emp3Schema.size()); for (int i = 1; i < 4; i += 2) { int x = 10 + i; diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterMergeJoinExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterMergeJoinExec.java index ef6f1ceb71..61da403a5c 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterMergeJoinExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterMergeJoinExec.java @@ -113,7 +113,7 @@ public void setUp() throws Exception { Appender appender1 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(dep3Meta, dep3Schema, dep3Path); appender1.init(); - Tuple tuple = new VTuple(dep3Schema.size()); + VTuple tuple = new VTuple(dep3Schema.size()); for (int i = 0; i < 10; i++) { tuple.put(new Datum[] { DatumFactory.createInt4(i), DatumFactory.createText("dept_" + i), @@ -152,7 +152,7 @@ public void setUp() throws Exception { Appender appender4 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(dep4Meta, dep4Schema, dep4Path); appender4.init(); - Tuple tuple4 = new VTuple(dep4Schema.size()); + VTuple tuple4 = new VTuple(dep4Schema.size()); for (int i = 0; i < 11; i++) { tuple4.put(new Datum[] { DatumFactory.createInt4(i), DatumFactory.createText("dept_" + i), @@ -184,7 +184,7 @@ public void setUp() throws Exception { Appender appender2 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(job3Meta, job3Schema, job3Path); appender2.init(); - Tuple tuple2 = new VTuple(job3Schema.size()); + VTuple tuple2 = new VTuple(job3Schema.size()); for (int i = 1; i < 4; i++) { int x = 100 + i; tuple2.put(new Datum[] { DatumFactory.createInt4(100 + i), @@ -224,7 +224,7 @@ public void setUp() throws Exception { Appender appender3 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(emp3Meta, emp3Schema, emp3Path); appender3.init(); - Tuple tuple3 = new VTuple(emp3Schema.size()); + VTuple tuple3 = new VTuple(emp3Schema.size()); for (int i = 1; i < 4; i += 2) { int x = 10 + i; diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashAntiJoinExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashAntiJoinExec.java index 64efa28ec3..c52e8f16e7 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashAntiJoinExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashAntiJoinExec.java @@ -87,7 +87,7 @@ public void setUp() throws Exception { Appender appender = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(employeeMeta, employeeSchema, employeePath); appender.init(); - Tuple tuple = new VTuple(employeeSchema.size()); + VTuple tuple = new VTuple(employeeSchema.size()); for (int i = 0; i < 10; i++) { tuple.put(new Datum[] { @@ -200,10 +200,10 @@ public final void testHashAntiJoin() throws IOException, PlanningException { exec.init(); while ((tuple = exec.next()) != null) { count++; - assertTrue(i == tuple.get(0).asInt4()); - assertTrue(i == tuple.get(1).asInt4()); // expected empid [0, 2, 4, 6, 8] - assertTrue(("dept_" + i).equals(tuple.get(2).asChars())); - assertTrue(10 + i == tuple.get(3).asInt4()); + assertTrue(i == tuple.getInt4(0)); + assertTrue(i == tuple.getInt4(1)); // expected empid [0, 2, 4, 6, 8] + assertTrue(("dept_" + i).equals(tuple.getText(2))); + assertTrue(10 + i == tuple.getInt4(3)); i += 2; } diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashJoinExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashJoinExec.java index 578b58607d..2e88f7201a 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashJoinExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashJoinExec.java @@ -89,7 +89,7 @@ public void setUp() throws Exception { Appender appender = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(employeeMeta, employeeSchema, employeePath); appender.init(); - Tuple tuple = new VTuple(employeeSchema.size()); + VTuple tuple = new VTuple(employeeSchema.size()); for (int i = 0; i < 10; i++) { tuple.put(new Datum[] { DatumFactory.createInt4(i), DatumFactory.createInt4(i), DatumFactory.createInt4(10 + i), @@ -174,10 +174,10 @@ public final void testHashInnerJoin() throws IOException, PlanningException { exec.init(); while ((tuple = exec.next()) != null) { count++; - assertTrue(i == tuple.get(0).asInt4()); - assertTrue(i == tuple.get(1).asInt4()); - assertTrue(("dept_" + i).equals(tuple.get(2).asChars())); - assertTrue(10 + i == tuple.get(3).asInt4()); + assertTrue(i == tuple.getInt4(0)); + assertTrue(i == tuple.getInt4(1)); + assertTrue(("dept_" + i).equals(tuple.getText(2))); + assertTrue(10 + i == tuple.getInt4(3)); i += 2; } diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashPartitioner.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashPartitioner.java index 2241870d1d..1146e853e5 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashPartitioner.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashPartitioner.java @@ -46,31 +46,31 @@ public void tearDown() throws Exception { @Test public final void testGetPartition() { - Tuple tuple1 = new VTuple(3); + VTuple tuple1 = new VTuple(3); tuple1.put(new Datum[] { DatumFactory.createInt4(1), DatumFactory.createInt4(2), DatumFactory.createInt4(3) }); - Tuple tuple2 = new VTuple(3); + VTuple tuple2 = new VTuple(3); tuple2.put(new Datum[] { DatumFactory.createInt4(1), DatumFactory.createInt4(2), DatumFactory.createInt4(4) }); - Tuple tuple3 = new VTuple(3); + VTuple tuple3 = new VTuple(3); tuple3.put(new Datum[] { DatumFactory.createInt4(1), DatumFactory.createInt4(2), DatumFactory.createInt4(5) }); - Tuple tuple4 = new VTuple(3); + VTuple tuple4 = new VTuple(3); tuple4.put(new Datum[] { DatumFactory.createInt4(2), DatumFactory.createInt4(2), DatumFactory.createInt4(3) }); - Tuple tuple5 = new VTuple(3); + VTuple tuple5 = new VTuple(3); tuple5.put(new Datum[] { DatumFactory.createInt4(2), DatumFactory.createInt4(2), diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashSemiJoinExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashSemiJoinExec.java index 42a018bdac..1cba11da5b 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashSemiJoinExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestHashSemiJoinExec.java @@ -88,7 +88,7 @@ public void setUp() throws Exception { Appender appender = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(employeeMeta, employeeSchema, employeePath); appender.init(); - Tuple tuple = new VTuple(employeeSchema.size()); + VTuple tuple = new VTuple(employeeSchema.size()); for (int i = 0; i < 10; i++) { tuple.put(new Datum[] { @@ -206,10 +206,10 @@ public final void testHashSemiJoin() throws IOException, PlanningException { // expect result without duplicated tuples. while ((tuple = exec.next()) != null) { count++; - assertTrue(i == tuple.get(0).asInt4()); - assertTrue(i == tuple.get(1).asInt4()); - assertTrue(("dept_" + i).equals(tuple.get(2).asChars())); - assertTrue(10 + i == tuple.get(3).asInt4()); + assertTrue(i == tuple.getInt4(0)); + assertTrue(i == tuple.getInt4(1)); + assertTrue(("dept_" + i).equals(tuple.getText(2))); + assertTrue(10 + i == tuple.getInt4(3)); i += 2; } diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestLeftOuterHashJoinExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestLeftOuterHashJoinExec.java index 5747e58aed..c0c2e896af 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestLeftOuterHashJoinExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestLeftOuterHashJoinExec.java @@ -109,7 +109,7 @@ public void setUp() throws Exception { Appender appender1 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(dep3Meta, dep3Schema, dep3Path); appender1.init(); - Tuple tuple = new VTuple(dep3Schema.size()); + VTuple tuple = new VTuple(dep3Schema.size()); for (int i = 0; i < 10; i++) { tuple.put(new Datum[] { DatumFactory.createInt4(i), DatumFactory.createText("dept_" + i), @@ -139,7 +139,7 @@ public void setUp() throws Exception { Appender appender2 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(job3Meta, job3Schema, job3Path); appender2.init(); - Tuple tuple2 = new VTuple(job3Schema.size()); + VTuple tuple2 = new VTuple(job3Schema.size()); for (int i = 1; i < 4; i++) { int x = 100 + i; tuple2.put(new Datum[] { DatumFactory.createInt4(100 + i), @@ -179,7 +179,7 @@ public void setUp() throws Exception { Appender appender3 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(emp3Meta, emp3Schema, emp3Path); appender3.init(); - Tuple tuple3 = new VTuple(emp3Schema.size()); + VTuple tuple3 = new VTuple(emp3Schema.size()); for (int i = 1; i < 4; i += 2) { int x = 10 + i; diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestLeftOuterNLJoinExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestLeftOuterNLJoinExec.java index ab4b88161f..ce285b6bee 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestLeftOuterNLJoinExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestLeftOuterNLJoinExec.java @@ -105,7 +105,7 @@ public void setUp() throws Exception { Appender appender1 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(dep3Meta, dep3Schema, dep3Path); appender1.init(); - Tuple tuple = new VTuple(dep3Schema.size()); + VTuple tuple = new VTuple(dep3Schema.size()); for (int i = 0; i < 10; i++) { tuple.put(new Datum[] { DatumFactory.createInt4(i), DatumFactory.createText("dept_" + i), @@ -135,7 +135,7 @@ public void setUp() throws Exception { Appender appender2 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(job3Meta, job3Schema, job3Path); appender2.init(); - Tuple tuple2 = new VTuple(job3Schema.size()); + VTuple tuple2 = new VTuple(job3Schema.size()); for (int i = 1; i < 4; i++) { int x = 100 + i; tuple2.put(new Datum[] { DatumFactory.createInt4(100 + i), @@ -175,7 +175,7 @@ public void setUp() throws Exception { Appender appender3 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(emp3Meta, emp3Schema, emp3Path); appender3.init(); - Tuple tuple3 = new VTuple(emp3Schema.size()); + VTuple tuple3 = new VTuple(emp3Schema.size()); for (int i = 1; i < 4; i += 2) { int x = 10 + i; diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestMergeJoinExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestMergeJoinExec.java index 1cc4e6358e..cdb93dc348 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestMergeJoinExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestMergeJoinExec.java @@ -89,7 +89,7 @@ public void setUp() throws Exception { Appender appender = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(employeeMeta, employeeSchema, employeePath); appender.init(); - Tuple tuple = new VTuple(employeeSchema.size()); + VTuple tuple = new VTuple(employeeSchema.size()); for (int i = 0; i < 10; i++) { tuple.put(new Datum[] { DatumFactory.createInt4(i), DatumFactory.createInt4(i), DatumFactory.createInt4(10 + i), @@ -185,10 +185,10 @@ public final void testMergeInnerJoin() throws IOException, PlanningException { exec.init(); while ((tuple = exec.next()) != null) { count++; - assertTrue(i == tuple.get(0).asInt4()); - assertTrue(i == tuple.get(1).asInt4()); - assertTrue(("dept_" + i).equals(tuple.get(2).asChars())); - assertTrue((10 + i) == tuple.get(3).asInt4()); + assertTrue(i == tuple.getInt4(0)); + assertTrue(i == tuple.getInt4(1)); + assertTrue(("dept_" + i).equals(tuple.getText(2))); + assertTrue((10 + i) == tuple.getInt4(3)); i += 2; } diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestNLJoinExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestNLJoinExec.java index 240e7fddeb..43de09652f 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestNLJoinExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestNLJoinExec.java @@ -87,7 +87,7 @@ public void setUp() throws Exception { Appender appender = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(employeeMeta, schema, employeePath); appender.init(); - Tuple tuple = new VTuple(schema.size()); + VTuple tuple = new VTuple(schema.size()); for (int i = 0; i < 50; i++) { tuple.put(new Datum[] { DatumFactory.createInt4(i), @@ -197,10 +197,10 @@ public final void testNLInnerJoin() throws IOException, PlanningException { exec.init(); while ((tuple = exec.next()) != null) { count++; - assertTrue(i == tuple.get(0).asInt4()); - assertTrue(i == tuple.get(1).asInt4()); - assertTrue(("dept_" + i).equals(tuple.get(2).asChars())); - assertTrue(10 + i == tuple.get(3).asInt4()); + assertTrue(i == tuple.getInt4(0)); + assertTrue(i == tuple.getInt4(1)); + assertTrue(("dept_" + i).equals(tuple.getText(2))); + assertTrue(10 + i == tuple.getInt4(3)); i += 2; } exec.close(); diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java index e2216b91f5..dd88b58de3 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java @@ -124,7 +124,7 @@ public static void setUp() throws Exception { Path employeePath = new Path(testDir, "employee.csv"); Appender appender = sm.getAppender(employeeMeta, employeeSchema, employeePath); appender.init(); - Tuple tuple = new VTuple(employeeSchema.size()); + VTuple tuple = new VTuple(employeeSchema.size()); for (int i = 0; i < 100; i++) { tuple.put(new Datum[] {DatumFactory.createText("name_" + i), DatumFactory.createInt4(i), DatumFactory.createText("dept_" + i)}); @@ -189,7 +189,7 @@ public static void createLargeScoreTable() throws IOException { CatalogUtil.buildFQName(TajoConstants.DEFAULT_DATABASE_NAME, "score_large"), scoreSchmea, scoreLargeMeta, scoreLargePath.toUri()); - Tuple tuple = new VTuple(scoreSchmea.size()); + VTuple tuple = new VTuple(scoreSchmea.size()); int m = 0; for (int i = 1; i <= 40000; i++) { for (int k = 3; k < 5; k++) { // |{3,4}| = 2 @@ -317,9 +317,9 @@ public final void testGroupByPlan() throws IOException, PlanningException { Tuple tuple; exec.init(); while ((tuple = exec.next()) != null) { - assertEquals(6, tuple.get(2).asInt4()); // sum - assertEquals(3, tuple.get(3).asInt4()); // max - assertEquals(1, tuple.get(4).asInt4()); // min + assertEquals(6, tuple.getInt4(2)); // sum + assertEquals(3, tuple.getInt4(3)); // max + assertEquals(1, tuple.getInt4(4)); // min i++; } exec.close(); @@ -348,9 +348,9 @@ public final void testHashGroupByPlanWithALLField() throws IOException, Planning Tuple tuple; exec.init(); while ((tuple = exec.next()) != null) { - assertEquals(12, tuple.get(1).asInt4()); // sum - assertEquals(3, tuple.get(2).asInt4()); // max - assertEquals(1, tuple.get(3).asInt4()); // min + assertEquals(12, tuple.getInt4(1)); // sum + assertEquals(3, tuple.getInt4(2)); // max + assertEquals(1, tuple.getInt4(3)); // min i++; } exec.close(); @@ -392,9 +392,9 @@ public final void testSortGroupByPlan() throws IOException, PlanningException { Tuple tuple; exec.init(); while ((tuple = exec.next()) != null) { - assertEquals(6, tuple.get(2).asInt4()); // sum - assertEquals(3, tuple.get(3).asInt4()); // max - assertEquals(1, tuple.get(4).asInt4()); // min + assertEquals(6, tuple.getInt4(2)); // sum + assertEquals(3, tuple.getInt4(3)); // max + assertEquals(1, tuple.getInt4(4)); // min i++; } assertEquals(10, i); @@ -402,9 +402,9 @@ public final void testSortGroupByPlan() throws IOException, PlanningException { exec.rescan(); i = 0; while ((tuple = exec.next()) != null) { - assertEquals(6, tuple.get(2).asInt4()); // sum - assertEquals(3, tuple.get(3).asInt4()); // max - assertEquals(1, tuple.get(4).asInt4()); // min + assertEquals(6, tuple.getInt4(2)); // sum + assertEquals(3, tuple.getInt4(3)); // max + assertEquals(1, tuple.getInt4(4)); // min i++; } exec.close(); @@ -449,9 +449,9 @@ public final void testStorePlan() throws IOException, PlanningException { Tuple tuple; int i = 0; while ((tuple = scanner.next()) != null) { - assertEquals(6, tuple.get(2).asInt4()); // sum - assertEquals(3, tuple.get(3).asInt4()); // max - assertEquals(1, tuple.get(4).asInt4()); // min + assertEquals(6, tuple.getInt4(2)); // sum + assertEquals(3, tuple.getInt4(3)); // max + assertEquals(1, tuple.getInt4(4)); // min i++; } assertEquals(10, i); @@ -546,9 +546,9 @@ public final void testStorePlanWithRCFile() throws IOException, PlanningExceptio Tuple tuple; int i = 0; while ((tuple = scanner.next()) != null) { - assertEquals(6, tuple.get(2).asInt4()); // sum - assertEquals(3, tuple.get(3).asInt4()); // max - assertEquals(1, tuple.get(4).asInt4()); // min + assertEquals(6, tuple.getInt4(2)); // sum + assertEquals(3, tuple.getInt4(3)); // max + assertEquals(1, tuple.getInt4(4)); // min i++; } assertEquals(10, i); @@ -678,9 +678,9 @@ public final void testPartitionedStorePlan() throws IOException, PlanningExcepti Tuple tuple; int i = 0; while ((tuple = scanner.next()) != null) { - assertEquals(6, tuple.get(2).asInt4()); // sum - assertEquals(3, tuple.get(3).asInt4()); // max - assertEquals(1, tuple.get(4).asInt4()); // min + assertEquals(6, tuple.getInt4(2)); // sum + assertEquals(3, tuple.getInt4(3)); // max + assertEquals(1, tuple.getInt4(4)); // min i++; } assertEquals(10, i); @@ -812,9 +812,9 @@ public final void testPartitionedStorePlanWithEmptyGroupingSet() Tuple tuple; int i = 0; while ((tuple = scanner.next()) != null) { - assertEquals(60, tuple.get(0).asInt4()); // sum - assertEquals(3, tuple.get(1).asInt4()); // max - assertEquals(1, tuple.get(2).asInt4()); // min + assertEquals(60, tuple.getInt4(0)); // sum + assertEquals(3, tuple.getInt4(1)); // max + assertEquals(1, tuple.getInt4(2)); // min i++; } assertEquals(1, i); @@ -849,9 +849,9 @@ public final void testAggregationFunction() throws IOException, PlanningExceptio exec.init(); Tuple tuple = exec.next(); - assertEquals(30, tuple.get(0).asInt8()); - assertEquals(3, tuple.get(1).asInt4()); - assertEquals(1, tuple.get(2).asInt4()); + assertEquals(30, tuple.getInt8(0)); + assertEquals(3, tuple.getInt4(1)); + assertEquals(1, tuple.getInt4(2)); assertNull(exec.next()); exec.close(); } @@ -879,7 +879,7 @@ public final void testCountFunction() throws IOException, PlanningException { PhysicalExec exec = phyPlanner.createPlan(ctx, rootNode); exec.init(); Tuple tuple = exec.next(); - assertEquals(30, tuple.get(0).asInt8()); + assertEquals(30, tuple.getInt8(0)); assertNull(exec.next()); exec.close(); } @@ -955,8 +955,8 @@ public final void testEvalExpr() throws IOException, PlanningException { exec.init(); tuple = exec.next(); exec.close(); - assertEquals(true, tuple.get(0).asBool()); - assertTrue(7.0d == tuple.get(1).asFloat8()); + assertEquals(true, tuple.getBool(0)); + assertTrue(7.0d == tuple.getFloat8(1)); expr = analyzer.parse(QUERIES[13]); plan = planner.createPlan(defaultContext, expr); @@ -967,7 +967,7 @@ public final void testEvalExpr() throws IOException, PlanningException { exec.init(); tuple = exec.next(); exec.close(); - assertEquals(DatumFactory.createBool(true), tuple.get(0)); + assertEquals(DatumFactory.createBool(true), tuple.asDatum(0)); } public final String [] createIndexStmt = { @@ -1024,7 +1024,7 @@ public final void testDuplicateEliminate() throws IOException, PlanningException "name_1", "name_2", "name_3", "name_4", "name_5"); exec.init(); while ((tuple = exec.next()) != null) { - assertTrue(expected.contains(tuple.get(0).asChars())); + assertTrue(expected.contains(tuple.getText(0))); cnt++; } exec.close(); diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestProgressExternalSortExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestProgressExternalSortExec.java index 161b0d8851..a27a403ae8 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestProgressExternalSortExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestProgressExternalSortExec.java @@ -91,7 +91,7 @@ public void setUp() throws Exception { .getAppender(employeeMeta, schema, employeePath); appender.enableStats(); appender.init(); - Tuple tuple = new VTuple(schema.size()); + VTuple tuple = new VTuple(schema.size()); for (int i = 0; i < numTuple; i++) { tuple.put(new Datum[] { DatumFactory.createInt4(rnd.nextInt(50)), diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterHashJoinExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterHashJoinExec.java index 06ab6c8781..288fad3d5d 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterHashJoinExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterHashJoinExec.java @@ -104,7 +104,7 @@ public void setUp() throws Exception { Appender appender1 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(dep3Meta, dep3Schema, dep3Path); appender1.init(); - Tuple tuple = new VTuple(dep3Schema.size()); + VTuple tuple = new VTuple(dep3Schema.size()); for (int i = 0; i < 10; i++) { tuple.put(new Datum[] { DatumFactory.createInt4(i), DatumFactory.createText("dept_" + i), @@ -134,7 +134,7 @@ public void setUp() throws Exception { Appender appender2 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(job3Meta, job3Schema, job3Path); appender2.init(); - Tuple tuple2 = new VTuple(job3Schema.size()); + VTuple tuple2 = new VTuple(job3Schema.size()); for (int i = 1; i < 4; i++) { int x = 100 + i; tuple2.put(new Datum[] { DatumFactory.createInt4(100 + i), @@ -174,7 +174,7 @@ public void setUp() throws Exception { Appender appender3 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(emp3Meta, emp3Schema, emp3Path); appender3.init(); - Tuple tuple3 = new VTuple(emp3Schema.size()); + VTuple tuple3 = new VTuple(emp3Schema.size()); for (int i = 1; i < 4; i += 2) { int x = 10 + i; diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterMergeJoinExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterMergeJoinExec.java index 30fd999762..b5034acd9f 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterMergeJoinExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterMergeJoinExec.java @@ -111,7 +111,7 @@ public void setUp() throws Exception { Appender appender1 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(dep3Meta, dep3Schema, dep3Path); appender1.init(); - Tuple tuple = new VTuple(dep3Schema.size()); + VTuple tuple = new VTuple(dep3Schema.size()); for (int i = 0; i < 10; i++) { tuple.put(new Datum[] { DatumFactory.createInt4(i), DatumFactory.createText("dept_" + i), @@ -150,7 +150,7 @@ public void setUp() throws Exception { Appender appender4 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(dep4Meta, dep4Schema, dep4Path); appender4.init(); - Tuple tuple4 = new VTuple(dep4Schema.size()); + VTuple tuple4 = new VTuple(dep4Schema.size()); for (int i = 0; i < 11; i++) { tuple4.put(new Datum[] { DatumFactory.createInt4(i), DatumFactory.createText("dept_" + i), @@ -182,7 +182,7 @@ public void setUp() throws Exception { Appender appender2 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(job3Meta, job3Schema, job3Path); appender2.init(); - Tuple tuple2 = new VTuple(job3Schema.size()); + VTuple tuple2 = new VTuple(job3Schema.size()); for (int i = 1; i < 4; i++) { int x = 100 + i; tuple2.put(new Datum[] { DatumFactory.createInt4(100 + i), @@ -222,7 +222,7 @@ public void setUp() throws Exception { Appender appender3 = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(emp3Meta, emp3Schema, emp3Path); appender3.init(); - Tuple tuple3 = new VTuple(emp3Schema.size()); + VTuple tuple3 = new VTuple(emp3Schema.size()); for (int i = 1; i < 4; i += 2) { int x = 10 + i; diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestSortExec.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestSortExec.java index f2c2b1a393..3e0b9a746f 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestSortExec.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestSortExec.java @@ -85,7 +85,7 @@ public static void setUp() throws Exception { Appender appender = ((FileStorageManager)StorageManager.getFileStorageManager(conf)) .getAppender(employeeMeta, schema, tablePath); appender.init(); - Tuple tuple = new VTuple(schema.size()); + VTuple tuple = new VTuple(schema.size()); for (int i = 0; i < 100; i++) { tuple.put(new Datum[] { DatumFactory.createInt4(rnd.nextInt(5)), @@ -129,7 +129,7 @@ public final void testNext() throws IOException, PlanningException { Datum curVal; exec.init(); while ((tuple = exec.next()) != null) { - curVal = tuple.get(0); + curVal = tuple.asDatum(0); if (preVal != null) { assertTrue(preVal.lessThanEqual(curVal).asBool()); } @@ -150,9 +150,9 @@ public void testTAJO_946() { schema.addColumn("l_orderkey", Type.INT8); SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema); - Tuple s = new VTuple(1); + VTuple s = new VTuple(1); s.put(0, DatumFactory.createInt8(0)); - Tuple e = new VTuple(1); + VTuple e = new VTuple(1); e.put(0, DatumFactory.createInt8(6000000000l)); TupleRange expected = new TupleRange(sortSpecs, s, e); RangePartitionAlgorithm partitioner diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestTupleSorter.java b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestTupleSorter.java index 9cc477ad76..ea1214e501 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestTupleSorter.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestTupleSorter.java @@ -100,7 +100,7 @@ public final void testSortBench() { Tuple tuple = Iterators.get(iterator, LENGTH / result1.length - 1); StringBuilder builder = new StringBuilder(); for (int keyIndex : keyIndices) { - builder.append(tuple.get(keyIndex).asChars()); + builder.append(tuple.getText(keyIndex)); } result1[i] = builder.toString(); } @@ -117,7 +117,7 @@ public final void testSortBench() { Tuple tuple = Iterators.get(iterator, LENGTH / result2.length - 1); StringBuilder builder = new StringBuilder(); for (int keyIndex : keyIndices) { - builder.append(tuple.get(keyIndex).asChars()); + builder.append(tuple.getText(keyIndex)); } result2[i] = builder.toString(); } diff --git a/tajo-core/src/test/java/org/apache/tajo/engine/util/TestTupleUtil.java b/tajo-core/src/test/java/org/apache/tajo/engine/util/TestTupleUtil.java index b8114e0550..cb40b49680 100644 --- a/tajo-core/src/test/java/org/apache/tajo/engine/util/TestTupleUtil.java +++ b/tajo-core/src/test/java/org/apache/tajo/engine/util/TestTupleUtil.java @@ -52,8 +52,7 @@ public final void testToBytesAndToTuple() { schema.addColumn("col11", Type.INET4); //schema.addColumn("col11", DataType.IPv6); - Tuple tuple = new VTuple(11); - tuple.put(new Datum[] { + Tuple tuple = new VTuple(new Datum[] { DatumFactory.createBool(true), DatumFactory.createBit((byte) 0x99), DatumFactory.createChar('7'), @@ -77,8 +76,8 @@ public final void testToBytesAndToTuple() { @Test public final void testGetPartitions() { - Tuple sTuple = new VTuple(7); - Tuple eTuple = new VTuple(7); + VTuple sTuple = new VTuple(7); + VTuple eTuple = new VTuple(7); Schema schema = new Schema(); @@ -137,10 +136,10 @@ public void testBuildTupleFromPartitionPath() { path = new Path("hdfs://tajo/warehouse/partition_test/key1=123"); tuple = PartitionedTableRewriter.buildTupleFromPartitionPath(schema, path, true); assertNotNull(tuple); - assertEquals(DatumFactory.createInt8(123), tuple.get(0)); + assertEquals(DatumFactory.createInt8(123), tuple.asDatum(0)); tuple = PartitionedTableRewriter.buildTupleFromPartitionPath(schema, path, false); assertNotNull(tuple); - assertEquals(DatumFactory.createInt8(123), tuple.get(0)); + assertEquals(DatumFactory.createInt8(123), tuple.asDatum(0)); path = new Path("hdfs://tajo/warehouse/partition_test/key1=123/part-0000"); // wrong cases; tuple = PartitionedTableRewriter.buildTupleFromPartitionPath(schema, path, true); @@ -151,12 +150,12 @@ public void testBuildTupleFromPartitionPath() { path = new Path("hdfs://tajo/warehouse/partition_test/key1=123/key2=abc"); tuple = PartitionedTableRewriter.buildTupleFromPartitionPath(schema, path, true); assertNotNull(tuple); - assertEquals(DatumFactory.createInt8(123), tuple.get(0)); - assertEquals(DatumFactory.createText("abc"), tuple.get(1)); + assertEquals(DatumFactory.createInt8(123), tuple.asDatum(0)); + assertEquals(DatumFactory.createText("abc"), tuple.asDatum(1)); tuple = PartitionedTableRewriter.buildTupleFromPartitionPath(schema, path, false); assertNotNull(tuple); - assertEquals(DatumFactory.createInt8(123), tuple.get(0)); - assertEquals(DatumFactory.createText("abc"), tuple.get(1)); + assertEquals(DatumFactory.createInt8(123), tuple.asDatum(0)); + assertEquals(DatumFactory.createText("abc"), tuple.asDatum(1)); path = new Path("hdfs://tajo/warehouse/partition_test/key1=123/key2=abc/part-0001"); @@ -165,7 +164,7 @@ public void testBuildTupleFromPartitionPath() { tuple = PartitionedTableRewriter.buildTupleFromPartitionPath(schema, path, false); assertNotNull(tuple); - assertEquals(DatumFactory.createInt8(123), tuple.get(0)); - assertEquals(DatumFactory.createText("abc"), tuple.get(1)); + assertEquals(DatumFactory.createInt8(123), tuple.asDatum(0)); + assertEquals(DatumFactory.createText("abc"), tuple.asDatum(1)); } } diff --git a/tajo-core/src/test/java/org/apache/tajo/master/TestNonForwardQueryResultSystemScanner.java b/tajo-core/src/test/java/org/apache/tajo/master/TestNonForwardQueryResultSystemScanner.java index 01d4ec486e..e1274ad1ba 100644 --- a/tajo-core/src/test/java/org/apache/tajo/master/TestNonForwardQueryResultSystemScanner.java +++ b/tajo-core/src/test/java/org/apache/tajo/master/TestNonForwardQueryResultSystemScanner.java @@ -239,15 +239,15 @@ public void describeTo(Description description) { @Override protected boolean matchesSafely(Tuple item, Description mismatchDescription) { - Datum datum = item.get(fieldId); Object itemValue = null; - - if (datum.type() == Type.TEXT) { - itemValue = datum.asChars(); - } else if (datum.type() == Type.INT4) { - itemValue = datum.asInt4(); - } else if (datum.type() == Type.INT8) { - itemValue = datum.asInt8(); + + Type type = item.type(fieldId); + if (type == Type.TEXT) { + itemValue = item.getText(fieldId); + } else if (type == Type.INT4) { + itemValue = item.getInt4(fieldId); + } else if (type == Type.INT8) { + itemValue = item.getInt8(fieldId); } if (itemValue != null && matcher.matches(itemValue)) { diff --git a/tajo-core/src/test/java/org/apache/tajo/storage/TestRowFile.java b/tajo-core/src/test/java/org/apache/tajo/storage/TestRowFile.java index 859a1f2f24..6afcb2defb 100644 --- a/tajo-core/src/test/java/org/apache/tajo/storage/TestRowFile.java +++ b/tajo-core/src/test/java/org/apache/tajo/storage/TestRowFile.java @@ -128,8 +128,8 @@ public void test() throws IOException { scanner = new RowFile.RowFileScanner(conf, schema, meta, fragment); scanner.init(); while ((tuple=scanner.next()) != null) { - if (!idSet.remove(tuple.get(0).asInt4())) { - System.out.println("duplicated! " + tuple.get(0).asInt4()); + if (!idSet.remove(tuple.getInt4(0))) { + System.out.println("duplicated! " + tuple.getInt4(0)); } tupleCnt++; } diff --git a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/MetaDataTuple.java b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/MetaDataTuple.java index 30fc9eec36..a4594d6a99 100644 --- a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/MetaDataTuple.java +++ b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/MetaDataTuple.java @@ -18,12 +18,14 @@ package org.apache.tajo.jdbc; +import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.IntervalDatum; import org.apache.tajo.datum.NullDatum; import org.apache.tajo.datum.ProtobufDatum; import org.apache.tajo.exception.UnsupportedException; import org.apache.tajo.storage.Tuple; +import org.apache.tajo.util.datetime.TimeMeta; import java.util.ArrayList; import java.util.List; @@ -49,13 +51,13 @@ public boolean contains(int fieldid) { } @Override - public boolean isNull(int fieldid) { - return values.get(fieldid) == null || values.get(fieldid).isNull(); + public boolean isBlank(int fieldid) { + return values.get(fieldid) == null; } @Override - public boolean isNotNull(int fieldid) { - return !isNull(fieldid); + public boolean isBlankOrNull(int fieldid) { + return values.get(fieldid) == null || values.get(fieldid).isNull(); } @Override @@ -69,22 +71,17 @@ public void put(int fieldId, Datum value) { } @Override - public void put(int fieldId, Datum[] values) { - throw new UnsupportedException("put"); - } - - @Override - public void put(int fieldId, Tuple tuple) { - throw new UnsupportedException("put"); + public TajoDataTypes.Type type(int fieldId) { + return values.get(fieldId).type(); } @Override - public void put(Datum[] values) { - throw new UnsupportedException("put"); + public int size(int fieldId) { + return values.get(fieldId).size(); } @Override - public Datum get(int fieldId) { + public Datum asDatum(int fieldId) { return values.get(fieldId); } @@ -100,17 +97,17 @@ public long getOffset() { @Override public boolean getBool(int fieldId) { - throw new UnsupportedException("getBool"); + return values.get(fieldId).asBool(); } @Override public byte getByte(int fieldId) { - throw new UnsupportedException("getByte"); + return values.get(fieldId).asByte(); } @Override public char getChar(int fieldId) { - throw new UnsupportedException("getChar"); + return values.get(fieldId).asChar(); } @Override @@ -118,34 +115,44 @@ public char getChar(int fieldId) { throw new UnsupportedException("BlobDatum"); } + @Override + public byte[] getTextBytes(int fieldId) { + return values.get(fieldId).asTextBytes(); + } + @Override public short getInt2(int fieldId) { - return (short)Integer.parseInt(values.get(fieldId).toString()); + return values.get(fieldId).asInt2(); } @Override public int getInt4(int fieldId) { - return Integer.parseInt(values.get(fieldId).toString()); + return values.get(fieldId).asInt4(); } @Override public long getInt8(int fieldId) { - return Long.parseLong(values.get(fieldId).toString()); + return values.get(fieldId).asInt8(); } @Override public float getFloat4(int fieldId) { - return Float.parseFloat(values.get(fieldId).toString()); + return values.get(fieldId).asFloat4(); } @Override public double getFloat8(int fieldId) { - return Float.parseFloat(values.get(fieldId).toString()); + return values.get(fieldId).asFloat8(); } @Override public String getText(int fieldId) { - return values.get(fieldId).toString(); + return values.get(fieldId).asChars(); + } + + @Override + public TimeMeta getTimeDate(int fieldId) { + return values.get(fieldId).asTimeMeta(); } @Override diff --git a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoMetaDataResultSet.java b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoMetaDataResultSet.java index 8f5bed682a..eb3595faec 100644 --- a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoMetaDataResultSet.java +++ b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoMetaDataResultSet.java @@ -20,7 +20,6 @@ import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes.Type; -import org.apache.tajo.datum.Datum; import org.apache.tajo.storage.Tuple; import java.io.IOException; @@ -70,20 +69,11 @@ public void close() throws SQLException { @Override public String getString(int fieldId) throws SQLException { - Datum datum = cur.get(fieldId - 1); - if(datum == null) { - return null; - } - - return datum.asChars(); + return cur.getText(fieldId - 1); } @Override public String getString(String name) throws SQLException { - Datum datum = cur.get(findColumn(name)); - if(datum == null) { - return null; - } - return datum.asChars(); + return cur.getText(findColumn(name)); } } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/ExprAnnotator.java b/tajo-plan/src/main/java/org/apache/tajo/plan/ExprAnnotator.java index 0c5a01263d..1e25482d67 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/ExprAnnotator.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/ExprAnnotator.java @@ -896,7 +896,7 @@ public EvalNode visitTimeLiteral(Context ctx, Stack stack, TimeLiteral exp time = DateTimeUtil.toTime(times[0], times[1], times[2], 0); } TimeDatum timeDatum = new TimeDatum(time); - TimeMeta tm = timeDatum.toTimeMeta(); + TimeMeta tm = timeDatum.asTimeMeta(); if (ctx.queryContext.containsKey(SessionVars.TIMEZONE)) { TimeZone tz = TimeZone.getTimeZone(ctx.queryContext.get(SessionVars.TIMEZONE)); diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/FieldEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/FieldEval.java index 870970b538..2b301b6465 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/FieldEval.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/FieldEval.java @@ -58,7 +58,7 @@ public EvalNode bind(EvalContext evalContext, Schema schema) { @SuppressWarnings("unchecked") public Datum eval(Tuple tuple) { super.eval(tuple); - return tuple.get(fieldId); + return tuple.asDatum(fieldId); } @Override diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/PythonScriptEngine.java b/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/PythonScriptEngine.java index 0da30f14b4..766b2c0bf1 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/PythonScriptEngine.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/PythonScriptEngine.java @@ -358,7 +358,7 @@ public Datum eval(Tuple input) { } Datum result; try { - result = outputHandler.getNext().get(0); + result = outputHandler.getNext().asDatum(0); } catch (Exception e) { throw new RuntimeException("Problem getting output", e); } diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/function/stream/CSVLineSerializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/function/stream/CSVLineSerializer.java index e1c7375f50..f4f510335f 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/function/stream/CSVLineSerializer.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/function/stream/CSVLineSerializer.java @@ -56,7 +56,7 @@ public int serialize(OutputStream out, Tuple input) throws IOException { int writtenBytes = 0; for (int i = 0; i < columnNum; i++) { - Datum datum = input.get(i); + Datum datum = input.asDatum(i); String typeStr; if (datum.type() == TajoDataTypes.Type.ANY) { typeStr = getTypeString(((AnyDatum)datum).getActual()); diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/function/stream/TextFieldSerializerDeserializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/function/stream/TextFieldSerializerDeserializer.java index cd9518b127..2f989636ff 100644 --- a/tajo-plan/src/main/java/org/apache/tajo/plan/function/stream/TextFieldSerializerDeserializer.java +++ b/tajo-plan/src/main/java/org/apache/tajo/plan/function/stream/TextFieldSerializerDeserializer.java @@ -107,7 +107,7 @@ public int serialize(OutputStream out, Datum datum, Column col, int columnIndex, break; case TIME: if (hasTimezone) { - bytes = ((TimeDatum) datum).asChars(timezone, true).getBytes(); + bytes = ((TimeDatum) datum).toString(timezone, true).getBytes(); } else { bytes = datum.asTextBytes(); } @@ -116,7 +116,7 @@ public int serialize(OutputStream out, Datum datum, Column col, int columnIndex, break; case TIMESTAMP: if (hasTimezone) { - bytes = ((TimestampDatum) datum).asChars(timezone, true).getBytes(); + bytes = ((TimestampDatum) datum).toString(timezone, true).getBytes(); } else { bytes = datum.asTextBytes(); } diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BaseTupleComparator.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BaseTupleComparator.java index cba9ee0572..b25b2fd391 100644 --- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BaseTupleComparator.java +++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BaseTupleComparator.java @@ -110,8 +110,8 @@ public boolean isAscendingFirstKey() { @Override public int compare(Tuple tuple1, Tuple tuple2) { for (int i = 0; i < sortKeyIds.length; i++) { - left = tuple1.get(sortKeyIds[i]); - right = tuple2.get(sortKeyIds[i]); + left = tuple1.asDatum(sortKeyIds[i]); + right = tuple2.asDatum(sortKeyIds[i]); if (left.isNull() || right.isNull()) { if (!left.equals(right)) { diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BinarySerializerDeserializer.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BinarySerializerDeserializer.java index 00112e7659..bf186cdd93 100644 --- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BinarySerializerDeserializer.java +++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BinarySerializerDeserializer.java @@ -21,6 +21,7 @@ import com.google.common.base.Preconditions; import com.google.protobuf.Message; import org.apache.tajo.catalog.Column; +import org.apache.tajo.catalog.Schema; import org.apache.tajo.datum.*; import org.apache.tajo.util.Bytes; @@ -32,41 +33,49 @@ public class BinarySerializerDeserializer implements SerializerDeserializer { static final byte[] INVALID_UTF__SINGLE_BYTE = {(byte) Integer.parseInt("10111111", 2)}; + private Schema schema; + @Override - public int serialize(Column col, Datum datum, OutputStream out, byte[] nullCharacters) + public void init(Schema schema) { + this.schema = schema; + } + + @Override + public int serialize(int index, Tuple tuple, OutputStream out, byte[] nullCharacters) throws IOException { - byte[] bytes; - int length = 0; - if (datum == null || datum instanceof NullDatum) { + if (tuple.isBlankOrNull(index)) { return 0; } - switch (col.getDataType().getType()) { + byte[] bytes; + int length = 0; + Column column = schema.getColumn(index); + switch (column.getDataType().getType()) { case BOOLEAN: case BIT: case CHAR: - bytes = datum.asByteArray(); + bytes = tuple.getBytes(index); length = bytes.length; out.write(bytes, 0, length); break; case INT2: - length = writeShort(out, datum.asInt2()); + length = writeShort(out, tuple.getInt2(index)); break; case INT4: - length = writeVLong(out, datum.asInt4()); + length = writeVLong(out, tuple.getInt4(index)); break; case INT8: - length = writeVLong(out, datum.asInt8()); + length = writeVLong(out, tuple.getInt8(index)); break; case FLOAT4: - length = writeFloat(out, datum.asFloat4()); + length = writeFloat(out, tuple.getFloat4(index)); break; case FLOAT8: - length = writeDouble(out, datum.asFloat8()); + length = writeDouble(out, tuple.getFloat8(index)); break; case TEXT: { - bytes = datum.asTextBytes(); - length = datum.size(); + bytes = tuple.getTextBytes(index); + length = bytes.length; if (length == 0) { bytes = INVALID_UTF__SINGLE_BYTE; length = INVALID_UTF__SINGLE_BYTE.length; @@ -77,12 +86,12 @@ public int serialize(Column col, Datum datum, OutputStream out, byte[] nullChara case BLOB: case INET4: case INET6: - bytes = datum.asByteArray(); + bytes = tuple.getBytes(index); length = bytes.length; out.write(bytes, 0, length); break; case PROTOBUF: - ProtobufDatum protobufDatum = (ProtobufDatum) datum; + ProtobufDatum protobufDatum = (ProtobufDatum) tuple.getProtobufDatum(index); bytes = protobufDatum.asByteArray(); length = bytes.length; out.write(bytes, 0, length); @@ -96,11 +105,12 @@ public int serialize(Column col, Datum datum, OutputStream out, byte[] nullChara } @Override - public Datum deserialize(Column col, byte[] bytes, int offset, int length, byte[] nullCharacters) throws IOException { + public Datum deserialize(int index, byte[] bytes, int offset, int length, byte[] nullCharacters) throws IOException { if (length == 0) return NullDatum.get(); Datum datum; - switch (col.getDataType().getType()) { + Column column = schema.getColumn(index); + switch (column.getDataType().getType()) { case BOOLEAN: datum = DatumFactory.createBool(bytes[offset]); break; @@ -140,7 +150,7 @@ public Datum deserialize(Column col, byte[] bytes, int offset, int length, byte[ break; } case PROTOBUF: { - ProtobufDatumFactory factory = ProtobufDatumFactory.get(col.getDataType().getCode()); + ProtobufDatumFactory factory = ProtobufDatumFactory.get(column.getDataType().getCode()); Message.Builder builder = factory.newBuilder(); builder.mergeFrom(bytes, offset, length); datum = factory.createDatum(builder); diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/FrameTuple.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/FrameTuple.java index 8b7e2e06a8..77da2d8a05 100644 --- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/FrameTuple.java +++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/FrameTuple.java @@ -22,10 +22,12 @@ package org.apache.tajo.storage; import com.google.common.base.Preconditions; +import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.IntervalDatum; import org.apache.tajo.datum.ProtobufDatum; import org.apache.tajo.exception.UnsupportedException; +import org.apache.tajo.util.datetime.TimeMeta; /** * An instance of FrameTuple is an immutable tuple. @@ -70,13 +72,14 @@ public boolean contains(int fieldId) { } @Override - public boolean isNull(int fieldid) { - return get(fieldid).isNull(); + public boolean isBlank(int fieldid) { + return asDatum(fieldid) == null; } @Override - public boolean isNotNull(int fieldid) { - return !isNull(fieldid); + public boolean isBlankOrNull(int fieldid) { + Datum datum = asDatum(fieldid); + return datum == null || datum.isNull(); } @Override @@ -90,13 +93,13 @@ public void put(int fieldId, Datum value) { } @Override - public void put(int fieldId, Datum[] values) { - throw new UnsupportedException(); + public TajoDataTypes.Type type(int fieldId) { + return null; } @Override - public void put(int fieldId, Tuple tuple) { - throw new UnsupportedException(); + public int size(int fieldId) { + return 0; } @Override @@ -110,85 +113,90 @@ public long getOffset() { } @Override - public void put(Datum [] values) { - throw new UnsupportedException(); - } - - @Override - public Datum get(int fieldId) { + public Datum asDatum(int fieldId) { Preconditions.checkArgument(fieldId < size, "Out of field access: " + fieldId); if (fieldId < leftSize) { - return left.get(fieldId); + return left.asDatum(fieldId); } else { - return right.get(fieldId - leftSize); + return right.asDatum(fieldId - leftSize); } } @Override public boolean getBool(int fieldId) { - return get(fieldId).asBool(); + return asDatum(fieldId).asBool(); } @Override public byte getByte(int fieldId) { - return get(fieldId).asByte(); + return asDatum(fieldId).asByte(); } @Override public char getChar(int fieldId) { - return get(fieldId).asChar(); + return asDatum(fieldId).asChar(); } @Override public byte [] getBytes(int fieldId) { - return get(fieldId).asByteArray(); + return asDatum(fieldId).asByteArray(); + } + + @Override + public byte[] getTextBytes(int fieldId) { + return asDatum(fieldId).asTextBytes(); } @Override public short getInt2(int fieldId) { - return get(fieldId).asInt2(); + return asDatum(fieldId).asInt2(); } @Override public int getInt4(int fieldId) { - return get(fieldId).asInt4(); + return asDatum(fieldId).asInt4(); } @Override public long getInt8(int fieldId) { - return get(fieldId).asInt8(); + return asDatum(fieldId).asInt8(); } @Override public float getFloat4(int fieldId) { - return get(fieldId).asFloat4(); + return asDatum(fieldId).asFloat4(); } @Override public double getFloat8(int fieldId) { - return get(fieldId).asFloat8(); + return asDatum(fieldId).asFloat8(); } @Override public String getText(int fieldId) { - return get(fieldId).asChars(); + return asDatum(fieldId).asChars(); + } + + @Override + public TimeMeta getTimeDate(int fieldId) { + return null; } @Override public ProtobufDatum getProtobufDatum(int fieldId) { - return (ProtobufDatum) get(fieldId); + return (ProtobufDatum) asDatum(fieldId); } @Override public IntervalDatum getInterval(int fieldId) { - return (IntervalDatum) get(fieldId); + return (IntervalDatum) asDatum(fieldId); } @Override public char [] getUnicodeChars(int fieldId) { - return get(fieldId).asUnicodeChars(); + return asDatum(fieldId).asUnicodeChars(); } @Override @@ -216,7 +224,7 @@ public String toString() { } str.append(i) .append("=>") - .append(get(i)); + .append(asDatum(i)); } } str.append(")"); diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/LazyTuple.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/LazyTuple.java index bfbe478a02..564e03d85b 100644 --- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/LazyTuple.java +++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/LazyTuple.java @@ -19,11 +19,13 @@ package org.apache.tajo.storage; import org.apache.tajo.catalog.Schema; +import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.IntervalDatum; import org.apache.tajo.datum.NullDatum; import org.apache.tajo.datum.ProtobufDatum; import org.apache.tajo.exception.UnsupportedException; +import org.apache.tajo.util.datetime.TimeMeta; import java.util.Arrays; @@ -36,7 +38,7 @@ public class LazyTuple implements Tuple, Cloneable { private SerializerDeserializer serializeDeserialize; public LazyTuple(Schema schema, byte[][] textBytes, long offset) { - this(schema, textBytes, offset, NullDatum.get().asTextBytes(), new TextSerializerDeserializer()); + this(schema, textBytes, offset, NullDatum.get().asTextBytes(), new TextSerializerDeserializer(schema)); } public LazyTuple(Schema schema, byte[][] textBytes, long offset, byte[] nullBytes, SerializerDeserializer serde) { @@ -68,13 +70,14 @@ public boolean contains(int fieldid) { } @Override - public boolean isNull(int fieldid) { - return get(fieldid).isNull(); + public boolean isBlank(int fieldid) { + return get(fieldid) == null; } @Override - public boolean isNotNull(int fieldid) { - return !isNull(fieldid); + public boolean isBlankOrNull(int fieldid) { + Datum datum = get(fieldid); + return datum == null || datum.isNull(); } @Override @@ -95,31 +98,23 @@ public void put(int fieldId, Datum value) { } @Override - public void put(int fieldId, Datum[] values) { - for (int i = fieldId, j = 0; j < values.length; i++, j++) { - this.values[i] = values[j]; - } - this.textBytes = new byte[values.length][]; + public Datum asDatum(int fieldId) { + return get(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); - textBytes[i] = null; - } + public TajoDataTypes.Type type(int fieldId) { + return get(fieldId).type(); } @Override - public void put(Datum[] values) { - System.arraycopy(values, 0, this.values, 0, size()); - this.textBytes = new byte[values.length][]; + public int size(int fieldId) { + return get(fieldId).size(); } ////////////////////////////////////////////////////// // Getter ////////////////////////////////////////////////////// - @Override public Datum get(int fieldId) { if (values[fieldId] != null) return values[fieldId]; @@ -127,7 +122,7 @@ else if (textBytes.length <= fieldId) { values[fieldId] = NullDatum.get(); // split error. (col : 3, separator: ',', row text: "a,") } else if (textBytes[fieldId] != null) { try { - values[fieldId] = serializeDeserialize.deserialize(schema.getColumn(fieldId), + values[fieldId] = serializeDeserialize.deserialize(fieldId, textBytes[fieldId], 0, textBytes[fieldId].length, nullBytes); } catch (Exception e) { values[fieldId] = NullDatum.get(); @@ -169,6 +164,11 @@ public char getChar(int fieldId) { return get(fieldId).asByteArray(); } + @Override + public byte[] getTextBytes(int fieldId) { + return get(fieldId).asTextBytes(); + } + @Override public short getInt2(int fieldId) { return get(fieldId).asInt2(); @@ -199,6 +199,11 @@ public String getText(int fieldId) { return get(fieldId).asChars(); } + @Override + public TimeMeta getTimeDate(int fieldId) { + return get(fieldId).asTimeMeta(); + } + @Override public ProtobufDatum getProtobufDatum(int fieldId) { throw new UnsupportedException(); @@ -214,7 +219,9 @@ public char[] getUnicodeChars(int fieldId) { return get(fieldId).asUnicodeChars(); } + @Override public String toString() { + // todo this changes internal state, which causes funny result in GUI debugging boolean first = true; StringBuilder str = new StringBuilder(); str.append("("); diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/RowStoreUtil.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/RowStoreUtil.java index 33db7982ac..eebd6715f4 100644 --- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/RowStoreUtil.java +++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/RowStoreUtil.java @@ -43,10 +43,10 @@ public static int[] getTargetIds(Schema inSchema, Schema outSchema) { return targetIds; } - public static Tuple project(Tuple in, Tuple out, int[] targetIds) { + public static Tuple project(Tuple in, VTuple out, int[] targetIds) { out.clear(); for (int idx = 0; idx < targetIds.length; idx++) { - out.put(idx, in.get(targetIds[idx])); + out.put(idx, in.asDatum(targetIds[idx])); } return out; } @@ -75,7 +75,7 @@ private RowStoreDecoder(Schema schema) { 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; @@ -187,7 +187,7 @@ public byte[] toBytes(Tuple tuple) { 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; } @@ -198,57 +198,57 @@ public byte[] toBytes(Tuple tuple) { nullFlags.set(i); break; case BOOLEAN: - bb.put(tuple.get(i).asByte()); + bb.put(tuple.getByte(i)); break; case BIT: - bb.put(tuple.get(i).asByte()); + bb.put(tuple.getByte(i)); break; case CHAR: - bb.put(tuple.get(i).asByte()); + bb.put(tuple.getByte(i)); break; case INT2: - bb.putShort(tuple.get(i).asInt2()); + bb.putShort(tuple.getInt2(i)); break; case INT4: - bb.putInt(tuple.get(i).asInt4()); + bb.putInt(tuple.getInt4(i)); break; case INT8: - bb.putLong(tuple.get(i).asInt8()); + bb.putLong(tuple.getInt8(i)); break; case FLOAT4: - bb.putFloat(tuple.get(i).asFloat4()); + bb.putFloat(tuple.getFloat4(i)); break; case FLOAT8: - bb.putDouble(tuple.get(i).asFloat8()); + bb.putDouble(tuple.getFloat8(i)); 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()); + 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()); + bb.put(tuple.getBytes(i)); break; default: throw new RuntimeException(new UnknownDataTypeException(col.getDataType().getType().name())); @@ -273,7 +273,7 @@ private int estimateTupleDataSize(Tuple tuple) { Column col; for (int i = 0; i < schema.size(); i++) { - if (tuple.isNull(i)) { + if (tuple.isBlankOrNull(i)) { continue; } @@ -303,11 +303,11 @@ private int estimateTupleDataSize(Tuple tuple) { break; case TEXT: case BLOB: - size += (4 + tuple.get(i).asByteArray().length); + size += (4 + tuple.getBytes(i).length); break; case INET4: case INET6: - size += tuple.get(i).asByteArray().length; + size += tuple.getBytes(i).length; break; default: throw new RuntimeException(new UnknownDataTypeException(col.getDataType().getType().name())); @@ -328,7 +328,7 @@ public static void convert(Tuple tuple, RowWriter writer) { writer.startRow(); for (int i = 0; i < writer.dataTypes().length; i++) { - if (tuple.isNull(i)) { + if (tuple.isBlankOrNull(i)) { writer.skipField(); continue; } diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/SerializerDeserializer.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/SerializerDeserializer.java index 564a9f593a..44cd214dd7 100644 --- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/SerializerDeserializer.java +++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/SerializerDeserializer.java @@ -19,6 +19,7 @@ package org.apache.tajo.storage; import org.apache.tajo.catalog.Column; +import org.apache.tajo.catalog.Schema; import org.apache.tajo.datum.Datum; import java.io.IOException; @@ -27,8 +28,10 @@ @Deprecated public interface SerializerDeserializer { - public int serialize(Column col, Datum datum, OutputStream out, byte[] nullCharacters) throws IOException; + public void init(Schema schema); - public Datum deserialize(Column col, byte[] bytes, int offset, int length, byte[] nullCharacters) throws IOException; + public int serialize(int index, Tuple tuple, OutputStream out, byte[] nullCharacters) throws IOException; + + public Datum deserialize(int index, byte[] bytes, int offset, int length, byte[] nullCharacters) throws IOException; } diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TableStatistics.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TableStatistics.java index a2c08deca8..c101b0bfd7 100644 --- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TableStatistics.java +++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TableStatistics.java @@ -20,13 +20,13 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.tajo.catalog.Column; import org.apache.tajo.catalog.Schema; import org.apache.tajo.catalog.statistics.ColumnStats; import org.apache.tajo.catalog.statistics.TableStats; import org.apache.tajo.common.TajoDataTypes.DataType; import org.apache.tajo.common.TajoDataTypes.Type; import org.apache.tajo.datum.Datum; -import org.apache.tajo.datum.NullDatum; /** * This class is not thread-safe. @@ -34,8 +34,8 @@ public class TableStatistics { private static final Log LOG = LogFactory.getLog(TableStatistics.class); private Schema schema; - private Tuple minValues; - private Tuple maxValues; + private VTuple minValues; + private VTuple maxValues; private long [] numNulls; private long numRows = 0; private long numBytes = 0; @@ -81,12 +81,17 @@ public long getNumBytes() { return this.numBytes; } - public void analyzeField(int idx, Datum datum) { - if (datum instanceof NullDatum) { + public void analyzeNull(int idx) { + numNulls[idx]++; + } + + public void analyzeField(int idx, Tuple tuple) { + if (tuple.isBlankOrNull(idx)) { numNulls[idx]++; return; } + Datum datum = tuple.asDatum(idx); if (comparable[idx]) { if (!maxValues.contains(idx) || maxValues.get(idx).compareTo(datum) < 0) { @@ -102,21 +107,21 @@ public void analyzeField(int idx, Datum datum) { public TableStats getTableStat() { TableStats stat = new TableStats(); - ColumnStats columnStats; for (int i = 0; i < schema.size(); i++) { - columnStats = new ColumnStats(schema.getColumn(i)); + Column column = schema.getColumn(i); + ColumnStats columnStats = new ColumnStats(column); columnStats.setNumNulls(numNulls[i]); - if (minValues.get(i) == null || schema.getColumn(i).getDataType().getType() == minValues.get(i).type()) { + if (minValues.isBlank(i) || column.getDataType().getType() == minValues.type(i)) { columnStats.setMinValue(minValues.get(i)); } else { - LOG.warn("Wrong statistics column type (" + minValues.get(i).type() + - ", expected=" + schema.getColumn(i).getDataType().getType() + ")"); + LOG.warn("Wrong statistics column type (" + minValues.type(i) + + ", expected=" + column.getDataType().getType() + ")"); } - if (maxValues.get(i) == null || schema.getColumn(i).getDataType().getType() == maxValues.get(i).type()) { + if (minValues.isBlank(i) || column.getDataType().getType() == maxValues.type(i)) { columnStats.setMaxValue(maxValues.get(i)); } else { - LOG.warn("Wrong statistics column type (" + maxValues.get(i).type() + - ", expected=" + schema.getColumn(i).getDataType().getType() + ")"); + LOG.warn("Wrong statistics column type (" + maxValues.type(i) + + ", expected=" + column.getDataType().getType() + ")"); } stat.addColumnStat(columnStats); } diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TextSerializerDeserializer.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TextSerializerDeserializer.java index ab8816bc28..2b9ebb494e 100644 --- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TextSerializerDeserializer.java +++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TextSerializerDeserializer.java @@ -20,10 +20,9 @@ import com.google.protobuf.Message; import org.apache.commons.codec.binary.Base64; -import org.apache.tajo.TajoConstants; import org.apache.tajo.catalog.Column; +import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes; -import org.apache.tajo.conf.TajoConf; import org.apache.tajo.datum.*; import org.apache.tajo.datum.protobuf.ProtobufJsonFormat; import org.apache.tajo.util.Bytes; @@ -40,34 +39,43 @@ public class TextSerializerDeserializer implements SerializerDeserializer { public static final byte[] falseBytes = "false".getBytes(); private ProtobufJsonFormat protobufJsonFormat = ProtobufJsonFormat.getInstance(); + public TextSerializerDeserializer() {} + + public TextSerializerDeserializer(Schema schema) { + init(schema); + } + + private Schema schema; + @Override - public int serialize(Column col, Datum datum, OutputStream out, byte[] nullCharacters) throws IOException { + public void init(Schema schema) { + this.schema = schema; + } - byte[] bytes; - int length = 0; - TajoDataTypes.DataType dataType = col.getDataType(); - - if (datum == null || datum instanceof NullDatum) { - switch (dataType.getType()) { - case CHAR: - case TEXT: - length = nullCharacters.length; - out.write(nullCharacters); - break; - default: - break; + @Override + public int serialize(int index, Tuple tuple, OutputStream out, byte[] nullCharacters) + throws IOException { + + Column col = schema.getColumn(index); + TajoDataTypes.Type type = col.getDataType().getType(); + if (tuple.isBlankOrNull(index)) { + if (type == TajoDataTypes.Type.CHAR || type == TajoDataTypes.Type.TEXT) { + out.write(nullCharacters); + return nullCharacters.length; } - return length; + return 0; } - switch (dataType.getType()) { + byte[] bytes; + int length = 0; + switch (type) { case BOOLEAN: - out.write(datum.asBool() ? trueBytes : falseBytes); + out.write(tuple.getBool(index) ? trueBytes : falseBytes); length = trueBytes.length; break; case CHAR: - byte[] pad = new byte[dataType.getLength() - datum.size()]; - bytes = datum.asTextBytes(); + byte[] pad = new byte[col.getDataType().getLength() - tuple.size(index)]; + bytes = tuple.getTextBytes(index); out.write(bytes); out.write(pad); length = bytes.length + pad.length; @@ -82,28 +90,28 @@ public int serialize(Column col, Datum datum, OutputStream out, byte[] nullChara case INET4: case DATE: case INTERVAL: - bytes = datum.asTextBytes(); + bytes = tuple.getTextBytes(index); length = bytes.length; out.write(bytes); break; case TIME: - bytes = ((TimeDatum)datum).asChars(TimeZone.getDefault(), true).getBytes(); + bytes = TimeDatum.asChars(tuple.getTimeDate(index), TimeZone.getDefault(), true).getBytes(); length = bytes.length; out.write(bytes); break; case TIMESTAMP: - bytes = ((TimestampDatum)datum).asChars(TimeZone.getDefault(), true).getBytes(); + bytes = TimestampDatum.asChars(tuple.getTimeDate(index), TimeZone.getDefault(), true).getBytes(); length = bytes.length; out.write(bytes); break; case INET6: case BLOB: - bytes = Base64.encodeBase64(datum.asByteArray(), false); + bytes = Base64.encodeBase64(tuple.getBytes(index), false); length = bytes.length; out.write(bytes, 0, length); break; case PROTOBUF: - ProtobufDatum protobuf = (ProtobufDatum) datum; + ProtobufDatum protobuf = (ProtobufDatum) tuple.getProtobufDatum(index); byte[] protoBytes = protobufJsonFormat.printToString(protobuf.get()).getBytes(); length = protoBytes.length; out.write(protoBytes, 0, protoBytes.length); @@ -116,10 +124,13 @@ public int serialize(Column col, Datum datum, OutputStream out, byte[] nullChara } @Override - public Datum deserialize(Column col, byte[] bytes, int offset, int length, byte[] nullCharacters) throws IOException { + public Datum deserialize(int index, byte[] bytes, int offset, int length, byte[] nullCharacters) throws IOException { + + Column col = schema.getColumn(index); + TajoDataTypes.Type type = col.getDataType().getType(); Datum datum; - switch (col.getDataType().getType()) { + switch (type) { case BOOLEAN: datum = isNull(bytes, offset, length, nullCharacters) ? NullDatum.get() : DatumFactory.createBool(bytes[offset] == 't' || bytes[offset] == 'T'); diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TupleRange.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TupleRange.java index 043409a50c..a090803f20 100644 --- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TupleRange.java +++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TupleRange.java @@ -28,11 +28,11 @@ * It represents a pair of start and end tuples. */ public class TupleRange implements Comparable, Cloneable { - private Tuple start; - private Tuple end; + private VTuple start; + private VTuple end; private final TupleComparator comp; - public TupleRange(final SortSpec[] sortSpecs, final Tuple start, final Tuple end) { + public TupleRange(final SortSpec[] sortSpecs, final VTuple start, final VTuple end) { this.comp = new BaseTupleComparator(sortSpecsToSchema(sortSpecs), sortSpecs); // if there is only one value, start == end this.start = start; @@ -48,19 +48,19 @@ public static Schema sortSpecsToSchema(SortSpec[] sortSpecs) { return schema; } - public void setStart(Tuple tuple) { + public void setStart(VTuple tuple) { this.start = tuple; } - public final Tuple getStart() { + public final VTuple getStart() { return this.start; } - public void setEnd(Tuple tuple) { + public void setEnd(VTuple tuple) { this.end = tuple; } - public final Tuple getEnd() { + public final VTuple getEnd() { return this.end; } diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/tuple/offheap/HeapTuple.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/tuple/offheap/HeapTuple.java index 33f9f1cf22..ec73f397da 100644 --- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/tuple/offheap/HeapTuple.java +++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/tuple/offheap/HeapTuple.java @@ -21,6 +21,7 @@ import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.Message; +import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.datum.*; import org.apache.tajo.exception.UnsupportedException; import org.apache.tajo.storage.Tuple; @@ -29,6 +30,7 @@ import org.apache.tajo.util.StringUtils; import org.apache.tajo.util.UnsafeUtil; +import org.apache.tajo.util.datetime.TimeMeta; import sun.misc.Unsafe; import java.nio.ByteBuffer; @@ -53,6 +55,16 @@ public int size() { return data.length; } + @Override + public TajoDataTypes.Type type(int fieldId) { + return types[fieldId].getType(); + } + + @Override + public int size(int fieldId) { + return UNSAFE.getInt(data, BASE_OFFSET + checkNullAndGetOffset(fieldId)); + } + public ByteBuffer nioBuffer() { return ByteBuffer.wrap(data); } @@ -75,13 +87,13 @@ public boolean contains(int fieldid) { } @Override - public boolean isNull(int fieldid) { + public boolean isBlank(int fieldid) { return getFieldOffset(fieldid) == OffHeapRowBlock.NULL_FIELD_OFFSET; } @Override - public boolean isNotNull(int fieldid) { - return getFieldOffset(fieldid) > OffHeapRowBlock.NULL_FIELD_OFFSET; + public boolean isBlankOrNull(int fieldid) { + return getFieldOffset(fieldid) == OffHeapRowBlock.NULL_FIELD_OFFSET; } @Override @@ -95,23 +107,8 @@ public void put(int fieldId, Datum value) { } @Override - public void put(int fieldId, Datum[] values) { - throw new UnsupportedException("UnSafeTuple does not support put(int, Datum [])."); - } - - @Override - public void put(int fieldId, Tuple tuple) { - throw new UnsupportedException("UnSafeTuple does not support put(int, Tuple)."); - } - - @Override - public void put(Datum[] values) { - throw new UnsupportedException("UnSafeTuple does not support put(Datum [])."); - } - - @Override - public Datum get(int fieldId) { - if (isNull(fieldId)) { + public Datum asDatum(int fieldId) { + if (isBlankOrNull(fieldId)) { return NullDatum.get(); } @@ -183,6 +180,11 @@ public byte[] getBytes(int fieldId) { return bytes; } + @Override + public byte[] getTextBytes(int fieldId) { + return getText(fieldId).getBytes(); + } + @Override public short getInt2(int fieldId) { return UNSAFE.getShort(data, BASE_OFFSET + checkNullAndGetOffset(fieldId)); @@ -213,6 +215,11 @@ public String getText(int fieldId) { return new String(getBytes(fieldId)); } + @Override + public TimeMeta getTimeDate(int fieldId) { + return asDatum(fieldId).asTimeMeta(); + } + public IntervalDatum getInterval(int fieldId) { long pos = checkNullAndGetOffset(fieldId); int months = UNSAFE.getInt(data, BASE_OFFSET + pos); @@ -257,7 +264,7 @@ public Datum[] getValues() { Datum [] datums = new Datum[size()]; for (int i = 0; i < size(); i++) { if (contains(i)) { - datums[i] = get(i); + datums[i] = asDatum(i); } else { datums[i] = NullDatum.get(); } diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/tuple/offheap/UnSafeTuple.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/tuple/offheap/UnSafeTuple.java index b742e6d8e8..a45ca36a45 100644 --- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/tuple/offheap/UnSafeTuple.java +++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/tuple/offheap/UnSafeTuple.java @@ -22,6 +22,7 @@ import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.Message; +import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.datum.*; import org.apache.tajo.exception.UnsupportedException; import org.apache.tajo.storage.Tuple; @@ -30,6 +31,7 @@ import org.apache.tajo.util.StringUtils; import org.apache.tajo.util.UnsafeUtil; +import org.apache.tajo.util.datetime.TimeMeta; import sun.misc.Unsafe; import sun.nio.ch.DirectBuffer; @@ -63,6 +65,16 @@ public int size() { return types.length; } + @Override + public TajoDataTypes.Type type(int fieldId) { + return types[fieldId].getType(); + } + + @Override + public int size(int fieldId) { + return UNSAFE.getInt(getFieldAddr(fieldId)); + } + public ByteBuffer nioBuffer() { return ((ByteBuffer)((ByteBuffer)bb).duplicate().position(relativePos).limit(relativePos + length)).slice(); } @@ -105,13 +117,13 @@ public boolean contains(int fieldid) { } @Override - public boolean isNull(int fieldid) { + public boolean isBlank(int fieldid) { return getFieldOffset(fieldid) == OffHeapRowBlock.NULL_FIELD_OFFSET; } @Override - public boolean isNotNull(int fieldid) { - return getFieldOffset(fieldid) > OffHeapRowBlock.NULL_FIELD_OFFSET; + public boolean isBlankOrNull(int fieldid) { + return getFieldOffset(fieldid) == OffHeapRowBlock.NULL_FIELD_OFFSET; } @Override @@ -125,23 +137,8 @@ public void put(int fieldId, Datum value) { } @Override - public void put(int fieldId, Datum[] values) { - throw new UnsupportedException("UnSafeTuple does not support put(int, Datum [])."); - } - - @Override - public void put(int fieldId, Tuple tuple) { - throw new UnsupportedException("UnSafeTuple does not support put(int, Tuple)."); - } - - @Override - public void put(Datum[] values) { - throw new UnsupportedException("UnSafeTuple does not support put(Datum [])."); - } - - @Override - public Datum get(int fieldId) { - if (isNull(fieldId)) { + public Datum asDatum(int fieldId) { + if (isBlankOrNull(fieldId)) { return NullDatum.get(); } @@ -213,6 +210,17 @@ public byte[] getBytes(int fieldId) { return bytes; } + @Override + public byte[] getTextBytes(int fieldId) { + long pos = getFieldAddr(fieldId); + int len = UNSAFE.getInt(pos); + pos += SizeOf.SIZE_OF_INT; + + byte[] bytes = new byte[len]; + UNSAFE.copyMemory(null, pos, bytes, UnsafeUtil.ARRAY_BYTE_BASE_OFFSET, len); + return bytes; + } + @Override public short getInt2(int fieldId) { long addr = getFieldAddr(fieldId); @@ -241,13 +249,7 @@ public double getFloat8(int fieldId) { @Override public String getText(int fieldId) { - long pos = getFieldAddr(fieldId); - int len = UNSAFE.getInt(pos); - pos += SizeOf.SIZE_OF_INT; - - byte [] bytes = new byte[len]; - UNSAFE.copyMemory(null, pos, bytes, UnsafeUtil.ARRAY_BYTE_BASE_OFFSET, len); - return new String(bytes); + return new String(getTextBytes(fieldId)); } public IntervalDatum getInterval(int fieldId) { @@ -284,6 +286,11 @@ public char[] getUnicodeChars(int fieldId) { return StringUtils.convertBytesToChars(bytes, Charset.forName("UTF-8")); } + @Override + public TimeMeta getTimeDate(int fieldId) { + return null; + } + @Override public Tuple clone() throws CloneNotSupportedException { return toHeapTuple(); @@ -294,7 +301,7 @@ public Datum[] getValues() { Datum [] datums = new Datum[size()]; for (int i = 0; i < size(); i++) { if (contains(i)) { - datums[i] = get(i); + datums[i] = asDatum(i); } else { datums[i] = NullDatum.get(); } diff --git a/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestFrameTuple.java b/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestFrameTuple.java index 0251dc7d6a..d0ee8e06be 100644 --- a/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestFrameTuple.java +++ b/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestFrameTuple.java @@ -33,8 +33,7 @@ public class TestFrameTuple { @Before public void setUp() throws Exception { - tuple1 = new VTuple(11); - tuple1.put(new Datum[] { + tuple1 = new VTuple(new Datum[] { DatumFactory.createBool(true), DatumFactory.createBit((byte) 0x99), DatumFactory.createChar('9'), @@ -48,8 +47,7 @@ public void setUp() throws Exception { DatumFactory.createInet4("192.168.0.1") }); - tuple2 = new VTuple(11); - tuple2.put(new Datum[] { + tuple2 = new VTuple(new Datum[] { DatumFactory.createBool(true), DatumFactory.createBit((byte) 0x99), DatumFactory.createChar('9'), @@ -76,9 +74,9 @@ public final void testFrameTuple() { assertTrue(frame.contains(i)); } - assertEquals(DatumFactory.createInt8(23l), frame.get(5)); - assertEquals(DatumFactory.createInt8(23l), frame.get(16)); - assertEquals(DatumFactory.createInet4("192.168.0.1"), frame.get(10)); - assertEquals(DatumFactory.createInet4("192.168.0.1"), frame.get(21)); + assertEquals(23l, frame.getInt8(5)); + assertEquals(23l, frame.getInt8(16)); + assertEquals("192.168.0.1", frame.getText(10)); + assertEquals("192.168.0.1", frame.getText(21)); } } diff --git a/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestLazyTuple.java b/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestLazyTuple.java index 9e7f334d91..96f90e75b6 100644 --- a/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestLazyTuple.java +++ b/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestLazyTuple.java @@ -71,6 +71,7 @@ public void setUp() { sb.append(NullDatum.get()); textRow = BytesUtils.splitPreserveAllTokens(sb.toString().getBytes(), '|', 13); serde = new TextSerializerDeserializer(); + serde.init(schema); } @Test @@ -193,31 +194,6 @@ public void testHashCode() { assertNotSame(t1.hashCode(), t4.hashCode()); } - @Test - public void testPutTuple() { - int colNum = schema.size(); - LazyTuple t1 = new LazyTuple(schema, new byte[colNum][], -1); - - t1.put(0, DatumFactory.createInt4(1)); - t1.put(1, DatumFactory.createInt4(2)); - t1.put(2, DatumFactory.createInt4(3)); - - - Schema schema2 = new Schema(); - schema2.addColumn("col1", TajoDataTypes.Type.INT8); - schema2.addColumn("col2", TajoDataTypes.Type.INT8); - - LazyTuple t2 = new LazyTuple(schema2, new byte[schema2.size()][], -1); - t2.put(0, DatumFactory.createInt4(4)); - t2.put(1, DatumFactory.createInt4(5)); - - t1.put(3, t2); - - for (int i = 0; i < 5; i++) { - assertEquals(i + 1, t1.get(i).asInt4()); - } - } - @Test public void testInvalidNumber() { byte[][] bytes = BytesUtils.splitPreserveAllTokens(" 1| |2 ||".getBytes(), '|', 5); diff --git a/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestTupleComparator.java b/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestTupleComparator.java index 5e94531505..9eec96fe66 100644 --- a/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestTupleComparator.java +++ b/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestTupleComparator.java @@ -51,17 +51,14 @@ public final void testCompare() { schema.addColumn("col4", Type.INT4); schema.addColumn("col5", Type.TEXT); - Tuple tuple1 = new VTuple(5); - Tuple tuple2 = new VTuple(5); - - tuple1.put( + VTuple tuple1 = new VTuple( new Datum[] { DatumFactory.createInt4(9), DatumFactory.createInt4(3), DatumFactory.createInt4(33), DatumFactory.createInt4(4), DatumFactory.createText("abc")}); - tuple2.put( + VTuple tuple2 = new VTuple( new Datum[] { DatumFactory.createInt4(1), DatumFactory.createInt4(25), diff --git a/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestVTuple.java b/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestVTuple.java index 1bbd9ec230..4ef595c899 100644 --- a/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestVTuple.java +++ b/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestVTuple.java @@ -120,35 +120,16 @@ public void testHashCode() { assertNotSame(t1.hashCode(),t3.hashCode()); } - @Test - public void testPutTuple() { - Tuple t1 = new VTuple(5); - - t1.put(0, DatumFactory.createInt4(1)); - t1.put(1, DatumFactory.createInt4(2)); - t1.put(2, DatumFactory.createInt4(3)); - - Tuple t2 = new VTuple(2); - t2.put(0, DatumFactory.createInt4(4)); - t2.put(1, DatumFactory.createInt4(5)); - - t1.put(3, t2); - - for (int i = 0; i < 5; i++) { - assertEquals(i+1, t1.get(i).asInt4()); - } - } - @Test public void testClone() throws CloneNotSupportedException { - Tuple t1 = new VTuple(5); + VTuple t1 = new VTuple(5); t1.put(0, DatumFactory.createInt4(1)); t1.put(1, DatumFactory.createInt4(2)); t1.put(3, DatumFactory.createInt4(2)); t1.put(4, DatumFactory.createText("str")); - VTuple t2 = (VTuple) t1.clone(); + VTuple t2 = t1.clone(); assertNotSame(t1, t2); assertEquals(t1, t2); diff --git a/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/tuple/offheap/TestOffHeapRowBlock.java b/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/tuple/offheap/TestOffHeapRowBlock.java index c43ba38930..278d733d35 100644 --- a/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/tuple/offheap/TestOffHeapRowBlock.java +++ b/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/tuple/offheap/TestOffHeapRowBlock.java @@ -497,79 +497,79 @@ public static void validateTupleResult(int j, Tuple t) { public static void validateNullity(int j, Tuple tuple) { if (j == 0) { - tuple.isNull(0); + tuple.isBlankOrNull(0); } else { assertTrue((j % 1 == 0) == tuple.getBool(0)); } if (j % 1 == 0) { - tuple.isNull(1); + tuple.isBlankOrNull(1); } else { assertTrue(1 == tuple.getInt2(1)); } if (j % 2 == 0) { - tuple.isNull(2); + tuple.isBlankOrNull(2); } else { assertEquals(j, tuple.getInt4(2)); } if (j % 3 == 0) { - tuple.isNull(3); + tuple.isBlankOrNull(3); } else { assertEquals(j, tuple.getInt8(3)); } if (j % 4 == 0) { - tuple.isNull(4); + tuple.isBlankOrNull(4); } else { assertTrue(j == tuple.getFloat4(4)); } if (j % 5 == 0) { - tuple.isNull(5); + tuple.isBlankOrNull(5); } else { assertTrue(j == tuple.getFloat8(5)); } if (j % 6 == 0) { - tuple.isNull(6); + tuple.isBlankOrNull(6); } else { assertEquals(new String(UNICODE_FIELD_PREFIX + j), tuple.getText(6)); } if (j % 7 == 0) { - tuple.isNull(7); + tuple.isBlankOrNull(7); } else { assertEquals(DatumFactory.createTimestamp("2014-04-16 08:48:00").asInt8() + (long) j, tuple.getInt8(7)); } if (j % 8 == 0) { - tuple.isNull(8); + tuple.isBlankOrNull(8); } else { assertEquals(DatumFactory.createDate("2014-04-16").asInt4() + j, tuple.getInt4(8)); } if (j % 9 == 0) { - tuple.isNull(9); + tuple.isBlankOrNull(9); } else { assertEquals(DatumFactory.createTime("08:48:00").asInt8() + j, tuple.getInt8(9)); } if (j % 10 == 0) { - tuple.isNull(10); + tuple.isBlankOrNull(10); } else { assertEquals(DatumFactory.createInterval((j + 1) + " hours"), tuple.getInterval(10)); } if (j % 11 == 0) { - tuple.isNull(11); + tuple.isBlankOrNull(11); } else { assertEquals(DatumFactory.createInet4("192.168.0.1").asInt4() + j, tuple.getInt4(11)); } if (j % 12 == 0) { - tuple.isNull(12); + tuple.isBlankOrNull(12); } else { assertEquals(new ProtobufDatum(ProtoUtil.convertString(j + "")), tuple.getProtobufDatum(12)); } diff --git a/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/AbstractHBaseAppender.java b/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/AbstractHBaseAppender.java index 48363523a3..d9fb21d852 100644 --- a/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/AbstractHBaseAppender.java +++ b/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/AbstractHBaseAppender.java @@ -153,11 +153,10 @@ protected byte[] getRowKeyBytes(Tuple tuple) throws IOException { if (rowkeyColumnIndexes.length > 1) { bout.reset(); for (int i = 0; i < rowkeyColumnIndexes.length; i++) { - datum = tuple.get(rowkeyColumnIndexes[i]); if (isBinaryColumns[rowkeyColumnIndexes[i]]) { - rowkey = HBaseBinarySerializerDeserializer.serialize(schema.getColumn(rowkeyColumnIndexes[i]), datum); + rowkey = HBaseBinarySerializerDeserializer.serialize(schema.getColumn(rowkeyColumnIndexes[i]), tuple, i); } else { - rowkey = HBaseTextSerializerDeserializer.serialize(schema.getColumn(rowkeyColumnIndexes[i]), datum); + rowkey = HBaseTextSerializerDeserializer.serialize(schema.getColumn(rowkeyColumnIndexes[i]), tuple, i); } bout.write(rowkey); if (i < rowkeyColumnIndexes.length - 1) { @@ -167,11 +166,10 @@ protected byte[] getRowKeyBytes(Tuple tuple) throws IOException { rowkey = bout.toByteArray(); } else { int index = rowkeyColumnIndexes[0]; - datum = tuple.get(index); if (isBinaryColumns[index]) { - rowkey = HBaseBinarySerializerDeserializer.serialize(schema.getColumn(index), datum); + rowkey = HBaseBinarySerializerDeserializer.serialize(schema.getColumn(index), tuple, index); } else { - rowkey = HBaseTextSerializerDeserializer.serialize(schema.getColumn(index), datum); + rowkey = HBaseTextSerializerDeserializer.serialize(schema.getColumn(index), tuple, index); } } @@ -184,12 +182,11 @@ protected void readKeyValues(Tuple tuple, byte[] rowkey) throws IOException { if (isRowKeyMappings[i]) { continue; } - Datum datum = tuple.get(i); byte[] value; if (isBinaryColumns[i]) { - value = HBaseBinarySerializerDeserializer.serialize(schema.getColumn(i), datum); + value = HBaseBinarySerializerDeserializer.serialize(schema.getColumn(i), tuple, i); } else { - value = HBaseTextSerializerDeserializer.serialize(schema.getColumn(i), datum); + value = HBaseTextSerializerDeserializer.serialize(schema.getColumn(i), tuple, i); } if (isColumnKeys[i]) { diff --git a/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseBinarySerializerDeserializer.java b/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseBinarySerializerDeserializer.java index c05c5bb0d5..12912be24d 100644 --- a/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseBinarySerializerDeserializer.java +++ b/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseBinarySerializerDeserializer.java @@ -22,6 +22,7 @@ import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.DatumFactory; import org.apache.tajo.datum.NullDatum; +import org.apache.tajo.storage.Tuple; import org.apache.tajo.util.Bytes; import java.io.IOException; @@ -94,4 +95,38 @@ public static byte[] serialize(Column col, Datum datum) throws IOException { return bytes; } + + public static byte[] serialize(Column col, Tuple tuple, int index) throws IOException { + if (tuple.isBlankOrNull(index)) { + return null; + } + + byte[] bytes; + switch (col.getDataType().getType()) { + case INT1: + case INT2: + bytes = Bytes.toBytes(tuple.getInt2(index)); + break; + case INT4: + bytes = Bytes.toBytes(tuple.getInt4(index)); + break; + case INT8: + bytes = Bytes.toBytes(tuple.getInt8(index)); + break; + case FLOAT4: + bytes = Bytes.toBytes(tuple.getFloat4(index)); + break; + case FLOAT8: + bytes = Bytes.toBytes(tuple.getFloat8(index)); + break; + case TEXT: + bytes = Bytes.toBytes(tuple.getText(index)); + break; + default: + bytes = null; + break; + } + + return bytes; + } } diff --git a/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBasePutAppender.java b/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBasePutAppender.java index 45a1bff2d9..a8b856c1c2 100644 --- a/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBasePutAppender.java +++ b/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBasePutAppender.java @@ -28,7 +28,6 @@ import org.apache.tajo.catalog.TableMeta; import org.apache.tajo.catalog.proto.CatalogProtos.StoreType; import org.apache.tajo.conf.TajoConf; -import org.apache.tajo.datum.Datum; import org.apache.tajo.storage.StorageManager; import org.apache.tajo.storage.Tuple; @@ -66,12 +65,11 @@ public void addTuple(Tuple tuple) throws IOException { if (isRowKeyMappings[i]) { continue; } - Datum datum = tuple.get(i); byte[] value; if (isBinaryColumns[i]) { - value = HBaseBinarySerializerDeserializer.serialize(schema.getColumn(i), datum); + value = HBaseBinarySerializerDeserializer.serialize(schema.getColumn(i), tuple, i); } else { - value = HBaseTextSerializerDeserializer.serialize(schema.getColumn(i), datum); + value = HBaseTextSerializerDeserializer.serialize(schema.getColumn(i), tuple, i); } if (isColumnKeys[i]) { diff --git a/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseStorageManager.java b/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseStorageManager.java index a9e5bdee55..7c8f130841 100644 --- a/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseStorageManager.java +++ b/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseStorageManager.java @@ -1009,10 +1009,10 @@ public TupleRange[] getInsertSortRanges(OverridableConf queryContext, TableDesc List tupleRanges = new ArrayList(endKeys.length); TupleComparator comparator = new BaseTupleComparator(inputSchema, sortSpecs); - Tuple previousTuple = dataRange.getStart(); + VTuple previousTuple = dataRange.getStart(); for (byte[] eachEndKey : endKeys) { - Tuple endTuple = new VTuple(sortSpecs.length); + VTuple endTuple = new VTuple(sortSpecs.length); byte[][] rowKeyFields; if (sortSpecs.length > 1) { byte[][] splitValues = BytesUtils.splitPreserveAllTokens( diff --git a/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseTextSerializerDeserializer.java b/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseTextSerializerDeserializer.java index a0ad49235c..ea5d0b03f0 100644 --- a/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseTextSerializerDeserializer.java +++ b/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseTextSerializerDeserializer.java @@ -22,6 +22,7 @@ import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.DatumFactory; import org.apache.tajo.datum.NullDatum; +import org.apache.tajo.storage.Tuple; import org.apache.tajo.util.NumberUtil; import java.io.IOException; @@ -68,4 +69,12 @@ public static byte[] serialize(Column col, Datum datum) throws IOException { return datum.asChars().getBytes(); } + + public static byte[] serialize(Column col, Tuple tuple, int index) throws IOException { + if (tuple.isBlankOrNull(index)) { + return null; + } + + return tuple.getBytes(index); + } } diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/CSVFile.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/CSVFile.java index c1047d980a..68e59e410e 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/CSVFile.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/CSVFile.java @@ -33,7 +33,6 @@ import org.apache.tajo.catalog.proto.CatalogProtos; import org.apache.tajo.catalog.statistics.TableStats; import org.apache.tajo.conf.TajoConf; -import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.NullDatum; import org.apache.tajo.exception.UnsupportedException; import org.apache.tajo.storage.compress.CodecPool; @@ -149,6 +148,7 @@ public void init() throws IOException { String serdeClass = this.meta.getOption(StorageConstants.CSVFILE_SERDE, TextSerializerDeserializer.class.getName()); serde = (SerializerDeserializer) Class.forName(serdeClass).newInstance(); + serde.init(schema); } catch (Exception e) { LOG.error(e.getMessage(), e); throw new IOException(e); @@ -163,12 +163,10 @@ public void init() throws IOException { @Override public void addTuple(Tuple tuple) throws IOException { - Datum datum; int rowBytes = 0; for (int i = 0; i < columnNum; i++) { - datum = tuple.get(i); - rowBytes += serde.serialize(schema.getColumn(i), datum, os, nullChars); + rowBytes += serde.serialize(i, tuple, os, nullChars); if(columnNum - 1 > i){ os.write(delimiter); @@ -176,7 +174,7 @@ public void addTuple(Tuple tuple) throws IOException { } if (isShuffle) { // it is to calculate min/max values, and it is only used for the intermediate file. - stats.analyzeField(i, datum); + stats.analyzeField(i, tuple); } } os.write(LF); @@ -358,6 +356,7 @@ public void init() throws IOException { String serdeClass = this.meta.getOption(StorageConstants.CSVFILE_SERDE, TextSerializerDeserializer.class.getName()); serde = (SerializerDeserializer) Class.forName(serdeClass).newInstance(); + serde.init(schema); } catch (Exception e) { LOG.error(e.getMessage(), e); throw new IOException(e); diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FieldSerializerDeserializer.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FieldSerializerDeserializer.java index 0b3755d4b5..cfd5a79b5c 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FieldSerializerDeserializer.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FieldSerializerDeserializer.java @@ -20,6 +20,7 @@ import io.netty.buffer.ByteBuf; import org.apache.tajo.catalog.Column; +import org.apache.tajo.catalog.Schema; import org.apache.tajo.datum.Datum; import org.apache.tajo.storage.text.TextLineParsingError; @@ -29,9 +30,11 @@ public interface FieldSerializerDeserializer { - public int serialize(OutputStream out, Datum datum, Column col, int columnIndex, byte[] nullChars) throws IOException; + void init(Schema schema); - public Datum deserialize(ByteBuf buf, Column col, int columnIndex, ByteBuf nullChars) + int serialize(int columnIndex, Tuple datum, OutputStream out, byte[] nullChars) throws IOException; + + Datum deserialize(int columnIndex, ByteBuf buf, ByteBuf nullChars) throws IOException, TextLineParsingError; } diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/RawFile.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/RawFile.java index 5213ba0502..4e9bcda8d8 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/RawFile.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/RawFile.java @@ -634,10 +634,10 @@ public void addTuple(Tuple t) throws IOException { nullFlags.clear(); for (int i = 0; i < schema.size(); i++) { if (enabledStats) { - stats.analyzeField(i, t.get(i)); + stats.analyzeField(i, t); } - if (t.isNull(i)) { + if (t.isBlankOrNull(i)) { nullFlags.set(i); continue; } diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/RowFile.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/RowFile.java index 1ff6c4f9ea..0e628d4a8b 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/RowFile.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/RowFile.java @@ -376,56 +376,56 @@ public void addTuple(Tuple t) throws IOException { for (int i = 0; i < schema.size(); i++) { if (enabledStats) { - stats.analyzeField(i, t.get(i)); + stats.analyzeField(i, t); } - if (t.isNull(i)) { + if (t.isBlankOrNull(i)) { nullFlags.set(i); } else { col = schema.getColumn(i); switch (col.getDataType().getType()) { case BOOLEAN: - buffer.put(t.get(i).asByte()); + buffer.put(t.getByte(i)); break; case BIT: - buffer.put(t.get(i).asByte()); + buffer.put(t.getByte(i)); break; case CHAR: - byte[] src = t.get(i).asByteArray(); + byte[] src = t.getBytes(i); byte[] dst = Arrays.copyOf(src, col.getDataType().getLength()); buffer.putInt(src.length); buffer.put(dst); break; case TEXT: - byte [] strbytes = t.get(i).asByteArray(); + byte [] strbytes = t.getBytes(i); buffer.putShort((short)strbytes.length); buffer.put(strbytes, 0, strbytes.length); break; case INT2: - buffer.putShort(t.get(i).asInt2()); + buffer.putShort(t.getInt2(i)); break; case INT4: - buffer.putInt(t.get(i).asInt4()); + buffer.putInt(t.getInt4(i)); break; case INT8: - buffer.putLong(t.get(i).asInt8()); + buffer.putLong(t.getInt8(i)); break; case FLOAT4: - buffer.putFloat(t.get(i).asFloat4()); + buffer.putFloat(t.getFloat4(i)); break; case FLOAT8: - buffer.putDouble(t.get(i).asFloat8()); + buffer.putDouble(t.getFloat8(i)); break; case BLOB: - byte [] bytes = t.get(i).asByteArray(); + byte [] bytes = t.getBytes(i); buffer.putShort((short)bytes.length); buffer.put(bytes); break; case INET4: - buffer.put(t.get(i).asByteArray()); + buffer.put(t.getBytes(i)); break; case INET6: - buffer.put(t.get(i).asByteArray()); + buffer.put(t.getBytes(i)); break; case NULL_TYPE: nullFlags.set(i); diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/avro/AvroAppender.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/avro/AvroAppender.java index da426ea6ec..278295567f 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/avro/AvroAppender.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/avro/AvroAppender.java @@ -33,7 +33,6 @@ import org.apache.tajo.catalog.Column; import org.apache.tajo.catalog.TableMeta; import org.apache.tajo.catalog.statistics.TableStats; -import org.apache.tajo.datum.NullDatum; import org.apache.tajo.storage.FileAppender; import org.apache.tajo.storage.TableStatistics; import org.apache.tajo.storage.Tuple; @@ -104,7 +103,7 @@ public long getOffset() throws IOException { } private Object getPrimitive(Tuple tuple, int i, Schema.Type avroType) { - if (tuple.get(i) instanceof NullDatum) { + if (tuple.isBlankOrNull(i)) { return null; } switch (avroType) { @@ -141,7 +140,7 @@ public void addTuple(Tuple tuple) throws IOException { for (int i = 0; i < schema.size(); ++i) { Column column = schema.getColumn(i); if (enabledStats) { - stats.analyzeField(i, tuple.get(i)); + stats.analyzeField(i, tuple); } Object value; Schema.Field avroField = avroFields.get(i); diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/json/JsonLineSerializer.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/json/JsonLineSerializer.java index d6faf2df40..39e4611320 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/json/JsonLineSerializer.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/json/JsonLineSerializer.java @@ -58,7 +58,7 @@ public int serialize(OutputStream out, Tuple input) throws IOException { JSONObject jsonObject = new JSONObject(); for (int i = 0; i < columnNum; i++) { - if (input.isNull(i)) { + if (input.isBlankOrNull(i)) { continue; } diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/ParquetAppender.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/ParquetAppender.java index 415c338734..45960aabea 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/ParquetAppender.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/ParquetAppender.java @@ -108,7 +108,7 @@ public long getOffset() throws IOException { public void addTuple(Tuple tuple) throws IOException { if (enabledStats) { for (int i = 0; i < schema.size(); ++i) { - stats.analyzeField(i, tuple.get(i)); + stats.analyzeField(i, tuple); } } writer.write(tuple); diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/TajoRecordConverter.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/TajoRecordConverter.java index a091eac29d..7196e43140 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/TajoRecordConverter.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/TajoRecordConverter.java @@ -157,7 +157,7 @@ public void end() { final int projectionIndex = projectionMap[i]; Column column = tajoReadSchema.getColumn(projectionIndex); if (column.getDataType().getType() == TajoDataTypes.Type.NULL_TYPE - || currentTuple.get(projectionIndex) == null) { + || currentTuple.isBlankOrNull(projectionIndex)) { set(projectionIndex, NullDatum.get()); } } diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/TajoWriteSupport.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/TajoWriteSupport.java index e05aeafdda..a0c19796a5 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/TajoWriteSupport.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/TajoWriteSupport.java @@ -22,7 +22,6 @@ import org.apache.tajo.catalog.Column; import org.apache.tajo.catalog.Schema; import org.apache.tajo.common.TajoDataTypes; -import org.apache.tajo.datum.Datum; import org.apache.tajo.storage.Tuple; import parquet.hadoop.api.WriteSupport; import parquet.io.api.Binary; @@ -98,11 +97,10 @@ private void writeRecordFields(GroupType schema, Schema tajoSchema, if (column.getDataType().getType() == TajoDataTypes.Type.NULL_TYPE) { continue; } - Datum datum = tuple.get(tajoIndex); Type fieldType = fields.get(index); - if (!tuple.isNull(tajoIndex)) { + if (!tuple.isBlankOrNull(tajoIndex)) { recordConsumer.startField(fieldType.getName(), index); - writeValue(fieldType, column, datum); + writeValue(fieldType, column, tuple, tajoIndex); recordConsumer.endField(fieldType.getName(), index); } else if (fieldType.isRepetition(Type.Repetition.REQUIRED)) { throw new RuntimeException("Null-value for required field: " + @@ -112,34 +110,34 @@ private void writeRecordFields(GroupType schema, Schema tajoSchema, } } - private void writeValue(Type fieldType, Column column, Datum datum) { + private void writeValue(Type fieldType, Column column, Tuple tuple, int index) { switch (column.getDataType().getType()) { case BOOLEAN: - recordConsumer.addBoolean(datum.asBool()); + recordConsumer.addBoolean(tuple.getBool(index)); break; case BIT: case INT2: case INT4: - recordConsumer.addInteger(datum.asInt4()); + recordConsumer.addInteger(tuple.getInt4(index)); break; case INT8: - recordConsumer.addLong(datum.asInt8()); + recordConsumer.addLong(tuple.getInt8(index)); break; case FLOAT4: - recordConsumer.addFloat(datum.asFloat4()); + recordConsumer.addFloat(tuple.getFloat4(index)); break; case FLOAT8: - recordConsumer.addDouble(datum.asFloat8()); + recordConsumer.addDouble(tuple.getFloat8(index)); break; case CHAR: case TEXT: - recordConsumer.addBinary(Binary.fromByteArray(datum.asTextBytes())); + recordConsumer.addBinary(Binary.fromByteArray(tuple.getBytes(index))); break; case PROTOBUF: case BLOB: case INET4: case INET6: - recordConsumer.addBinary(Binary.fromByteArray(datum.asByteArray())); + recordConsumer.addBinary(Binary.fromByteArray(tuple.getBytes(index))); break; default: break; diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/rcfile/RCFile.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/rcfile/RCFile.java index 44aabd453e..a72bcd9f18 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/rcfile/RCFile.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/rcfile/RCFile.java @@ -30,7 +30,6 @@ import org.apache.hadoop.io.compress.*; import org.apache.hadoop.util.ReflectionUtils; import org.apache.tajo.TaskAttemptId; -import org.apache.tajo.catalog.Column; import org.apache.tajo.catalog.Schema; import org.apache.tajo.catalog.TableMeta; import org.apache.tajo.catalog.proto.CatalogProtos; @@ -646,8 +645,12 @@ class ColumnBuffer { valLenBuffer = new NonSyncByteArrayOutputStream(); } - public int append(Column column, Datum datum) throws IOException { - int currentLen = serde.serialize(column, datum, columnValBuffer, nullChars); + public int append(NullDatum nill) { + return nullChars.length; + } + + public int append(Tuple tuple, int i) throws IOException { + int currentLen = serde.serialize(i, tuple, columnValBuffer, nullChars); columnValueLength += currentLen; uncompressedColumnValueLength += currentLen; @@ -765,6 +768,7 @@ public void init() throws IOException { BinarySerializerDeserializer.class.getName()); try { serde = (SerializerDeserializer) Class.forName(serdeClass).newInstance(); + serde.init(schema); } catch (Exception e) { LOG.error(e.getMessage(), e); throw new IOException(e); @@ -892,20 +896,19 @@ public void append(Tuple tuple) throws IOException { int size = schema.size(); for (int i = 0; i < size; i++) { - Datum datum = tuple.get(i); - int length = columnBuffers[i].append(schema.getColumn(i), datum); + int length = columnBuffers[i].append(tuple, i); columnBufferSize += length; if (isShuffle) { // it is to calculate min/max values, and it is only used for the intermediate file. - stats.analyzeField(i, datum); + stats.analyzeField(i, tuple); } } if (size < columnNumber) { for (int i = size; i < columnNumber; i++) { - columnBuffers[i].append(schema.getColumn(i), NullDatum.get()); + columnBuffers[i].append(NullDatum.get()); if (isShuffle) { - stats.analyzeField(i, NullDatum.get()); + stats.analyzeNull(i); } } } @@ -1376,6 +1379,7 @@ private void initHeader() throws IOException { serdeClass = this.meta.getOption(StorageConstants.RCFILE_SERDE, BinarySerializerDeserializer.class.getName()); } serde = (SerializerDeserializer) Class.forName(serdeClass).newInstance(); + serde.init(schema); } catch (Exception e) { LOG.error(e.getMessage(), e); throw new IOException(e); @@ -1714,7 +1718,7 @@ public void getCurrentRow(Tuple tuple) throws IOException { } else { colAdvanceRow(j, col); - Datum datum = serde.deserialize(schema.getColumn(i), + Datum datum = serde.deserialize(i, currentValue.loadedColumnsValueBuffer[j].getData(), col.rowReadIndex, col.prvLength, nullChars); tuple.put(i, datum); col.rowReadIndex += col.prvLength; diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/sequencefile/SequenceFileAppender.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/sequencefile/SequenceFileAppender.java index 404352c3e8..9b09d78f20 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/sequencefile/SequenceFileAppender.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/sequencefile/SequenceFileAppender.java @@ -35,7 +35,6 @@ import org.apache.tajo.catalog.proto.CatalogProtos; import org.apache.tajo.catalog.statistics.TableStats; import org.apache.tajo.conf.TajoConf; -import org.apache.tajo.datum.Datum; import org.apache.tajo.datum.NullDatum; import org.apache.tajo.datum.ProtobufDatum; import org.apache.tajo.storage.*; @@ -125,6 +124,7 @@ public void init() throws IOException { String serdeClass = this.meta.getOption(StorageConstants.SEQUENCEFILE_SERDE, TextSerializerDeserializer.class.getName()); serde = (SerializerDeserializer) Class.forName(serdeClass).newInstance(); + serde.init(schema); } catch (Exception e) { LOG.error(e.getMessage(), e); throw new IOException(e); @@ -159,16 +159,13 @@ public void init() throws IOException { @Override public void addTuple(Tuple tuple) throws IOException { - Datum datum; if (serde instanceof BinarySerializerDeserializer) { byte nullByte = 0; int lasti = 0; for (int i = 0; i < columnNum; i++) { - datum = tuple.get(i); - // set bit to 1 if a field is not null - if (null != datum) { + if (!tuple.isBlank(i)) { nullByte |= 1 << (i % 8); } @@ -179,29 +176,28 @@ public void addTuple(Tuple tuple) throws IOException { os.write(nullByte); for (int j = lasti; j <= i; j++) { - datum = tuple.get(j); switch (schema.getColumn(j).getDataType().getType()) { case TEXT: - BytesUtils.writeVLong(os, datum.asTextBytes().length); + BytesUtils.writeVLong(os, tuple.getTextBytes(j).length); break; case PROTOBUF: - ProtobufDatum protobufDatum = (ProtobufDatum) datum; + ProtobufDatum protobufDatum = (ProtobufDatum) tuple.getProtobufDatum(j); BytesUtils.writeVLong(os, protobufDatum.asByteArray().length); break; case CHAR: case INET4: case BLOB: - BytesUtils.writeVLong(os, datum.asByteArray().length); + BytesUtils.writeVLong(os, tuple.getBytes(j).length); break; default: } - serde.serialize(schema.getColumn(j), datum, os, nullChars); + serde.serialize(j, tuple, os, nullChars); if (isShuffle) { // it is to calculate min/max values, and it is only used for the intermediate file. - stats.analyzeField(j, datum); + stats.analyzeField(j, tuple); } } lasti = i + 1; @@ -215,8 +211,7 @@ public void addTuple(Tuple tuple) throws IOException { } else { for (int i = 0; i < columnNum; i++) { - datum = tuple.get(i); - serde.serialize(schema.getColumn(i), datum, os, nullChars); + serde.serialize(i, tuple, os, nullChars); if (columnNum -1 > i) { os.write((byte) delimiter); @@ -224,7 +219,7 @@ public void addTuple(Tuple tuple) throws IOException { if (isShuffle) { // it is to calculate min/max values, and it is only used for the intermediate file. - stats.analyzeField(i, datum); + stats.analyzeField(i, tuple); } } diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/sequencefile/SequenceFileScanner.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/sequencefile/SequenceFileScanner.java index 92a041cfc7..e05d848df5 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/sequencefile/SequenceFileScanner.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/sequencefile/SequenceFileScanner.java @@ -117,6 +117,7 @@ public void init() throws IOException { try { String serdeClass = this.meta.getOption(StorageConstants.SEQUENCEFILE_SERDE, TextSerializerDeserializer.class.getName()); serde = (SerializerDeserializer) Class.forName(serdeClass).newInstance(); + serde.init(schema); if (serde instanceof BinarySerializerDeserializer) { hasBinarySerDe = true; @@ -225,7 +226,7 @@ private Tuple makeTuple(BytesWritable value) throws IOException{ for (int j = 0; j < projectionMap.length; j++) { if (projectionMap[j] == i) { - Datum datum = serde.deserialize(schema.getColumn(i), bytes, fieldStart[i], fieldLength[i], nullChars); + Datum datum = serde.deserialize(i, bytes, fieldStart[i], fieldLength[i], nullChars); tuple.put(i, datum); } } diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/CSVLineDeserializer.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/CSVLineDeserializer.java index 6a8c7a9239..e47be0de77 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/CSVLineDeserializer.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/CSVLineDeserializer.java @@ -54,6 +54,7 @@ public void init() { nullChars = TextLineSerDe.getNullChars(meta); fieldSerDer = new TextFieldSerializerDeserializer(meta); + fieldSerDer.init(schema); } public void deserialize(final ByteBuf lineBuf, Tuple output) throws IOException, TextLineParsingError { @@ -80,7 +81,7 @@ public void deserialize(final ByteBuf lineBuf, Tuple output) throws IOException, if (projection.length > currentTarget && currentIndex == projection[currentTarget]) { lineBuf.setIndex(start, start + fieldLength); - Datum datum = fieldSerDer.deserialize(lineBuf, schema.getColumn(currentIndex), currentIndex, nullChars); + Datum datum = fieldSerDer.deserialize(currentIndex, lineBuf, nullChars); output.put(currentIndex, datum); currentTarget++; } diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/CSVLineSerializer.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/CSVLineSerializer.java index 9a2fe3745b..21984f28e3 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/CSVLineSerializer.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/CSVLineSerializer.java @@ -20,7 +20,6 @@ import org.apache.tajo.catalog.Schema; import org.apache.tajo.catalog.TableMeta; -import org.apache.tajo.datum.Datum; import org.apache.tajo.storage.FieldSerializerDeserializer; import org.apache.tajo.storage.Tuple; @@ -45,6 +44,7 @@ public void init() { columnNum = schema.size(); serde = new TextFieldSerializerDeserializer(meta); + serde.init(schema); } @Override @@ -52,8 +52,7 @@ public int serialize(OutputStream out, Tuple input) throws IOException { int writtenBytes = 0; for (int i = 0; i < columnNum; i++) { - Datum datum = input.get(i); - writtenBytes += serde.serialize(out, datum, schema.getColumn(i), i, nullChars); + writtenBytes += serde.serialize(i, input, out, nullChars); if (columnNum - 1 > i) { out.write(delimiter); diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/TextFieldSerializerDeserializer.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/TextFieldSerializerDeserializer.java index e637c7f0cb..bfc8fa401c 100644 --- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/TextFieldSerializerDeserializer.java +++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/TextFieldSerializerDeserializer.java @@ -24,6 +24,7 @@ import org.apache.commons.codec.binary.Base64; import org.apache.tajo.TajoConstants; import org.apache.tajo.catalog.Column; +import org.apache.tajo.catalog.Schema; import org.apache.tajo.catalog.TableMeta; import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.datum.*; @@ -31,6 +32,7 @@ import org.apache.tajo.storage.FieldSerializerDeserializer; import org.apache.tajo.storage.StorageConstants; import org.apache.tajo.util.Bytes; +import org.apache.tajo.storage.Tuple; import org.apache.tajo.util.NumberUtil; import java.io.IOException; @@ -47,6 +49,8 @@ public class TextFieldSerializerDeserializer implements FieldSerializerDeseriali private final boolean hasTimezone; private final TimeZone timezone; + private Schema schema; + public TextFieldSerializerDeserializer(TableMeta meta) { hasTimezone = meta.containsOption(StorageConstants.TIMEZONE); timezone = TimeZone.getTimeZone(meta.getOption(StorageConstants.TIMEZONE, TajoConstants.DEFAULT_SYSTEM_TIMEZONE)); @@ -61,13 +65,19 @@ private static boolean isNullText(ByteBuf val, ByteBuf nullBytes) { } @Override - public int serialize(OutputStream out, Datum datum, Column col, int columnIndex, byte[] nullChars) + public void init(Schema schema) { + this.schema = schema; + } + + @Override + public int serialize(int columnIndex, Tuple tuple, OutputStream out, byte[] nullChars) throws IOException { byte[] bytes; int length = 0; + Column col = schema.getColumn(columnIndex); TajoDataTypes.DataType dataType = col.getDataType(); - if (datum == null || datum instanceof NullDatum) { + if (tuple.isBlankOrNull(columnIndex)) { switch (dataType.getType()) { case CHAR: case TEXT: @@ -82,12 +92,12 @@ public int serialize(OutputStream out, Datum datum, Column col, int columnIndex, switch (dataType.getType()) { case BOOLEAN: - out.write(datum.asBool() ? trueBytes : falseBytes); + out.write(tuple.getBool(columnIndex) ? trueBytes : falseBytes); length = trueBytes.length; break; case CHAR: - byte[] pad = new byte[dataType.getLength() - datum.size()]; - bytes = datum.asTextBytes(); + byte[] pad = new byte[dataType.getLength() - tuple.size(columnIndex)]; + bytes = tuple.getBytes(columnIndex); out.write(bytes); out.write(pad); length = bytes.length + pad.length; @@ -102,36 +112,36 @@ public int serialize(OutputStream out, Datum datum, Column col, int columnIndex, case INET4: case DATE: case INTERVAL: - bytes = datum.asTextBytes(); + bytes = tuple.getTextBytes(columnIndex); length = bytes.length; out.write(bytes); break; case TIME: if (hasTimezone) { - bytes = ((TimeDatum) datum).asChars(timezone, true).getBytes(Bytes.UTF8_CHARSET); + bytes = TimeDatum.asChars(tuple.getTimeDate(columnIndex), timezone, true).getBytes(Bytes.UTF8_CHARSET); } else { - bytes = datum.asTextBytes(); + bytes = tuple.getTextBytes(columnIndex); } length = bytes.length; out.write(bytes); break; case TIMESTAMP: if (hasTimezone) { - bytes = ((TimestampDatum) datum).asChars(timezone, true).getBytes(Bytes.UTF8_CHARSET); + bytes = TimestampDatum.asChars(tuple.getTimeDate(columnIndex), timezone, true).getBytes(Bytes.UTF8_CHARSET); } else { - bytes = datum.asTextBytes(); + bytes = tuple.getTextBytes(columnIndex); } length = bytes.length; out.write(bytes); break; case INET6: case BLOB: - bytes = Base64.encodeBase64(datum.asByteArray(), false); + bytes = Base64.encodeBase64(tuple.getBytes(columnIndex), false); length = bytes.length; out.write(bytes, 0, length); break; case PROTOBUF: - ProtobufDatum protobuf = (ProtobufDatum) datum; + ProtobufDatum protobuf = (ProtobufDatum) tuple.getProtobufDatum(columnIndex); byte[] protoBytes = protobufJsonFormat.printToString(protobuf.get()).getBytes(Bytes.UTF8_CHARSET); length = protoBytes.length; out.write(protoBytes, 0, protoBytes.length); @@ -144,8 +154,10 @@ public int serialize(OutputStream out, Datum datum, Column col, int columnIndex, } @Override - public Datum deserialize(ByteBuf buf, Column col, int columnIndex, ByteBuf nullChars) throws IOException { + public Datum deserialize(int columnIndex, ByteBuf buf, ByteBuf nullChars) throws IOException { Datum datum; + + Column col = schema.getColumn(columnIndex); TajoDataTypes.Type type = col.getDataType().getType(); boolean nullField; if (type == TajoDataTypes.Type.TEXT || type == TajoDataTypes.Type.CHAR) { diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestDelimitedTextFile.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestDelimitedTextFile.java index 2db916afaf..e946c75f2b 100644 --- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestDelimitedTextFile.java +++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestDelimitedTextFile.java @@ -45,7 +45,7 @@ public class TestDelimitedTextFile { private static Schema schema = new Schema(); - private static Tuple baseTuple = new VTuple(10); + private static Tuple baseTuple; static { schema.addColumn("col1", Type.BOOLEAN); @@ -59,7 +59,7 @@ public class TestDelimitedTextFile { schema.addColumn("col9", Type.BLOB); schema.addColumn("col10", Type.INET4); - baseTuple.put(new Datum[] { + baseTuple = new VTuple(new Datum[] { DatumFactory.createBool(true), // 0 DatumFactory.createChar("hyunsik"), // 1 DatumFactory.createInt2((short) 17), // 2 diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileStorageManager.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileStorageManager.java index 4b39cdd42a..797e106784 100644 --- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileStorageManager.java +++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileStorageManager.java @@ -70,10 +70,9 @@ public final void testGetScannerAndAppender() throws IOException { TableMeta meta = CatalogUtil.newTableMeta(StoreType.CSV); - Tuple[] tuples = new Tuple[4]; + VTuple[] tuples = new VTuple[4]; for(int i=0; i < tuples.length; i++) { - tuples[i] = new VTuple(3); - tuples[i].put(new Datum[] { + tuples[i] = new VTuple(new Datum[] { DatumFactory.createInt4(i), DatumFactory.createInt4(i + 32), DatumFactory.createText("name" + i)}); diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileSystems.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileSystems.java index ff7fe134f7..b5ec626d12 100644 --- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileSystems.java +++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileSystems.java @@ -107,11 +107,10 @@ public void testBlockSplit() throws IOException { Tuple[] tuples = new Tuple[4]; for (int i = 0; i < tuples.length; i++) { - tuples[i] = new VTuple(3); - tuples[i] - .put(new Datum[]{DatumFactory.createInt4(i), - DatumFactory.createInt4(i + 32), - DatumFactory.createText("name" + i)}); + tuples[i] = new VTuple(new Datum[]{ + DatumFactory.createInt4(i), + DatumFactory.createInt4(i + 32), + DatumFactory.createText("name" + i)}); } Path path = StorageUtil.concatPath(testDir, "testGetScannerAndAppender", diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestMergeScanner.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestMergeScanner.java index 561e2ef755..6beec56ca0 100644 --- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestMergeScanner.java +++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestMergeScanner.java @@ -176,10 +176,10 @@ public void testMultipleFiles() throws IOException { while ((tuple = scanner.next()) != null) { totalCounts++; if (isProjectableStorage(meta.getStoreType())) { - assertNotNull(tuple.get(0)); - assertNull(tuple.get(1)); - assertNotNull(tuple.get(2)); - assertNull(tuple.get(3)); + assertFalse(tuple.isBlankOrNull(0)); + assertTrue(tuple.isBlankOrNull(1)); + assertFalse(tuple.isBlankOrNull(2)); + assertTrue(tuple.isBlankOrNull(3)); } } scanner.close(); diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestStorages.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestStorages.java index 790ac4ab58..2275204662 100644 --- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestStorages.java +++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestStorages.java @@ -302,10 +302,10 @@ public void testProjection() throws IOException { || storeType == StoreType.PARQUET || storeType == StoreType.SEQUENCEFILE || storeType == StoreType.AVRO) { - assertTrue(tuple.get(0) == null); + assertTrue(tuple.isBlankOrNull(0)); } - assertTrue(tupleCnt + 2 == tuple.get(1).asInt8()); - assertTrue(tupleCnt + 3 == tuple.get(2).asFloat4()); + assertTrue(tupleCnt + 2 == tuple.getInt8(1)); + assertTrue(tupleCnt + 3 == tuple.getFloat4(2)); tupleCnt++; } scanner.close(); @@ -349,7 +349,7 @@ public void testVariousTypes() throws IOException { QueryId queryid = new QueryId("12345", 5); ProtobufDatumFactory factory = ProtobufDatumFactory.get(TajoIdProtos.QueryIdProto.class.getName()); - Tuple tuple = new VTuple(11 + (handleProtobuf ? 1 : 0)); + VTuple tuple = new VTuple(11 + (handleProtobuf ? 1 : 0)); tuple.put(new Datum[] { DatumFactory.createBool(true), DatumFactory.createChar("hyunsik"), @@ -379,7 +379,7 @@ public void testVariousTypes() throws IOException { Tuple retrieved; while ((retrieved = scanner.next()) != null) { for (int i = 0; i < tuple.size(); i++) { - assertEquals(tuple.get(i), retrieved.get(i)); + assertEquals(tuple.get(i), retrieved.asDatum(i)); } } scanner.close(); @@ -426,7 +426,7 @@ public void testNullHandlingTypes() throws IOException { QueryId queryid = new QueryId("12345", 5); ProtobufDatumFactory factory = ProtobufDatumFactory.get(TajoIdProtos.QueryIdProto.class.getName()); int columnNum = 11 + (handleProtobuf ? 1 : 0); - Tuple seedTuple = new VTuple(columnNum); + VTuple seedTuple = new VTuple(columnNum); seedTuple.put(new Datum[]{ DatumFactory.createBool(true), // 0 DatumFactory.createChar("hyunsik"), // 2 @@ -472,9 +472,9 @@ public void testNullHandlingTypes() throws IOException { assertEquals(columnNum, retrieved.size()); for (int j = 0; j < columnNum; j++) { if (i == j) { - assertEquals(NullDatum.get(), retrieved.get(j)); + assertEquals(NullDatum.get(), retrieved.asDatum(j)); } else { - assertEquals(seedTuple.get(j), retrieved.get(j)); + assertEquals(seedTuple.get(j), retrieved.asDatum(j)); } } @@ -515,8 +515,7 @@ public void testRCFileTextSerializeDeserialize() throws IOException { QueryId queryid = new QueryId("12345", 5); ProtobufDatumFactory factory = ProtobufDatumFactory.get(TajoIdProtos.QueryIdProto.class.getName()); - Tuple tuple = new VTuple(13); - tuple.put(new Datum[] { + VTuple tuple = new VTuple(new Datum[] { DatumFactory.createBool(true), DatumFactory.createBit((byte) 0x99), DatumFactory.createChar("jinho"), @@ -545,7 +544,7 @@ public void testRCFileTextSerializeDeserialize() throws IOException { Tuple retrieved; while ((retrieved=scanner.next()) != null) { for (int i = 0; i < tuple.size(); i++) { - assertEquals(tuple.get(i), retrieved.get(i)); + assertEquals(tuple.get(i), retrieved.asDatum(i)); } } scanner.close(); @@ -585,8 +584,7 @@ public void testRCFileBinarySerializeDeserialize() throws IOException { QueryId queryid = new QueryId("12345", 5); ProtobufDatumFactory factory = ProtobufDatumFactory.get(TajoIdProtos.QueryIdProto.class.getName()); - Tuple tuple = new VTuple(13); - tuple.put(new Datum[] { + VTuple tuple = new VTuple(new Datum[] { DatumFactory.createBool(true), DatumFactory.createBit((byte) 0x99), DatumFactory.createChar("jinho"), @@ -615,7 +613,7 @@ public void testRCFileBinarySerializeDeserialize() throws IOException { Tuple retrieved; while ((retrieved=scanner.next()) != null) { for (int i = 0; i < tuple.size(); i++) { - assertEquals(tuple.get(i), retrieved.get(i)); + assertEquals(tuple.get(i), retrieved.asDatum(i)); } } scanner.close(); @@ -655,8 +653,7 @@ public void testSequenceFileTextSerializeDeserialize() throws IOException { QueryId queryid = new QueryId("12345", 5); ProtobufDatumFactory factory = ProtobufDatumFactory.get(TajoIdProtos.QueryIdProto.class.getName()); - Tuple tuple = new VTuple(13); - tuple.put(new Datum[] { + VTuple tuple = new VTuple(new Datum[] { DatumFactory.createBool(true), DatumFactory.createBit((byte) 0x99), DatumFactory.createChar("jinho"), @@ -689,7 +686,7 @@ public void testSequenceFileTextSerializeDeserialize() throws IOException { Tuple retrieved; while ((retrieved=scanner.next()) != null) { for (int i = 0; i < tuple.size(); i++) { - assertEquals(tuple.get(i), retrieved.get(i)); + assertEquals(tuple.get(i), retrieved.asDatum(i)); } } scanner.close(); @@ -729,7 +726,7 @@ public void testSequenceFileBinarySerializeDeserialize() throws IOException { QueryId queryid = new QueryId("12345", 5); ProtobufDatumFactory factory = ProtobufDatumFactory.get(TajoIdProtos.QueryIdProto.class.getName()); - Tuple tuple = new VTuple(13); + VTuple tuple = new VTuple(13); tuple.put(new Datum[] { DatumFactory.createBool(true), DatumFactory.createBit((byte) 0x99), @@ -763,7 +760,7 @@ public void testSequenceFileBinarySerializeDeserialize() throws IOException { Tuple retrieved; while ((retrieved=scanner.next()) != null) { for (int i = 0; i < tuple.size(); i++) { - assertEquals(tuple.get(i), retrieved.get(i)); + assertEquals(tuple.get(i), retrieved.asDatum(i)); } } scanner.close(); @@ -787,8 +784,7 @@ public void testTime() throws IOException { Appender appender = sm.getAppender(meta, schema, tablePath); appender.init(); - Tuple tuple = new VTuple(3); - tuple.put(new Datum[]{ + VTuple tuple = new VTuple(new Datum[]{ DatumFactory.createDate("1980-04-01"), DatumFactory.createTime("12:34:56"), DatumFactory.createTimestmpDatumWithUnixTime((int)(System.currentTimeMillis() / 1000)) @@ -805,7 +801,7 @@ public void testTime() throws IOException { Tuple retrieved; while ((retrieved = scanner.next()) != null) { for (int i = 0; i < tuple.size(); i++) { - assertEquals(tuple.get(i), retrieved.get(i)); + assertEquals(tuple.get(i), retrieved.asDatum(i)); } } scanner.close(); @@ -921,8 +917,7 @@ int record = 4 + 8 + 2 + 5 + 8; // required size is 27 appender.init(); - Tuple tuple = new VTuple(5); - tuple.put(new Datum[]{ + VTuple tuple = new VTuple(new Datum[]{ DatumFactory.createFloat4(Float.MAX_VALUE), DatumFactory.createFloat8(Double.MAX_VALUE), DatumFactory.createInt2(Short.MAX_VALUE), @@ -942,7 +937,7 @@ int record = 4 + 8 + 2 + 5 + 8; // required size is 27 Tuple retrieved; while ((retrieved = scanner.next()) != null) { for (int i = 0; i < tuple.size(); i++) { - assertEquals(tuple.get(i), retrieved.get(i)); + assertEquals(tuple.get(i), retrieved.asDatum(i)); } } scanner.close(); diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestBSTIndex.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestBSTIndex.java index 068f7264a3..887aceba59 100644 --- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestBSTIndex.java +++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestBSTIndex.java @@ -136,8 +136,8 @@ public void testFindValue() throws IOException { tuple = scanner.next(); if (tuple == null) break; - keyTuple.put(0, tuple.get(1)); - keyTuple.put(1, tuple.get(2)); + keyTuple.put(0, tuple.asDatum(1)); + keyTuple.put(1, tuple.asDatum(2)); creater.write(keyTuple, offset); } @@ -157,8 +157,8 @@ public void testFindValue() throws IOException { long offsets = reader.find(tuple); scanner.seek(offsets); tuple = scanner.next(); - assertTrue("seek check [" + (i) + " ," + (tuple.get(1).asInt8()) + "]", (i) == (tuple.get(1).asInt8())); - assertTrue("seek check [" + (i) + " ," + (tuple.get(2).asFloat8()) + "]", (i) == (tuple.get(2).asFloat8())); + assertTrue("seek check [" + (i) + " ," + (tuple.getInt8(1)) + "]", (i) == (tuple.getInt8(1))); + assertTrue("seek check [" + (i) + " ," + (tuple.getFloat8(2)) + "]", (i) == (tuple.getFloat8(2))); offsets = reader.next(); if (offsets == -1) { @@ -166,8 +166,8 @@ public void testFindValue() throws IOException { } scanner.seek(offsets); tuple = scanner.next(); - assertTrue("[seek check " + (i + 1) + " ]", (i + 1) == (tuple.get(0).asInt4())); - assertTrue("[seek check " + (i + 1) + " ]", (i + 1) == (tuple.get(1).asInt8())); + assertTrue("[seek check " + (i + 1) + " ]", (i + 1) == (tuple.getInt4(0))); + assertTrue("[seek check " + (i + 1) + " ]", (i + 1) == (tuple.getInt8(1))); } reader.close(); scanner.close(); @@ -236,8 +236,8 @@ public void testBuildIndexWithAppender() throws IOException { long offsets = reader.find(tuple); scanner.seek(offsets); tuple = scanner.next(); - assertTrue("[seek check " + (i) + " ]", (i) == (tuple.get(1).asInt8())); - assertTrue("[seek check " + (i) + " ]", (i) == (tuple.get(2).asFloat8())); + assertTrue("[seek check " + (i) + " ]", (i) == (tuple.getInt8(1))); + assertTrue("[seek check " + (i) + " ]", (i) == (tuple.getFloat8(2))); offsets = reader.next(); if (offsets == -1) { @@ -245,8 +245,8 @@ public void testBuildIndexWithAppender() throws IOException { } scanner.seek(offsets); tuple = scanner.next(); - assertTrue("[seek check " + (i + 1) + " ]", (i + 1) == (tuple.get(0).asInt4())); - assertTrue("[seek check " + (i + 1) + " ]", (i + 1) == (tuple.get(1).asInt8())); + assertTrue("[seek check " + (i + 1) + " ]", (i + 1) == (tuple.getInt4(0))); + assertTrue("[seek check " + (i + 1) + " ]", (i + 1) == (tuple.getInt8(1))); } reader.close(); scanner.close(); @@ -301,8 +301,8 @@ public void testFindOmittedValue() throws IOException { tuple = scanner.next(); if (tuple == null) break; - keyTuple.put(0, tuple.get(1)); - keyTuple.put(1, tuple.get(2)); + keyTuple.put(0, tuple.asDatum(1)); + keyTuple.put(1, tuple.asDatum(2)); creater.write(keyTuple, offset); } @@ -372,8 +372,8 @@ public void testFindNextKeyValue() throws IOException { tuple = scanner.next(); if (tuple == null) break; - keyTuple.put(0, tuple.get(0)); - keyTuple.put(1, tuple.get(1)); + keyTuple.put(0, tuple.asDatum(0)); + keyTuple.put(1, tuple.asDatum(1)); creater.write(keyTuple, offset); } @@ -396,8 +396,8 @@ public void testFindNextKeyValue() throws IOException { scanner.seek(offsets); result = scanner.next(); assertTrue("[seek check " + (i + 1) + " ]", - (i + 1) == (result.get(0).asInt4())); - assertTrue("[seek check " + (i + 1) + " ]", (i + 1) == (result.get(1).asInt8())); + (i + 1) == (result.getInt4(0))); + assertTrue("[seek check " + (i + 1) + " ]", (i + 1) == (result.getInt8(1))); offsets = reader.next(); if (offsets == -1) { @@ -405,8 +405,8 @@ public void testFindNextKeyValue() throws IOException { } scanner.seek(offsets); result = scanner.next(); - assertTrue("[seek check " + (i + 2) + " ]", (i + 2) == (result.get(0).asInt8())); - assertTrue("[seek check " + (i + 2) + " ]", (i + 2) == (result.get(1).asFloat8())); + assertTrue("[seek check " + (i + 2) + " ]", (i + 2) == (result.getInt8(0))); + assertTrue("[seek check " + (i + 2) + " ]", (i + 2) == (result.getFloat8(1))); } reader.close(); scanner.close(); @@ -463,8 +463,8 @@ public void testFindNextKeyOmittedValue() throws IOException { tuple = scanner.next(); if (tuple == null) break; - keyTuple.put(0, tuple.get(0)); - keyTuple.put(1, tuple.get(1)); + keyTuple.put(0, tuple.asDatum(0)); + keyTuple.put(1, tuple.asDatum(1)); creater.write(keyTuple, offset); } @@ -486,8 +486,8 @@ public void testFindNextKeyOmittedValue() throws IOException { long offsets = reader.find(keyTuple, true); scanner.seek(offsets); result = scanner.next(); - assertTrue("[seek check " + (i + 1) + " ]", (i + 1) == (result.get(0).asInt4())); - assertTrue("[seek check " + (i + 1) + " ]", (i + 1) == (result.get(1).asInt8())); + assertTrue("[seek check " + (i + 1) + " ]", (i + 1) == (result.getInt4(0))); + assertTrue("[seek check " + (i + 1) + " ]", (i + 1) == (result.getInt8(1))); } scanner.close(); } @@ -542,8 +542,8 @@ public void testFindMinValue() throws IOException { tuple = scanner.next(); if (tuple == null) break; - keyTuple.put(0, tuple.get(1)); - keyTuple.put(1, tuple.get(2)); + keyTuple.put(0, tuple.asDatum(1)); + keyTuple.put(1, tuple.asDatum(2)); creater.write(keyTuple, offset); } @@ -569,8 +569,8 @@ public void testFindMinValue() throws IOException { assertTrue(offset >= 0); scanner.seek(offset); tuple = scanner.next(); - assertEquals(5, tuple.get(1).asInt4()); - assertEquals(5l, tuple.get(2).asInt8()); + assertEquals(5, tuple.getInt4(1)); + assertEquals(5l, tuple.getInt8(2)); reader.close(); scanner.close(); } @@ -625,8 +625,8 @@ public void testMinMax() throws IOException { tuple = scanner.next(); if (tuple == null) break; - keyTuple.put(0, tuple.get(0)); - keyTuple.put(1, tuple.get(1)); + keyTuple.put(0, tuple.asDatum(0)); + keyTuple.put(1, tuple.asDatum(1)); creater.write(keyTuple, offset); } @@ -639,12 +639,12 @@ public void testMinMax() throws IOException { reader.open(); Tuple min = reader.getFirstKey(); - assertEquals(5, min.get(0).asInt4()); - assertEquals(5l, min.get(0).asInt8()); + assertEquals(5, min.getInt4(0)); + assertEquals(5l, min.getInt8(0)); Tuple max = reader.getLastKey(); - assertEquals(TUPLE_NUM - 1, max.get(0).asInt4()); - assertEquals(TUPLE_NUM - 1, max.get(0).asInt8()); + assertEquals(TUPLE_NUM - 1, max.getInt4(0)); + assertEquals(TUPLE_NUM - 1, max.getInt8(0)); reader.close(); } @@ -730,8 +730,8 @@ public void testConcurrentAccess() throws IOException, InterruptedException { tuple = scanner.next(); if (tuple == null) break; - keyTuple.put(0, tuple.get(0)); - keyTuple.put(1, tuple.get(1)); + keyTuple.put(0, tuple.asDatum(0)); + keyTuple.put(1, tuple.asDatum(1)); creater.write(keyTuple, offset); } @@ -811,8 +811,8 @@ public void testFindValueDescOrder() throws IOException { tuple = scanner.next(); if (tuple == null) break; - keyTuple.put(0, tuple.get(1)); - keyTuple.put(1, tuple.get(2)); + keyTuple.put(0, tuple.asDatum(1)); + keyTuple.put(1, tuple.asDatum(2)); creater.write(keyTuple, offset); } @@ -834,8 +834,8 @@ public void testFindValueDescOrder() throws IOException { long offsets = reader.find(tuple); scanner.seek(offsets); tuple = scanner.next(); - assertTrue("seek check [" + (i) + " ," + (tuple.get(1).asInt8()) + "]", (i) == (tuple.get(1).asInt8())); - assertTrue("seek check [" + (i) + " ," + (tuple.get(2).asFloat8()) + "]", (i) == (tuple.get(2).asFloat8())); + assertTrue("seek check [" + (i) + " ," + (tuple.getInt8(1)) + "]", (i) == (tuple.getInt8(1))); + assertTrue("seek check [" + (i) + " ," + (tuple.getFloat8(2)) + "]", (i) == (tuple.getFloat8(2))); offsets = reader.next(); if (offsets == -1) { @@ -843,8 +843,8 @@ public void testFindValueDescOrder() throws IOException { } scanner.seek(offsets); tuple = scanner.next(); - assertTrue("[seek check " + (i - 1) + " ]", (i - 1) == (tuple.get(0).asInt4())); - assertTrue("[seek check " + (i - 1) + " ]", (i - 1) == (tuple.get(1).asInt8())); + assertTrue("[seek check " + (i - 1) + " ]", (i - 1) == (tuple.getInt4(0))); + assertTrue("[seek check " + (i - 1) + " ]", (i - 1) == (tuple.getInt8(1))); } reader.close(); scanner.close(); @@ -901,8 +901,8 @@ public void testFindNextKeyValueDescOrder() throws IOException { tuple = scanner.next(); if (tuple == null) break; - keyTuple.put(0, tuple.get(0)); - keyTuple.put(1, tuple.get(1)); + keyTuple.put(0, tuple.asDatum(0)); + keyTuple.put(1, tuple.asDatum(1)); creater.write(keyTuple, offset); } @@ -930,8 +930,8 @@ public void testFindNextKeyValueDescOrder() throws IOException { scanner.seek(offsets); result = scanner.next(); assertTrue("[seek check " + (i - 1) + " ]", - (i - 1) == (result.get(0).asInt4())); - assertTrue("[seek check " + (i - 1) + " ]", (i - 1) == (result.get(1).asInt8())); + (i - 1) == (result.getInt4(0))); + assertTrue("[seek check " + (i - 1) + " ]", (i - 1) == (result.getInt8(1))); offsets = reader.next(); if (offsets == -1) { @@ -939,8 +939,8 @@ public void testFindNextKeyValueDescOrder() throws IOException { } scanner.seek(offsets); result = scanner.next(); - assertTrue("[seek check " + (i - 2) + " ]", (i - 2) == (result.get(0).asInt8())); - assertTrue("[seek check " + (i - 2) + " ]", (i - 2) == (result.get(1).asFloat8())); + assertTrue("[seek check " + (i - 2) + " ]", (i - 2) == (result.getInt8(0))); + assertTrue("[seek check " + (i - 2) + " ]", (i - 2) == (result.getFloat8(1))); } reader.close(); scanner.close(); diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestSingleCSVFileBSTIndex.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestSingleCSVFileBSTIndex.java index d7c9f49d45..f9096e4d96 100644 --- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestSingleCSVFileBSTIndex.java +++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestSingleCSVFileBSTIndex.java @@ -123,8 +123,8 @@ public void testFindValueInSingleCSV() throws IOException { if (tuple == null) break; - keyTuple.put(0, tuple.get(1)); - keyTuple.put(1, tuple.get(2)); + keyTuple.put(0, tuple.asDatum(1)); + keyTuple.put(1, tuple.asDatum(2)); creater.write(keyTuple, offset); } @@ -144,8 +144,8 @@ public void testFindValueInSingleCSV() throws IOException { long offsets = reader.find(tuple); fileScanner.seek(offsets); tuple = fileScanner.next(); - assertEquals(i, (tuple.get(1).asInt8())); - assertEquals(i, (tuple.get(2).asFloat8()) , 0.01); + assertEquals(i, (tuple.getInt8(1))); + assertEquals(i, (tuple.getFloat8(2)) , 0.01); offsets = reader.next(); if (offsets == -1) { @@ -154,9 +154,9 @@ public void testFindValueInSingleCSV() throws IOException { fileScanner.seek(offsets); tuple = fileScanner.next(); assertTrue("[seek check " + (i + 1) + " ]", - (i + 1) == (tuple.get(0).asInt4())); + (i + 1) == (tuple.getInt4(0))); assertTrue("[seek check " + (i + 1) + " ]", - (i + 1) == (tuple.get(1).asInt8())); + (i + 1) == (tuple.getInt8(1))); } } @@ -211,8 +211,8 @@ public void testFindNextKeyValueInSingleCSV() throws IOException { tuple = fileScanner.next(); if (tuple == null) break; - keyTuple.put(0, tuple.get(0)); - keyTuple.put(1, tuple.get(1)); + keyTuple.put(0, tuple.asDatum(0)); + keyTuple.put(1, tuple.asDatum(1)); creater.write(keyTuple, offset); } @@ -232,8 +232,8 @@ public void testFindNextKeyValueInSingleCSV() throws IOException { long offsets = reader.find(keyTuple, true); fileScanner.seek(offsets); result = fileScanner.next(); - assertTrue("[seek check " + (i + 1) + " ]" , (i + 1) == (result.get(0).asInt4())); - assertTrue("[seek check " + (i + 1) + " ]" , (i + 1) == (result.get(1).asInt8())); + assertTrue("[seek check " + (i + 1) + " ]" , (i + 1) == (result.getInt4(0))); + assertTrue("[seek check " + (i + 1) + " ]" , (i + 1) == (result.getInt8(1))); offsets = reader.next(); if (offsets == -1) { @@ -241,8 +241,8 @@ public void testFindNextKeyValueInSingleCSV() throws IOException { } fileScanner.seek(offsets); result = fileScanner.next(); - assertTrue("[seek check " + (i + 2) + " ]" , (i + 2) == (result.get(0).asInt8())); - assertTrue("[seek check " + (i + 2) + " ]" , (i + 2) == (result.get(1).asFloat8())); + assertTrue("[seek check " + (i + 2) + " ]" , (i + 2) == (result.getInt8(0))); + assertTrue("[seek check " + (i + 2) + " ]" , (i + 2) == (result.getFloat8(1))); } } } diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/json/TestJsonSerDe.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/json/TestJsonSerDe.java index 70282d9a9b..22fe5e2916 100644 --- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/json/TestJsonSerDe.java +++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/json/TestJsonSerDe.java @@ -81,8 +81,7 @@ public void testVarioutType() throws IOException { assertNull(scanner.next()); scanner.close(); - Tuple baseTuple = new VTuple(11); - baseTuple.put(new Datum[] { + Tuple baseTuple = new VTuple(new Datum[] { DatumFactory.createBool(true), // 0 DatumFactory.createChar("hyunsik"), // 1 DatumFactory.createInt2((short) 17), // 2 diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/parquet/TestReadWrite.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/parquet/TestReadWrite.java index 109fed9a72..e63230d2fd 100644 --- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/parquet/TestReadWrite.java +++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/parquet/TestReadWrite.java @@ -104,6 +104,6 @@ public void testAll() throws Exception { assertEquals(new Double(4.1), new Double(tuple.getFloat8(7))); assertTrue(HELLO.equals(tuple.getText(8))); assertArrayEquals(HELLO.getBytes(Charsets.UTF_8), tuple.getBytes(9)); - assertEquals(NullDatum.get(), tuple.get(10)); + assertTrue(tuple.isBlankOrNull(10)); } }