/*
* Licensed 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 com.facebook.presto.teradata.functions;
import com.facebook.presto.Session;
import com.facebook.presto.operator.scalar.AbstractTestFunctions;
import com.facebook.presto.spi.type.DateType;
import com.facebook.presto.spi.type.SqlDate;
import com.facebook.presto.spi.type.SqlTimestamp;
import com.facebook.presto.spi.type.TimeZoneKey;
import com.facebook.presto.spi.type.TimestampType;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import static com.facebook.presto.metadata.FunctionExtractor.extractFunctions;
import static com.facebook.presto.spi.type.TimeZoneKey.getTimeZoneKey;
import static com.facebook.presto.spi.type.VarcharType.VARCHAR;
import static com.facebook.presto.testing.TestingSession.testSessionBuilder;
import static com.facebook.presto.type.TimestampOperators.castToDate;
import static com.facebook.presto.util.DateTimeZoneIndex.getDateTimeZone;
import static java.lang.Math.toIntExact;
public class TestTeradataDateFunctions
extends AbstractTestFunctions
{
private static final TimeZoneKey TIME_ZONE_KEY = getTimeZoneKey("Asia/Kathmandu");
private static final DateTimeZone DATE_TIME_ZONE = getDateTimeZone(TIME_ZONE_KEY);
private static final Session SESSION = testSessionBuilder()
.setCatalog("catalog")
.setSchema("schema")
.setTimeZoneKey(TIME_ZONE_KEY)
.build();
protected TestTeradataDateFunctions()
{
super(SESSION);
}
@BeforeClass
public void setUp()
{
functionAssertions.addFunctions(extractFunctions(new TeradataFunctionsPlugin().getFunctions()));
}
@Test
public void testMinimalToDate()
{
assertDate("to_date('1988/04/08','yyyy/mm/dd')", 1988, 4, 8);
assertDate("to_date('04-08-1988','mm-dd-yyyy')", 1988, 4, 8);
assertDate("to_date('04.1988,08','mm.yyyy,dd')", 1988, 4, 8);
assertDate("to_date(';198804:08',';yyyymm:dd')", 1988, 4, 8);
}
@Test
public void testMinimalToTimestamp()
{
assertTimestamp("to_timestamp('1988/04/08','yyyy/mm/dd')", 1988, 4, 8, 0, 0, 0);
assertTimestamp("to_timestamp('04-08-1988','mm-dd-yyyy')", 1988, 4, 8, 0, 0, 0);
assertTimestamp("to_timestamp('04.1988,08','mm.yyyy,dd')", 1988, 4, 8, 0, 0, 0);
assertTimestamp("to_timestamp(';198804:08',';yyyymm:dd')", 1988, 4, 8, 0, 0, 0);
assertTimestamp("to_timestamp('1988/04/08 2','yyyy/mm/dd hh')", 1988, 4, 8, 2, 0, 0);
assertTimestamp("to_timestamp('1988/04/08 14','yyyy/mm/dd hh24')", 1988, 4, 8, 14, 0, 0);
assertTimestamp("to_timestamp('1988/04/08 14:15','yyyy/mm/dd hh24:mi')", 1988, 4, 8, 14, 15, 0);
assertTimestamp("to_timestamp('1988/04/08 14:15:16','yyyy/mm/dd hh24:mi:ss')", 1988, 4, 8, 14, 15, 16);
assertTimestamp("to_timestamp('1988/04/08 2:3:4','yyyy/mm/dd hh24:mi:ss')", 1988, 4, 8, 2, 3, 4);
assertTimestamp("to_timestamp('1988/04/08 02:03:04','yyyy/mm/dd hh24:mi:ss')", 1988, 4, 8, 2, 3, 4);
}
@Test
public void testMinimalToChar()
{
assertVarchar("to_char(TIMESTAMP '1988-04-08 02:03:04','yyyy/mm/dd hh:mi:ss')", "1988/04/08 02:03:04");
assertVarchar("to_char(TIMESTAMP '1988-04-08 02:03:04','yyyy/mm/dd hh24:mi:ss')", "1988/04/08 02:03:04");
assertVarchar("to_char(TIMESTAMP '1988-04-08 14:15:16','yyyy/mm/dd hh24:mi:ss')", "1988/04/08 14:15:16");
assertVarchar("to_char(TIMESTAMP '1988-04-08 14:15:16 +02:09','yyyy/mm/dd hh24:mi:ss')", "1988/04/08 14:15:16");
assertVarchar("to_char(DATE '1988-04-08','yyyy/mm/dd hh24:mi:ss')", "1988/04/08 00:00:00");
}
@Test
public void testYY()
{
assertVarchar("to_char(TIMESTAMP '1988-04-08','yy')", "88");
assertTimestamp("to_timestamp('88/04/08','yy/mm/dd')", 2088, 4, 8, 0, 0, 0);
assertDate("to_date('88/04/08','yy/mm/dd')", 2088, 4, 8);
}
// TODO: implement this feature SWARM-355
@Test(enabled = false)
public void testDefaultValues()
{
DateTime current = new DateTime();
assertDate("to_date('1988','yyyy')", 1988, current.getMonthOfYear(), 1);
assertDate("to_date('04','mm')", current.getYear(), 4, 1);
assertDate("to_date('8','dd')", current.getYear(), current.getMonthOfYear(), 8);
}
// TODO: implement this feature SWARM-354
@Test(enabled = false)
public void testCaseInsensitive()
{
assertDate("to_date('1988/04/08','YYYY/MM/DD')", 1988, 4, 8);
assertDate("to_date('1988/04/08','yYYy/mM/Dd')", 1988, 4, 8);
}
@Test
public void testWhitespace()
{
assertDate("to_date('8 04 1988','dd mm yyyy')", 1988, 4, 8);
}
// TODO: implement this feature SWARM-353
@Test(enabled = false)
public void testEscapedText()
{
assertDate("to_date('1988-04-08 TEXT','yyyy-mm-dd \"TEXT\"')", 1988, 4, 8);
}
private static SqlDate sqlDate(DateTime from)
{
int days = toIntExact(castToDate(SESSION.toConnectorSession(), from.getMillis()));
return new SqlDate(days);
}
private static SqlTimestamp toTimestamp(DateTime dateTime)
{
return new SqlTimestamp(dateTime.getMillis(), SESSION.getTimeZoneKey());
}
@SuppressWarnings("SameParameterValue")
private void assertTimestamp(String projection, int year, int month, int day, int hour, int minutes, int seconds)
{
assertFunction(
projection,
TimestampType.TIMESTAMP,
toTimestamp(new DateTime(year, month, day, hour, minutes, seconds, DATE_TIME_ZONE)));
}
private void assertDate(String projection, int year, int month, int day)
{
assertFunction(
projection,
DateType.DATE,
sqlDate(new DateTime(year, month, day, 0, 0, DATE_TIME_ZONE)));
}
private void assertVarchar(String projection, String expected)
{
assertFunction(projection, VARCHAR, expected);
}
}