blob: 120d6dc9517c9e158333bd0f440bc5820faa1307 [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.drill.exec.work.metadata;
import static org.apache.drill.exec.store.ischema.InfoSchemaConstants.IS_CATALOG_CONNECT;
import static org.apache.drill.exec.store.ischema.InfoSchemaConstants.IS_CATALOG_DESCRIPTION;
import static org.apache.drill.exec.store.ischema.InfoSchemaConstants.IS_CATALOG_NAME;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Collections;
import java.util.List;
import org.apache.drill.test.BaseTestQuery;
import org.apache.drill.categories.OptionsTest;
import org.apache.drill.exec.proto.UserProtos.CatalogMetadata;
import org.apache.drill.exec.proto.UserProtos.ColumnMetadata;
import org.apache.drill.exec.proto.UserProtos.GetCatalogsResp;
import org.apache.drill.exec.proto.UserProtos.GetColumnsResp;
import org.apache.drill.exec.proto.UserProtos.GetSchemasResp;
import org.apache.drill.exec.proto.UserProtos.GetTablesResp;
import org.apache.drill.exec.proto.UserProtos.LikeFilter;
import org.apache.drill.exec.proto.UserProtos.RequestStatus;
import org.apache.drill.exec.proto.UserProtos.SchemaMetadata;
import org.apache.drill.exec.proto.UserProtos.TableMetadata;
import org.apache.drill.exec.store.sys.SystemTable;
import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
* Tests for metadata provider APIs.
*/
@Category(OptionsTest.class)
public class TestMetadataProvider extends BaseTestQuery {
@Test
public void catalogs() throws Exception {
// test("SELECT * FROM INFORMATION_SCHEMA.CATALOGS"); // SQL equivalent
GetCatalogsResp resp = client.getCatalogs(null).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<CatalogMetadata> catalogs = resp.getCatalogsList();
assertEquals(1, catalogs.size());
CatalogMetadata c = catalogs.get(0);
assertEquals(IS_CATALOG_NAME, c.getCatalogName());
assertEquals(IS_CATALOG_DESCRIPTION, c.getDescription());
assertEquals(IS_CATALOG_CONNECT, c.getConnect());
}
@Test
public void catalogsWithFilter() throws Exception {
// test("SELECT * FROM INFORMATION_SCHEMA.CATALOGS " +
// "WHERE CATALOG_NAME LIKE '%DRI%' ESCAPE '\\'"); // SQL equivalent
GetCatalogsResp resp =
client.getCatalogs(LikeFilter.newBuilder().setPattern("%DRI%").setEscape("\\").build()).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<CatalogMetadata> catalogs = resp.getCatalogsList();
assertEquals(1, catalogs.size());
CatalogMetadata c = catalogs.get(0);
assertEquals(IS_CATALOG_NAME, c.getCatalogName());
assertEquals(IS_CATALOG_DESCRIPTION, c.getDescription());
assertEquals(IS_CATALOG_CONNECT, c.getConnect());
}
@Test
public void catalogsWithFilterNegative() throws Exception {
// test("SELECT * FROM INFORMATION_SCHEMA.CATALOGS
// WHERE CATALOG_NAME LIKE '%DRIj\\\\hgjh%' ESCAPE '\\'"); // SQL equivalent
GetCatalogsResp resp =
client.getCatalogs(LikeFilter.newBuilder().setPattern("%DRIj\\%hgjh%").setEscape("\\").build()).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<CatalogMetadata> catalogs = resp.getCatalogsList();
assertEquals(0, catalogs.size());
}
@Test
public void schemas() throws Exception {
// test("SELECT * FROM INFORMATION_SCHEMA.SCHEMATA"); // SQL equivalent
GetSchemasResp resp = client.getSchemas(null, null).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<SchemaMetadata> schemas = resp.getSchemasList();
assertEquals(6, schemas.size());
verifySchema("information_schema", schemas);
verifySchema("cp.default", schemas);
verifySchema("dfs.default", schemas);
verifySchema("dfs.root", schemas);
verifySchema("dfs.tmp", schemas);
verifySchema("sys", schemas);
}
@Test
public void schemasWithSchemaNameFilter() throws Exception {
// test("SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME LIKE '%tion_sc%'"); // SQL equivalent
GetSchemasResp resp = client.getSchemas(null, LikeFilter.newBuilder().setPattern("%TiOn_Sc%").build()).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<SchemaMetadata> schemas = resp.getSchemasList();
assertEquals(1, schemas.size());
verifySchema("information_schema", schemas);
}
@Test
public void schemasWithCatalogNameFilterAndSchemaNameFilter() throws Exception {
GetSchemasResp resp = client.getSchemas(
LikeFilter.newBuilder().setPattern("%RI%").build(),
LikeFilter.newBuilder().setPattern("%dfs%").build()).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<SchemaMetadata> schemas = resp.getSchemasList();
assertEquals(3, schemas.size());
verifySchema("dfs.default", schemas);
verifySchema("dfs.root", schemas);
verifySchema("dfs.tmp", schemas);
}
@Test
public void tables() throws Exception {
// test("SELECT * FROM INFORMATION_SCHEMA.`TABLES`"); // SQL equivalent
GetTablesResp resp = client.getTables(null, null, null, null).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<TableMetadata> tables = resp.getTablesList();
assertEquals(20, tables.size());
verifyTable("information_schema", "CATALOGS", tables);
verifyTable("information_schema", "COLUMNS", tables);
verifyTable("information_schema", "SCHEMATA", tables);
verifyTable("information_schema", "TABLES", tables);
verifyTable("information_schema", "VIEWS", tables);
verifyTable("information_schema", "PARTITIONS", tables);
verifyTable("information_schema", "FILES", tables);
//Verify System Tables
for (SystemTable sysTbl : SystemTable.values()) {
verifyTable("sys", sysTbl.getTableName(), tables);
}
}
@Test
public void tablesWithTableFilter() throws Exception {
// test("SELECT * FROM INFORMATION_SCHEMA.`TABLES` WHERE TABLE_TYPE IN ('TABLE')"); // SQL equivalent
GetTablesResp resp = client.getTables(null, null, null, Collections.singletonList("TABLE")).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<TableMetadata> tables = resp.getTablesList();
assertTrue(tables.isEmpty());
}
@Test
public void tablesWithSystemTableFilter() throws Exception {
// test("SELECT * FROM INFORMATION_SCHEMA.`TABLES` WHERE TABLE_TYPE IN ('SYSTEM_TABLE')"); // SQL equivalent
GetTablesResp resp = client.getTables(null, null, null, Collections.singletonList("SYSTEM TABLE")).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<TableMetadata> tables = resp.getTablesList();
assertEquals(20, tables.size());
verifyTable("information_schema", "CATALOGS", tables);
verifyTable("information_schema", "COLUMNS", tables);
verifyTable("information_schema", "SCHEMATA", tables);
verifyTable("information_schema", "TABLES", tables);
verifyTable("information_schema", "VIEWS", tables);
verifyTable("information_schema", "PARTITIONS", tables);
verifyTable("information_schema", "FILES", tables);
//Verify System Tables
for (SystemTable sysTbl : SystemTable.values()) {
verifyTable("sys", sysTbl.getTableName(), tables);
}
}
@Test
public void tablesWithTableNameFilter() throws Exception {
// test("SELECT * FROM INFORMATION_SCHEMA.`TABLES` WHERE TABLE_NAME LIKE '%o%'"); // SQL equivalent
GetTablesResp resp = client.getTables(null, null,
LikeFilter.newBuilder().setPattern("%o%").build(),
null).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<TableMetadata> tables = resp.getTablesList();
assertEquals(11, tables.size());
//Verify System Tables
for (SystemTable sysTbl : SystemTable.values()) {
String sysTblName = sysTbl.getTableName();
if (sysTblName.contains("o")) {
verifyTable("sys", sysTblName, tables);
}
}
}
@Test
public void tablesWithTableNameFilterAndSchemaNameFilter() throws Exception {
// test("SELECT * FROM INFORMATION_SCHEMA.`TABLES` " +
// "WHERE TABLE_SCHEMA LIKE '%N\\_S%' ESCAPE '\\' AND TABLE_NAME LIKE '%o%'"); // SQL equivalent
GetTablesResp resp = client.getTables(null,
LikeFilter.newBuilder().setPattern("%N\\_S%").setEscape("\\").build(),
LikeFilter.newBuilder().setPattern("%o%").build(),
null).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<TableMetadata> tables = resp.getTablesList();
assertEquals(0, tables.size());
}
@Test
public void columns() throws Exception {
// test("SELECT * FROM INFORMATION_SCHEMA.COLUMNS"); // SQL equivalent
GetColumnsResp resp = client.getColumns(null, null, null, null).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<ColumnMetadata> columns = resp.getColumnsList();
assertEquals(162, columns.size());
// too many records to verify the output.
}
@Test
public void columnsWithColumnNameFilter() throws Exception {
// test("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%\\_p%' ESCAPE '\\'"); // SQL equivalent
GetColumnsResp resp = client.getColumns(null, null, null,
LikeFilter.newBuilder().setPattern("%\\_p%").setEscape("\\").build()).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<ColumnMetadata> columns = resp.getColumnsList();
assertEquals(6, columns.size());
verifyColumn("sys", SystemTable.DRILLBITS.getTableName(), "user_port", columns);
verifyColumn("sys", SystemTable.DRILLBITS.getTableName(), "control_port", columns);
verifyColumn("sys", SystemTable.DRILLBITS.getTableName(), "data_port", columns);
verifyColumn("sys", SystemTable.MEMORY.getTableName(), "user_port", columns);
verifyColumn("sys", SystemTable.THREADS.getTableName(), "user_port", columns);
}
@Test
public void columnsWithColumnNameFilterAndTableNameFilter() throws Exception {
// test("SELECT * FROM INFORMATION_SCHEMA.COLUMNS
// WHERE TABLE_NAME LIKE '%bits' AND COLUMN_NAME LIKE '%\\_p%' ESCAPE '\\'"); // SQL equivalent
GetColumnsResp resp = client.getColumns(null, null,
LikeFilter.newBuilder().setPattern("%bits").build(),
LikeFilter.newBuilder().setPattern("%\\_p%").setEscape("\\").build()).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<ColumnMetadata> columns = resp.getColumnsList();
assertEquals(4, columns.size());
verifyColumn("sys", SystemTable.DRILLBITS.getTableName(), "user_port", columns);
verifyColumn("sys", SystemTable.DRILLBITS.getTableName(), "control_port", columns);
verifyColumn("sys", SystemTable.DRILLBITS.getTableName(), "data_port", columns);
}
@Test
public void columnsWithAllSupportedFilters() throws Exception {
// test("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE " +
// "TABLE_CATALOG LIKE '%ILL' AND TABLE_SCHEMA LIKE 'sys' AND " +
// "TABLE_NAME LIKE '%bits' AND COLUMN_NAME LIKE '%\\_p%' ESCAPE '\\'"); // SQL equivalent
GetColumnsResp resp = client.getColumns(
LikeFilter.newBuilder().setPattern("%ILL").build(),
LikeFilter.newBuilder().setPattern("sys").build(),
LikeFilter.newBuilder().setPattern("%bits").build(),
LikeFilter.newBuilder().setPattern("%\\_p%").setEscape("\\").build()).get();
assertEquals(RequestStatus.OK, resp.getStatus());
List<ColumnMetadata> columns = resp.getColumnsList();
assertEquals(4, columns.size());
verifyColumn("sys", SystemTable.DRILLBITS.getTableName(), "user_port", columns);
verifyColumn("sys", SystemTable.DRILLBITS.getTableName(), "control_port", columns);
verifyColumn("sys", SystemTable.DRILLBITS.getTableName(), "data_port", columns);
verifyColumn("sys", SystemTable.DRILLBITS.getTableName(), "http_port", columns);
}
/** Helper method to verify schema contents */
private static void verifySchema(String schemaName, List<SchemaMetadata> schemas) {
for(SchemaMetadata schema : schemas) {
if (schemaName.equals(schema.getSchemaName())) {
assertEquals(IS_CATALOG_NAME, schema.getCatalogName());
return;
}
}
fail("Failed to find schema '" + schemaName + "' in results: " + schemas);
}
/** Helper method to verify table contents */
private static void verifyTable(String schemaName, String tableName, List<TableMetadata> tables) {
for(TableMetadata table : tables) {
if (tableName.equals(table.getTableName()) && schemaName.equals(table.getSchemaName())) {
assertEquals(IS_CATALOG_NAME, table.getCatalogName());
return;
}
}
fail(String.format("Failed to find table '%s.%s' in results: %s", schemaName, tableName, tables));
}
/** Helper method to verify column contents */
private static void verifyColumn(String schemaName, String tableName, String columnName,
List<ColumnMetadata> columns) {
for(ColumnMetadata column : columns) {
if (schemaName.equals(column.getSchemaName()) && tableName.equals(column.getTableName()) &&
columnName.equals(column.getColumnName())) {
assertEquals(IS_CATALOG_NAME, column.getCatalogName());
return;
}
}
fail(String.format("Failed to find column '%s.%s.%s' in results: %s", schemaName, tableName, columnName, columns));
}
}