blob: 2bbb92d323ccda3f86621384c4ff35f1aa0c3810 [file] [log] [blame]
/**
* 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.exception.InvalidOperationException;
import org.apache.tajo.exception.TajoRuntimeException;
import org.apache.tajo.json.CommonGsonHelper;
import org.apache.tajo.util.datetime.DateTimeUtil;
import org.junit.BeforeClass;
import org.junit.Test;
import java.util.Calendar;
import java.util.TimeZone;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;
public class TestTimestampDatum {
private static long javatime;
private static int unixtime;
private static Calendar calendar;
@BeforeClass
public static void setUp() {
javatime = System.currentTimeMillis();
calendar = Calendar.getInstance(TimeZone.getTimeZone("PST"));
calendar.setTimeInMillis(javatime);
unixtime = (int) (javatime / 1000);
}
@Test
public final void testType() {
Datum d = DatumFactory.createTimestampDatumWithUnixTime(unixtime);
assertEquals(Type.TIMESTAMP, d.type());
}
@Test(expected = TajoRuntimeException.class)
public final void testAsInt4() {
Datum d = DatumFactory.createTimestampDatumWithUnixTime(unixtime);
d.asInt4();
}
@Test
public final void testAsInt8() {
Datum d = DatumFactory.createTimestampDatumWithJavaMillis(unixtime * 1000);
long javaTime = unixtime * 1000;
assertEquals(DateTimeUtil.javaTimeToJulianTime(javaTime), d.asInt8());
}
@Test(expected = TajoRuntimeException.class)
public final void testAsFloat4() {
Datum d = DatumFactory.createTimestampDatumWithUnixTime(unixtime);
d.asFloat4();
}
@Test(expected = TajoRuntimeException.class)
public final void testAsFloat8() {
int instance = 1386577582;
Datum d = DatumFactory.createTimestampDatumWithUnixTime(instance);
d.asFloat8();
}
@Test
public final void testAsText() {
Datum d = DatumFactory.createTimestamp("1980-04-01 01:50:01");
Datum copy = DatumFactory.createTimestamp(d.asChars());
assertEquals(d, copy);
d = DatumFactory.createTimestamp("1980-04-01 01:50:01.10");
copy = DatumFactory.createTimestamp(d.asChars());
assertEquals(d, copy);
}
@Test
public void testAsText2() {
// TAJO-1366
TimestampDatum datum = DatumFactory.createTimestamp("Mon Nov 03 00:03:00 +0000 2014");
assertEquals("2014-11-03 00:03:00", TimestampDatum.asChars(datum.asTimeMeta(), TimeZone.getTimeZone("+0000"), true));
}
@Test
public final void testSize() {
Datum d = DatumFactory.createTimestampDatumWithUnixTime(unixtime);
assertEquals(TimestampDatum.SIZE, d.asByteArray().length);
}
@Test
public final void testAsTextBytes() {
Datum d = DatumFactory.createTimestamp("1980-04-01 01:50:01");
assertArrayEquals(d.toString().getBytes(), d.asTextBytes());
d = DatumFactory.createTimestamp("1980-04-01 01:50:01.578");
assertArrayEquals(d.toString().getBytes(), d.asTextBytes());
}
@Test
public final void testToJson() {
Datum d = DatumFactory.createTimestampDatumWithUnixTime(unixtime);
Datum copy = CommonGsonHelper.fromJson(d.toJson(), Datum.class);
assertEquals(d, copy);
}
@Test
public final void testTimeZone() {
TimestampDatum datum = new TimestampDatum(DateTimeUtil.toJulianTimestamp(2014, 5, 1, 15, 20, 30, 0));
assertEquals("2014-05-01 15:20:30", TimestampDatum.asChars(datum.asTimeMeta(), TimeZone.getTimeZone("GMT"), true));
assertEquals("2014-05-02 00:20:30+09", TimestampDatum.asChars(datum.asTimeMeta(), TimeZone.getTimeZone("GMT+9"), true));
}
@Test
public final void testTimestampConstructor() {
TimestampDatum datum = new TimestampDatum(DateTimeUtil.toJulianTimestamp(2014, 5, 1, 10, 20, 30, 0));
assertEquals(2014, datum.getYear());
assertEquals(5, datum.getMonthOfYear());
assertEquals(1, datum.getDayOfMonth());
assertEquals(10, datum.getHourOfDay());
assertEquals(20, datum.getMinuteOfHour());
assertEquals(30, datum.getSecondOfMinute());
TimestampDatum datum2 = DatumFactory.createTimestamp("2014-05-01 10:20:30");
assertEquals(datum2, datum);
datum = DatumFactory.createTimestamp("1980-04-01 01:50:01.123");
assertEquals(1980, datum.getYear());
assertEquals(4, datum.getMonthOfYear());
assertEquals(1, datum.getDayOfMonth());
assertEquals(1, datum.getHourOfDay());
assertEquals(50, datum.getMinuteOfHour());
assertEquals(1, datum.getSecondOfMinute());
assertEquals(123, datum.getMillisOfSecond());
datum = new TimestampDatum(DateTimeUtil.toJulianTimestamp(1014, 5, 1, 10, 20, 30, 0));
assertEquals(1014, datum.getYear());
assertEquals(5, datum.getMonthOfYear());
assertEquals(1, datum.getDayOfMonth());
assertEquals(10, datum.getHourOfDay());
assertEquals(20, datum.getMinuteOfHour());
assertEquals(30, datum.getSecondOfMinute());
datum2 = DatumFactory.createTimestamp("1014-05-01 10:20:30");
assertEquals(datum2, datum);
for (int i = 0; i < 100; i++) {
TimeZone timeZone = TimeZone.getTimeZone("GMT");
Calendar cal = Calendar.getInstance(timeZone);
long jTime = System.currentTimeMillis();
int uTime = (int)(jTime / 1000);
cal.setTimeInMillis(jTime);
long julianTimestamp = DateTimeUtil.javaTimeToJulianTime(jTime);
assertEquals(uTime, DateTimeUtil.julianTimeToEpoch(julianTimestamp));
assertEquals(jTime, DateTimeUtil.julianTimeToJavaTime(julianTimestamp));
TimestampDatum datum3 = DatumFactory.createTimestampDatumWithJavaMillis(jTime);
assertEquals(cal.get(Calendar.YEAR), datum3.getYear());
assertEquals(cal.get(Calendar.MONTH) + 1, datum3.getMonthOfYear());
assertEquals(cal.get(Calendar.DAY_OF_MONTH), datum3.getDayOfMonth());
datum3 = DatumFactory.createTimestampDatumWithUnixTime(uTime);
assertEquals(cal.get(Calendar.YEAR), datum3.getYear());
assertEquals(cal.get(Calendar.MONTH) + 1, datum3.getMonthOfYear());
assertEquals(cal.get(Calendar.DAY_OF_MONTH), datum3.getDayOfMonth());
}
}
@Test
public final void testNull() {
Datum d = DatumFactory.createTimestampDatumWithUnixTime(unixtime);
assertEquals(Boolean.FALSE,d.equals(DatumFactory.createNullDatum()));
assertEquals(DatumFactory.createNullDatum(),d.equalsTo(DatumFactory.createNullDatum()));
assertEquals(-1,d.compareTo(DatumFactory.createNullDatum()));
}
@Test
public void testCompareTo() {
TimestampDatum theday = DatumFactory.createTimestamp("2014-11-12 15:00:00.68");
TimestampDatum thedaybefore = DatumFactory.createTimestamp("2014-11-11 15:00:00.56");
assertThat(theday.compareTo(thedaybefore) > 0, is(true));
assertThat(thedaybefore.compareTo(theday) > 0, is(false));
}
@Test
public void testEqualsTo() {
TimestampDatum theday = DatumFactory.createTimestamp("2014-11-12 15:00:00.68");
assertTrue(theday.equalsTo(theday).asBool());
assertEquals(NullDatum.get(), theday.equalsTo(NullDatum.get()));
}
@Test(expected = InvalidOperationException.class)
public void testEqualsToInvalidCase() {
TimestampDatum theday = DatumFactory.createTimestamp("2014-11-12 15:00:00.68");
theday.equalsTo(new Int4Datum(123));
}
}