/*
* 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.mongodb;
import com.facebook.presto.testing.MaterializedResult;
import com.facebook.presto.testing.MaterializedRow;
import com.facebook.presto.tests.AbstractTestIntegrationSmokeTest;
import org.joda.time.DateTime;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.sql.Timestamp;
import java.util.Date;
import static com.facebook.presto.mongodb.MongoQueryRunner.createMongoQueryRunner;
import static io.airlift.tpch.TpchTable.ORDERS;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.joda.time.DateTimeZone.UTC;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
@Test(singleThreaded = true)
public class TestMongoIntegrationSmokeTest
extends AbstractTestIntegrationSmokeTest
{
private MongoQueryRunner mongoQueryRunner;
public TestMongoIntegrationSmokeTest()
{
super(() -> createMongoQueryRunner(ORDERS));
}
@BeforeClass
public void setUp()
throws Exception
{
mongoQueryRunner = (MongoQueryRunner) getQueryRunner();
}
@AfterClass(alwaysRun = true)
public final void destroy()
{
mongoQueryRunner.shutdown();
mongoQueryRunner = null;
}
@Test
public void createTableWithEveryType()
throws Exception
{
String query = "" +
"CREATE TABLE test_types_table AS " +
"SELECT" +
" 'foo' _varchar" +
", cast('bar' as varbinary) _varbinary" +
", cast(1 as bigint) _bigint" +
", 3.14 _double" +
", true _boolean" +
", DATE '1980-05-07' _date" +
", TIMESTAMP '1980-05-07 11:22:33.456' _timestamp" +
", ObjectId('ffffffffffffffffffffffff') _objectid";
assertUpdate(query, 1);
MaterializedResult results = getQueryRunner().execute(getSession(), "SELECT * FROM test_types_table").toJdbcTypes();
assertEquals(results.getRowCount(), 1);
MaterializedRow row = results.getMaterializedRows().get(0);
assertEquals(row.getField(0), "foo");
assertEquals(row.getField(1), "bar".getBytes(UTF_8));
assertEquals(row.getField(2), 1L);
assertEquals(row.getField(3), 3.14);
assertEquals(row.getField(4), true);
assertEquals(row.getField(5), new Date(new DateTime(1980, 5, 7, 0, 0, 0, UTC).getMillis()));
assertEquals(row.getField(6), new Timestamp(new DateTime(1980, 5, 7, 11, 22, 33, 456, UTC).getMillis()));
assertUpdate("DROP TABLE test_types_table");
assertFalse(getQueryRunner().tableExists(getSession(), "test_types_table"));
}
@Test
public void testArrays()
throws Exception
{
assertUpdate("CREATE TABLE tmp_array1 AS SELECT ARRAY[1, 2, NULL] AS col", 1);
assertQuery("SELECT col[2] FROM tmp_array1", "SELECT 2");
assertQuery("SELECT col[3] FROM tmp_array1", "SELECT NULL");
assertUpdate("CREATE TABLE tmp_array2 AS SELECT ARRAY[1.0, 2.5, 3.5] AS col", 1);
assertQuery("SELECT col[2] FROM tmp_array2", "SELECT 2.5");
assertUpdate("CREATE TABLE tmp_array3 AS SELECT ARRAY['puppies', 'kittens', NULL] AS col", 1);
assertQuery("SELECT col[2] FROM tmp_array3", "SELECT 'kittens'");
assertQuery("SELECT col[3] FROM tmp_array3", "SELECT NULL");
assertUpdate("CREATE TABLE tmp_array4 AS SELECT ARRAY[TRUE, NULL] AS col", 1);
assertQuery("SELECT col[1] FROM tmp_array4", "SELECT TRUE");
assertQuery("SELECT col[2] FROM tmp_array4", "SELECT NULL");
assertUpdate("CREATE TABLE tmp_array5 AS SELECT ARRAY[ARRAY[1, 2], NULL, ARRAY[3, 4]] AS col", 1);
assertQuery("SELECT col[1][2] FROM tmp_array5", "SELECT 2");
assertUpdate("CREATE TABLE tmp_array6 AS SELECT ARRAY[ARRAY['\"hi\"'], NULL, ARRAY['puppies']] AS col", 1);
assertQuery("SELECT col[1][1] FROM tmp_array6", "SELECT '\"hi\"'");
assertQuery("SELECT col[3][1] FROM tmp_array6", "SELECT 'puppies'");
}
@Test
public void testTemporalArrays()
throws Exception
{
assertUpdate("CREATE TABLE tmp_array7 AS SELECT ARRAY[DATE '2014-09-30'] AS col", 1);
assertOneNotNullResult("SELECT col[1] FROM tmp_array7");
assertUpdate("CREATE TABLE tmp_array8 AS SELECT ARRAY[TIMESTAMP '2001-08-22 03:04:05.321'] AS col", 1);
assertOneNotNullResult("SELECT col[1] FROM tmp_array8");
}
@Test
public void testMaps()
throws Exception
{
assertUpdate("CREATE TABLE tmp_map1 AS SELECT MAP(ARRAY[0,1], ARRAY[2,NULL]) AS col", 1);
assertQuery("SELECT col[0] FROM tmp_map1", "SELECT 2");
assertQuery("SELECT col[1] FROM tmp_map1", "SELECT NULL");
assertUpdate("CREATE TABLE tmp_map2 AS SELECT MAP(ARRAY[1.0], ARRAY[2.5]) AS col", 1);
assertQuery("SELECT col[1.0] FROM tmp_map2", "SELECT 2.5");
assertUpdate("CREATE TABLE tmp_map3 AS SELECT MAP(ARRAY['puppies'], ARRAY['kittens']) AS col", 1);
assertQuery("SELECT col['puppies'] FROM tmp_map3", "SELECT 'kittens'");
assertUpdate("CREATE TABLE tmp_map4 AS SELECT MAP(ARRAY[TRUE], ARRAY[FALSE]) AS col", "SELECT 1");
assertQuery("SELECT col[TRUE] FROM tmp_map4", "SELECT FALSE");
assertUpdate("CREATE TABLE tmp_map5 AS SELECT MAP(ARRAY[1.0], ARRAY[ARRAY[1, 2]]) AS col", 1);
assertQuery("SELECT col[1.0][2] FROM tmp_map5", "SELECT 2");
assertUpdate("CREATE TABLE tmp_map6 AS SELECT MAP(ARRAY[DATE '2014-09-30'], ARRAY[DATE '2014-09-29']) AS col", 1);
assertOneNotNullResult("SELECT col[DATE '2014-09-30'] FROM tmp_map6");
assertUpdate("CREATE TABLE tmp_map7 AS SELECT MAP(ARRAY[TIMESTAMP '2001-08-22 03:04:05.321'], ARRAY[TIMESTAMP '2001-08-22 03:04:05.321']) AS col", 1);
assertOneNotNullResult("SELECT col[TIMESTAMP '2001-08-22 03:04:05.321'] FROM tmp_map7");
}
@Test
public void testCollectionNameContainsDots()
throws Exception
{
assertUpdate("CREATE TABLE \"tmp.dot1\" AS SELECT 'foo' _varchar", 1);
assertQuery("SELECT _varchar FROM \"tmp.dot1\"", "SELECT 'foo'");
assertUpdate("DROP TABLE \"tmp.dot1\"");
}
@Test
public void testObjectIds()
throws Exception
{
assertUpdate("CREATE TABLE tmp_objectid AS SELECT ObjectId('ffffffffffffffffffffffff') AS id", 1);
assertOneNotNullResult("SELECT id FROM tmp_objectid WHERE id = ObjectId('ffffffffffffffffffffffff')");
}
private void assertOneNotNullResult(String query)
{
MaterializedResult results = getQueryRunner().execute(getSession(), query).toJdbcTypes();
assertEquals(results.getRowCount(), 1);
assertEquals(results.getMaterializedRows().get(0).getFieldCount(), 1);
assertNotNull(results.getMaterializedRows().get(0).getField(0));
}
}