blob: 983d086979bd02af1b24f99ac04e8678aa5c7024 [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.phoenix.end2end;
import static org.apache.phoenix.util.PhoenixRuntime.CURRENT_SCN_ATTRIB;
import static org.apache.phoenix.util.TestUtil.ATABLE_NAME;
import static org.apache.phoenix.util.TestUtil.ROW1;
import static org.apache.phoenix.util.TestUtil.ROW2;
import static org.apache.phoenix.util.TestUtil.ROW3;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.Properties;
import org.apache.phoenix.query.QueryConstants;
import org.apache.phoenix.util.DateUtil;
import org.junit.Test;
public class TruncateFunctionIT extends BaseClientManagedTimeIT {
private static final String DS1 = "1970-01-10 00:58:01.587";
private static final String DS2 = "1970-01-20 01:02:45.906";
private static final String DS3 = "1970-01-30 01:30:24.353";
private static Date toDate(String s) throws ParseException {
return DateUtil.parseDate(s);
}
private static Timestamp toTimestamp(String s) throws ParseException {
return DateUtil.parseTimestamp(s);
}
@Test
public void testTruncate() throws Exception {
long ts = nextTimestamp();
String tenantId = getOrganizationId();
ensureTableCreated(getUrl(), ATABLE_NAME,ATABLE_NAME, ts-5);
Properties props = new Properties();
props.setProperty(CURRENT_SCN_ATTRIB, Long.toString(ts-3));
Connection conn = DriverManager.getConnection(getUrl(), props);
try {
PreparedStatement stmt = conn.prepareStatement(
"upsert into " +
"ATABLE(" +
" ORGANIZATION_ID, " +
" ENTITY_ID, " +
" A_DATE, " +
" A_TIMESTAMP)" +
"VALUES (?, ?, ?, ?)");
stmt.setString(1, tenantId);
stmt.setString(2, ROW1);
stmt.setDate(3, toDate(DS1));
stmt.setTimestamp(4, toTimestamp(DS1));
stmt.execute();
stmt.setString(1, tenantId);
stmt.setString(2, ROW2);
stmt.setDate(3, toDate(DS2));
stmt.setTimestamp(4, toTimestamp(DS2));
stmt.execute();
stmt.setString(1, tenantId);
stmt.setString(2, ROW3);
stmt.setDate(3, toDate(DS3));
stmt.setTimestamp(4, toTimestamp(DS3));
stmt.execute();
conn.commit();
conn.close();
props.setProperty(CURRENT_SCN_ATTRIB, Long.toString(ts+1));
conn = DriverManager.getConnection(getUrl(), props);
String query = "SELECT entity_id, trunc(a_date, 'day', 7), trunc(a_timestamp, 'second', 10) FROM ATABLE WHERE organization_id = ?";
PreparedStatement statement = conn.prepareStatement(query);
statement.setString(1, tenantId);
ResultSet rs = statement.executeQuery();
assertTrue (rs.next());
assertEquals(ROW1, rs.getString(1));
assertEquals(new Date((long) 7 * QueryConstants.MILLIS_IN_DAY), rs.getDate(2));
assertEquals(toTimestamp("1970-01-10 00:58:00.000"), rs.getTimestamp(3));
assertTrue (rs.next());
assertEquals(ROW2, rs.getString(1));
assertEquals(new Date((long) 14 * QueryConstants.MILLIS_IN_DAY), rs.getDate(2));
assertEquals(toTimestamp("1970-01-20 01:02:40.000"), rs.getTimestamp(3));
assertTrue (rs.next());
assertEquals(ROW3, rs.getString(1));
assertEquals(new Date((long) 28 * QueryConstants.MILLIS_IN_DAY), rs.getDate(2));
assertEquals(toTimestamp("1970-01-30 01:30:20.000"), rs.getTimestamp(3));
assertFalse(rs.next());
} finally {
conn.close();
}
}
}