You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2013/12/28 07:36:03 UTC

[06/50] [abbrv] git commit: TAJO-61: Implement Time Datum Type. (DaeMyung Kang via hyunsik)

TAJO-61: Implement Time Datum Type. (DaeMyung Kang via hyunsik)


Project: http://git-wip-us.apache.org/repos/asf/incubator-tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tajo/commit/2ff0eeac
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tajo/tree/2ff0eeac
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tajo/diff/2ff0eeac

Branch: refs/heads/DAG-execplan
Commit: 2ff0eeaccb1ff37c5f54d1ac8aafedda7bdf6855
Parents: 0ee6b24
Author: Hyunsik Choi <hy...@apache.org>
Authored: Thu Dec 12 10:13:13 2013 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Thu Dec 12 10:13:13 2013 +0900

----------------------------------------------------------------------
 CHANGES.txt                                     |   2 +
 .../org/apache/tajo/datum/DatumFactory.java     |  15 ++-
 .../java/org/apache/tajo/datum/TimeDatum.java   | 135 +++++++++++++++++++
 .../org/apache/tajo/json/CommonGsonHelper.java  |   2 +
 .../org/apache/tajo/json/TimeDatumAdapter.java  |  41 ++++++
 .../org/apache/tajo/datum/TestTimeDatum.java    | 111 +++++++++++++++
 6 files changed, 305 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2ff0eeac/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 1047c9f..3c4fbd0 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -4,6 +4,8 @@ Release 0.8.0 - unreleased
 
   NEW FEATURES
 
+    TAJO-61: Implement Time Datum Type. (DaeMyung Kang via hyunsik)
+
     TAJO-60: Implement Date Datum Type. (hyunsik)
 
     TAJO-400: Implement pow(float8, float8) function. (DaeMyung Kang via jaehwa)

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2ff0eeac/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
index d25c7d8..b4c9f17 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
@@ -23,6 +23,7 @@ import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.util.Bytes;
 import org.joda.time.LocalDate;
+import org.joda.time.LocalTime;
 
 import java.io.IOException;
 
