/* * 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)); } }