@Override public ConnectorTableMetadata getTableMetadata(ConnectorSession session, ConnectorTableHandle table) { JdbcTableHandle handle = (JdbcTableHandle) table; ImmutableList.Builder<ColumnMetadata> columnMetadata = ImmutableList.builder(); for (JdbcColumnHandle column : jdbcClient.getColumns(session, handle)) { columnMetadata.add(column.getColumnMetadata()); } return new ConnectorTableMetadata(handle.getSchemaTableName(), columnMetadata.build()); }
@Override public List<JdbcColumnHandle> getColumns(ConnectorSession session, JdbcTableHandle tableHandle) { try (Connection connection = connectionFactory.openConnection()) { try (ResultSet resultSet = getColumns(tableHandle, connection.getMetaData())) { List<JdbcColumnHandle> columns = new ArrayList<>(); while (resultSet.next()) { JdbcTypeHandle typeHandle = new JdbcTypeHandle( resultSet.getInt("DATA_TYPE"), resultSet.getInt("COLUMN_SIZE"), resultSet.getInt("DECIMAL_DIGITS")); Optional<ReadMapping> columnMapping = toPrestoType(session, typeHandle); // skip unsupported column types if (columnMapping.isPresent()) { String columnName = resultSet.getString("COLUMN_NAME"); columns.add(new JdbcColumnHandle(connectorId, columnName, typeHandle, columnMapping.get().getType())); } } if (columns.isEmpty()) { // In rare cases (e.g. PostgreSQL) a table might have no columns. throw new TableNotFoundException(tableHandle.getSchemaTableName()); } return ImmutableList.copyOf(columns); } } catch (SQLException e) { throw new PrestoException(JDBC_ERROR, e); } }
@Test public void testMetadata() { assertTrue(jdbcClient.getSchemaNames().containsAll(ImmutableSet.of("example", "tpch"))); assertEquals(jdbcClient.getTableNames("example"), ImmutableList.of( new SchemaTableName("example", "numbers"), new SchemaTableName("example", "view_source"), new SchemaTableName("example", "view"))); assertEquals(jdbcClient.getTableNames("tpch"), ImmutableList.of( new SchemaTableName("tpch", "lineitem"), new SchemaTableName("tpch", "orders"))); SchemaTableName schemaTableName = new SchemaTableName("example", "numbers"); JdbcTableHandle table = jdbcClient.getTableHandle(schemaTableName); assertNotNull(table, "table is null"); assertEquals(table.getCatalogName(), catalogName.toUpperCase(ENGLISH)); assertEquals(table.getSchemaName(), "EXAMPLE"); assertEquals(table.getTableName(), "NUMBERS"); assertEquals(table.getSchemaTableName(), schemaTableName); assertEquals(jdbcClient.getColumns(session, table), ImmutableList.of( new JdbcColumnHandle(CONNECTOR_ID, "TEXT", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle(CONNECTOR_ID, "TEXT_SHORT", JDBC_VARCHAR, createVarcharType(32)), new JdbcColumnHandle(CONNECTOR_ID, "VALUE", JDBC_BIGINT, BIGINT))); }
@Override public ConnectorTableMetadata getTableMetadata(ConnectorSession session, ConnectorTableHandle table) { JdbcTableHandle handle = checkType(table, JdbcTableHandle.class, "tableHandle"); ImmutableList.Builder<ColumnMetadata> columnMetadata = ImmutableList.builder(); for (JdbcColumnHandle column : jdbcClient.getColumns(handle)) { columnMetadata.add(column.getColumnMetadata()); } return new ConnectorTableMetadata(handle.getSchemaTableName(), columnMetadata.build()); }
@Override public ConnectorTableMetadata getTableMetadata(final ConnectorSession session, final ConnectorTableHandle table) { final JdbcTableHandle handle = Types.checkType(table, JdbcTableHandle.class, "tableHandle"); final ImmutableList.Builder<ColumnMetadata> columnMetadata = ImmutableList.builder(); for (ColumnDetailHandle column : jdbcClient.getColumnsWithDetails(handle)) { columnMetadata.add(column.getColumnMetadata()); } return new ConnectorTableMetadata(handle.getSchemaTableName(), columnMetadata.build()); }
@Override public ConnectorTableMetadata getTableMetadata(final ConnectorSession session, final ConnectorTableHandle table) { final JdbcTableHandle handle = Types.checkType(table, JdbcTableHandle.class, "tableHandle"); final ImmutableList.Builder<ColumnMetadata> columnMetadata = ImmutableList.builder(); for (ColumnDetailHandle column : jdbcClient.getColumnsWithDetails(handle)) { columnMetadata.add(column.getColumnMetadata()); } return new ConnectorTableMetadata(handle.getSchemaTableName(), columnMetadata.build()); }
@Override public List<JdbcColumnHandle> getColumns(JdbcTableHandle tableHandle) { try (Connection connection = driver.connect(connectionUrl, connectionProperties)) { try (ResultSet resultSet = getColumns(tableHandle, connection.getMetaData())) { List<JdbcColumnHandle> columns = new ArrayList<>(); boolean found = false; while (resultSet.next()) { found = true; Type columnType = toPrestoType(resultSet.getInt("DATA_TYPE")); // skip unsupported column types if (columnType != null) { String columnName = resultSet.getString("COLUMN_NAME"); columns.add(new JdbcColumnHandle(connectorId, columnName, columnType)); } } if (!found) { throw new TableNotFoundException(tableHandle.getSchemaTableName()); } if (columns.isEmpty()) { throw new PrestoException(NOT_SUPPORTED, "Table has no supported column types: " + tableHandle.getSchemaTableName()); } return ImmutableList.copyOf(columns); } } catch (SQLException e) { throw new PrestoException(JDBC_ERROR, e); } }
throw new TableNotFoundException(tableHandle.getSchemaTableName()); "Table has no supported column types: " + tableHandle.getSchemaTableName());
throw new TableNotFoundException(tableHandle.getSchemaTableName()); "Table has no supported column types: " + tableHandle.getSchemaTableName());
@Test public void testMetadata() { assertTrue(jdbcClient.getSchemaNames().containsAll(ImmutableSet.of("example", "tpch"))); assertEquals(jdbcClient.getTableNames("example"), ImmutableList.of( new SchemaTableName("example", "numbers"), new SchemaTableName("example", "view_source"), new SchemaTableName("example", "view"))); assertEquals(jdbcClient.getTableNames("tpch"), ImmutableList.of( new SchemaTableName("tpch", "lineitem"), new SchemaTableName("tpch", "orders"))); SchemaTableName schemaTableName = new SchemaTableName("example", "numbers"); JdbcTableHandle table = jdbcClient.getTableHandle(schemaTableName); assertNotNull(table, "table is null"); assertEquals(table.getCatalogName(), catalogName.toUpperCase(ENGLISH)); assertEquals(table.getSchemaName(), "EXAMPLE"); assertEquals(table.getTableName(), "NUMBERS"); assertEquals(table.getSchemaTableName(), schemaTableName); assertEquals(jdbcClient.getColumns(session, table), ImmutableList.of( new JdbcColumnHandle(CONNECTOR_ID, "TEXT", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle(CONNECTOR_ID, "TEXT_SHORT", JDBC_VARCHAR, createVarcharType(32)), new JdbcColumnHandle(CONNECTOR_ID, "VALUE", JDBC_BIGINT, BIGINT))); }