@@ -50,6 +51,8 @@ public class DatumFactory {
         return TimestampDatum.class;
       case DATE:
         return DateDatum.class;
+      case TIME:
+        return TimeDatum.class;
       case BIT:
         return BitDatum.class;
       case BLOB:
@@ -86,6 +89,8 @@ public class DatumFactory {
         return createText(bytes);
       case DATE:
         return new DateDatum(bytes);
+      case TIME:
+        return new TimeDatum(bytes);
       case TIMESTAMP:
         return new TimestampDatum(bytes);
       case BIT:
@@ -216,6 +221,14 @@ public class DatumFactory {
     return new DateDatum(LocalDate.parse(dateStr));
   }
 
+  public static TimeDatum createTime(long instance) {
+    return new TimeDatum(instance);
+  }
+
+  public static TimeDatum createTime(String dateStr) {
+    return new TimeDatum(LocalTime.parse(dateStr));
+  }
+
   public static TimestampDatum createTimeStamp(long instance) {
     return new TimestampDatum(instance);
   }
@@ -251,4 +264,4 @@ public class DatumFactory {
   public static Inet4Datum createInet4(String val) {
     return new Inet4Datum(val);
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2ff0eeac/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
new file mode 100644
index 0000000..7ea0d47
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
@@ -0,0 +1,135 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tajo.datum;
+
+import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.datum.exception.InvalidCastException;
+import org.apache.tajo.datum.exception.InvalidOperationException;
+import org.apache.tajo.util.Bytes;
+import org.joda.time.LocalTime;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+
+public class TimeDatum extends Datum {
+  public static final int SIZE = 8;
+  /** ISO 8601/SQL standard format - ex) 07:37:16-08 */
+  public static final String DEFAULT_FORMAT_STRING = "HH:mm:ss";
+  private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormat.forPattern(DEFAULT_FORMAT_STRING);
+  private LocalTime time;
+
+  public TimeDatum(long value) {
+    super(TajoDataTypes.Type.TIME);
+    time = new LocalTime(value);
+  }
+
+  public TimeDatum(LocalTime time) {
+    super(TajoDataTypes.Type.TIME);
+    this.time = time;
+  }
+
+  public TimeDatum(byte [] bytes) {
+    this(Bytes.toLong(bytes));
+  }
+
+  public int getHourOfDay() {
+    return time.getHourOfDay();
+  }
+
+  public int getMinuteOfHour() {
+    return time.getMinuteOfHour();
+  }
+
+  public int getSecondOfMinute() {
+    return time.getSecondOfMinute();
+  }
+
+  public int getMillisOfDay() {
+    return time.getMillisOfDay();
+  }
+
+  public int getMillisOfSecond() {
+    return time.getMillisOfSecond();
+  }
+
+  public String toString() {
+    return asChars();
+  }
+
+  @Override
+  public int asInt4() {
+    throw new InvalidCastException();
+  }
+
+  @Override
+  public long asInt8() {
+    return time.toDateTimeToday().getMillis();
+  }
+
+  @Override
+  public float asFloat4() {
+    throw new InvalidCastException();
+  }
+
+  @Override
+  public double asFloat8() {
+    throw new InvalidCastException();
+  }
+
+  @Override
+  public String asChars() {
+    return time.toString(DEFAULT_FORMATTER);
+  }
+
+  public String toChars(String format) {
+    return time.toString(format);
+  }
+
+  @Override
+  public int size() {
+    return SIZE;
+  }
+
+  @Override
+  public byte [] asByteArray() {
+    return Bytes.toBytes(asInt8());
+  }
+
+  @Override
+  public int compareTo(Datum datum) {
+    if (datum.type() == TajoDataTypes.Type.TIME) {
+      return time.compareTo(((TimeDatum)datum).time);
+    } else {
+      throw new InvalidOperationException();
+    }
+  }
+
+  public boolean equals(Object obj) {
+    if (obj instanceof TimeDatum) {
+      TimeDatum another = (TimeDatum) obj;
+      return time.isEqual(another.time);
+    } else {
+      throw new InvalidOperationException();
+    }
+  }
+
+  @Override
+  public int hashCode() {
+    return time.hashCode();
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2ff0eeac/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java b/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java
index fb32959..947c5a3 100644
--- a/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java
+++ b/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java
@@ -21,6 +21,7 @@ package org.apache.tajo.json;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import org.apache.tajo.datum.DateDatum;
+import org.apache.tajo.datum.TimeDatum;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.TimestampDatum;
 import org.apache.tajo.util.TUtil;
@@ -40,6 +41,7 @@ public class CommonGsonHelper {
     adapters.put(Datum.class, new DatumAdapter());
     adapters.put(TimestampDatum.class, new TimestampDatumAdapter());
     adapters.put(DateDatum.class, new DateDatumAdapter());
+    adapters.put(TimeDatum.class, new TimeDatumAdapter());
 
     return adapters;
 	}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2ff0eeac/tajo-common/src/main/java/org/apache/tajo/json/TimeDatumAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/TimeDatumAdapter.java b/tajo-common/src/main/java/org/apache/tajo/json/TimeDatumAdapter.java
new file mode 100644
index 0000000..603c2e0
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/json/TimeDatumAdapter.java
@@ -0,0 +1,41 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tajo.json;
+
+import com.google.gson.*;
+import org.apache.tajo.datum.TimeDatum;
+
+import java.lang.reflect.Type;
+
+public class TimeDatumAdapter implements GsonSerDerAdapter<TimeDatum> {
+
+	@Override
+	public TimeDatum deserialize(JsonElement json, Type typeOfT,
+                                    JsonDeserializationContext context) throws JsonParseException {
+		JsonObject jsonObject = json.getAsJsonObject();
+		return new TimeDatum(jsonObject.get("val").getAsLong());
+	}
+
+	@Override
+	public JsonElement serialize(TimeDatum src, Type typeOfSrc, JsonSerializationContext context) {
+		JsonObject jsonObj = new JsonObject();
+		jsonObj.addProperty("val", src.asInt8());
+		return jsonObj;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/2ff0eeac/tajo-common/src/test/java/org/apache/tajo/datum/TestTimeDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/datum/TestTimeDatum.java b/tajo-common/src/test/java/org/apache/tajo/datum/TestTimeDatum.java
new file mode 100644
index 0000000..19bab9b
--- /dev/null
+++ b/tajo-common/src/test/java/org/apache/tajo/datum/TestTimeDatum.java
@@ -0,0 +1,111 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tajo.datum;
+
+import org.apache.tajo.common.TajoDataTypes.Type;
+import org.apache.tajo.datum.exception.InvalidCastException;
+import org.apache.tajo.json.CommonGsonHelper;
+import org.junit.Test;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+public class TestTimeDatum {
+  private static String TIME = "12:34:56";
+
+	@Test
+	public final void testType() {
+		Datum d = DatumFactory.createTime(TIME);
+    assertEquals(Type.TIME, d.type());
+	}
+
+  @Test(expected = InvalidCastException.class)
+	public final void testAsInt4() {
+    Datum d = DatumFactory.createTime(TIME);
+    Datum copy = DatumFactory.createTime(d.asInt4());
+    assertEquals(d, copy);
+	}
+
+	@Test
+	public final void testAsInt8() {
+    Datum d = DatumFactory.createTime(TIME);
+    Datum copy = DatumFactory.createTime(d.asInt8());
+    assertEquals(d, copy);
+	}
+
+  @Test(expected = InvalidCastException.class)
+	public final void testAsFloat4() {
+    Datum d = DatumFactory.createTime(TIME);
+    d.asFloat4();
+	}
+
+  @Test(expected = InvalidCastException.class)
+	public final void testAsFloat8() {
+    Datum d = DatumFactory.createTime(TIME);
+    d.asFloat8();
+	}
+
+	@Test
+	public final void testAsText() {
+    Datum d = DatumFactory.createTime(TIME);
+    Datum copy = DatumFactory.createTime(d.asChars());
+    assertEquals(d, copy);
+	}
+
+  @Test
+  public final void testAsByteArray() {
+    TimeDatum d = DatumFactory.createTime(TIME);
+    TimeDatum copy = new TimeDatum(d.asByteArray());
+    assertEquals(d.asInt8(), copy.asInt8());
+  }
+
+	@Test
+  public final void testSize() {
+    Datum d = DatumFactory.createTime(TIME);
+    assertEquals(TimeDatum.SIZE, d.asByteArray().length);
+  }
+
+  @Test
+  public final void testAsTextBytes() {
+    Datum d = DatumFactory.createTime(TIME);
+    assertArrayEquals(d.toString().getBytes(), d.asTextBytes());
+  }
+
+  @Test
+  public final void testToJson() {
+    Datum d = DatumFactory.createTime(TIME);
+    Datum copy = CommonGsonHelper.fromJson(d.toJson(), Datum.class);
+    assertEquals(d, copy);
+  }
+
+  @Test
+  public final void testInstance() {
+    TimeDatum d = DatumFactory.createTime(TIME);
+    TimeDatum copy = new TimeDatum(d.asInt8());
+    assertEquals(d, copy);
+  }
+
+  @Test
+  public final void testGetFields() {
+    TimeDatum d = DatumFactory.createTime(TIME);
+    assertEquals(12, d.getHourOfDay());
+    assertEquals(34, d.getMinuteOfHour());
+    assertEquals(56, d.getSecondOfMinute());
+  }
+}