Skip to content

Commit 7f009a8

Browse files
committed
Get table comments from RDBMS in bulk
Improve speed of getting table comments in JDBC connectors manifold. Get them all at once.
1 parent 08d94de commit 7f009a8

File tree

7 files changed

+82
-4
lines changed

7 files changed

+82
-4
lines changed

plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/BaseJdbcClient.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import io.trino.spi.connector.FixedSplitSource;
3636
import io.trino.spi.connector.JoinStatistics;
3737
import io.trino.spi.connector.JoinType;
38+
import io.trino.spi.connector.RelationCommentMetadata;
3839
import io.trino.spi.connector.SchemaNotFoundException;
3940
import io.trino.spi.connector.SchemaTableName;
4041
import io.trino.spi.connector.TableNotFoundException;
@@ -205,6 +206,34 @@ public List<SchemaTableName> getTableNames(ConnectorSession session, Optional<St
205206
}
206207
}
207208

209+
@Override
210+
public List<RelationCommentMetadata> getAllTableComments(ConnectorSession session, Optional<String> schema)
211+
{
212+
try (Connection connection = connectionFactory.openConnection(session)) {
213+
ConnectorIdentity identity = session.getIdentity();
214+
Optional<String> remoteSchema = schema.map(schemaName -> identifierMapping.toRemoteSchemaName(getRemoteIdentifiers(connection), identity, schemaName));
215+
if (remoteSchema.isPresent() && !filterSchema(remoteSchema.get())) {
216+
return ImmutableList.of();
217+
}
218+
219+
try (ResultSet resultSet = getTables(connection, remoteSchema, Optional.empty())) {
220+
ImmutableList.Builder<RelationCommentMetadata> list = ImmutableList.builder();
221+
while (resultSet.next()) {
222+
String remoteSchemaFromResultSet = getTableSchemaName(resultSet);
223+
String tableSchema = identifierMapping.fromRemoteSchemaName(remoteSchemaFromResultSet);
224+
String tableName = identifierMapping.fromRemoteTableName(remoteSchemaFromResultSet, resultSet.getString("TABLE_NAME"));
225+
if (filterSchema(tableSchema)) {
226+
list.add(RelationCommentMetadata.forRelation(new SchemaTableName(tableSchema, tableName), getTableComment(resultSet)));
227+
}
228+
}
229+
return list.build();
230+
}
231+
}
232+
catch (SQLException e) {
233+
throw new TrinoException(JDBC_ERROR, e);
234+
}
235+
}
236+
208237
@Override
209238
public Optional<JdbcTableHandle> getTableHandle(ConnectorSession session, SchemaTableName schemaTableName)
210239
{

plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/CachingJdbcClient.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import io.trino.spi.connector.ConnectorTableMetadata;
3737
import io.trino.spi.connector.JoinStatistics;
3838
import io.trino.spi.connector.JoinType;
39+
import io.trino.spi.connector.RelationCommentMetadata;
3940
import io.trino.spi.connector.SchemaTableName;
4041
import io.trino.spi.connector.SystemTable;
4142
import io.trino.spi.connector.TableScanRedirectApplicationResult;
@@ -80,11 +81,12 @@ public class CachingJdbcClient
8081
private final IdentityCacheMapping identityMapping;
8182

8283
private final Cache<IdentityCacheKey, Set<String>> schemaNamesCache;
83-
private final Cache<TableNamesCacheKey, List<SchemaTableName>> tableNamesCache;
84+
private final Cache<TableListingCacheKey, List<SchemaTableName>> tableNamesCache;
8485
private final Cache<TableHandlesByNameCacheKey, Optional<JdbcTableHandle>> tableHandlesByNameCache;
8586
private final Cache<TableHandlesByQueryCacheKey, JdbcTableHandle> tableHandlesByQueryCache;
8687
private final Cache<ProcedureHandlesByQueryCacheKey, JdbcProcedureHandle> procedureHandlesByQueryCache;
8788
private final Cache<ColumnsCacheKey, List<JdbcColumnHandle>> columnsCache;
89+
private final Cache<TableListingCacheKey, List<RelationCommentMetadata>> tableCommentsCache;
8890
private final Cache<JdbcTableHandle, TableStatistics> statisticsCache;
8991

9092
@Inject
@@ -132,6 +134,7 @@ public CachingJdbcClient(
132134
tableHandlesByQueryCache = buildCache(ticker, cacheMaximumSize, metadataCachingTtl);
133135
procedureHandlesByQueryCache = buildCache(ticker, cacheMaximumSize, metadataCachingTtl);
134136
columnsCache = buildCache(ticker, cacheMaximumSize, metadataCachingTtl);
137+
tableCommentsCache = buildCache(ticker, cacheMaximumSize, metadataCachingTtl);
135138
statisticsCache = buildCache(ticker, cacheMaximumSize, statisticsCachingTtl);
136139
}
137140

@@ -163,7 +166,7 @@ public Set<String> getSchemaNames(ConnectorSession session)
163166
@Override
164167
public List<SchemaTableName> getTableNames(ConnectorSession session, Optional<String> schema)
165168
{
166-
TableNamesCacheKey key = new TableNamesCacheKey(getIdentityKey(session), schema);
169+
TableListingCacheKey key = new TableListingCacheKey(getIdentityKey(session), schema);
167170
return get(tableNamesCache, key, () -> delegate.getTableNames(session, schema));
168171
}
169172

@@ -177,6 +180,12 @@ public List<JdbcColumnHandle> getColumns(ConnectorSession session, JdbcTableHand
177180
return get(columnsCache, key, () -> delegate.getColumns(session, tableHandle));
178181
}
179182

183+
@Override
184+
public List<RelationCommentMetadata> getAllTableComments(ConnectorSession session, Optional<String> schema)
185+
{
186+
return get(tableCommentsCache, new TableListingCacheKey(getIdentityKey(session), schema), () -> delegate.getAllTableComments(session, schema));
187+
}
188+
180189
@Override
181190
public Optional<ColumnMapping> toColumnMapping(ConnectorSession session, Connection connection, JdbcTypeHandle typeHandle)
182191
{
@@ -625,6 +634,7 @@ public void flushCache()
625634
tableHandlesByNameCache.invalidateAll();
626635
tableHandlesByQueryCache.invalidateAll();
627636
columnsCache.invalidateAll();
637+
tableCommentsCache.invalidateAll();
628638
statisticsCache.invalidateAll();
629639
}
630640

@@ -656,6 +666,7 @@ private void invalidateTableCaches(SchemaTableName schemaTableName)
656666
invalidateAllIf(tableHandlesByNameCache, key -> key.tableName.equals(schemaTableName));
657667
tableHandlesByQueryCache.invalidateAll();
658668
invalidateAllIf(tableNamesCache, key -> key.schemaName.equals(Optional.of(schemaTableName.getSchemaName())));
669+
invalidateAllIf(tableCommentsCache, key -> key.schemaName.equals(Optional.of(schemaTableName.getSchemaName())));
659670
invalidateAllIf(statisticsCache, key -> key.mayReference(schemaTableName));
660671
}
661672

@@ -743,9 +754,9 @@ private record ProcedureHandlesByQueryCacheKey(IdentityCacheKey identity, Proced
743754
}
744755
}
745756

746-
private record TableNamesCacheKey(IdentityCacheKey identity, Optional<String> schemaName)
757+
private record TableListingCacheKey(IdentityCacheKey identity, Optional<String> schemaName)
747758
{
748-
private TableNamesCacheKey
759+
private TableListingCacheKey
749760
{
750761
requireNonNull(identity, "identity is null");
751762
requireNonNull(schemaName, "schemaName is null");

plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultJdbcMetadata.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import io.trino.spi.connector.JoinType;
4646
import io.trino.spi.connector.LimitApplicationResult;
4747
import io.trino.spi.connector.ProjectionApplicationResult;
48+
import io.trino.spi.connector.RelationCommentMetadata;
4849
import io.trino.spi.connector.RetryMode;
4950
import io.trino.spi.connector.RowChangeParadigm;
5051
import io.trino.spi.connector.SchemaTableName;
@@ -71,6 +72,7 @@
7172
import java.util.ArrayList;
7273
import java.util.Collection;
7374
import java.util.HashMap;
75+
import java.util.Iterator;
7476
import java.util.List;
7577
import java.util.Map;
7678
import java.util.Map.Entry;
@@ -80,6 +82,7 @@
8082
import java.util.Set;
8183
import java.util.concurrent.atomic.AtomicReference;
8284
import java.util.function.Consumer;
85+
import java.util.function.UnaryOperator;
8386

8487
import static com.google.common.base.Functions.identity;
8588
import static com.google.common.base.Preconditions.checkArgument;
@@ -911,6 +914,16 @@ public Map<SchemaTableName, List<ColumnMetadata>> listTableColumns(ConnectorSess
911914
return columns.buildOrThrow();
912915
}
913916

917+
@Override
918+
public Iterator<RelationCommentMetadata> streamRelationComments(ConnectorSession session, Optional<String> schemaName, UnaryOperator<Set<SchemaTableName>> relationFilter)
919+
{
920+
Map<SchemaTableName, RelationCommentMetadata> resultsByName = jdbcClient.getAllTableComments(session, schemaName).stream()
921+
.collect(toImmutableMap(RelationCommentMetadata::name, identity()));
922+
return relationFilter.apply(resultsByName.keySet()).stream()
923+
.map(resultsByName::get)
924+
.iterator();
925+
}
926+
914927
@Override
915928
public ColumnMetadata getColumnMetadata(ConnectorSession session, ConnectorTableHandle tableHandle, ColumnHandle columnHandle)
916929
{

plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/ForwardingJdbcClient.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.trino.spi.connector.ConnectorTableMetadata;
2424
import io.trino.spi.connector.JoinStatistics;
2525
import io.trino.spi.connector.JoinType;
26+
import io.trino.spi.connector.RelationCommentMetadata;
2627
import io.trino.spi.connector.SchemaTableName;
2728
import io.trino.spi.connector.SystemTable;
2829
import io.trino.spi.connector.TableScanRedirectApplicationResult;
@@ -105,6 +106,12 @@ public List<JdbcColumnHandle> getColumns(ConnectorSession session, JdbcTableHand
105106
return delegate().getColumns(session, tableHandle);
106107
}
107108

109+
@Override
110+
public List<RelationCommentMetadata> getAllTableComments(ConnectorSession session, Optional<String> schema)
111+
{
112+
return delegate().getAllTableComments(session, schema);
113+
}
114+
108115
@Override
109116
public Optional<ColumnMapping> toColumnMapping(ConnectorSession session, Connection connection, JdbcTypeHandle typeHandle)
110117
{

plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcClient.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.trino.spi.connector.ConnectorTableMetadata;
2525
import io.trino.spi.connector.JoinStatistics;
2626
import io.trino.spi.connector.JoinType;
27+
import io.trino.spi.connector.RelationCommentMetadata;
2728
import io.trino.spi.connector.SchemaTableName;
2829
import io.trino.spi.connector.SystemTable;
2930
import io.trino.spi.connector.TableScanRedirectApplicationResult;
@@ -64,6 +65,8 @@ default boolean schemaExists(ConnectorSession session, String schema)
6465

6566
List<JdbcColumnHandle> getColumns(ConnectorSession session, JdbcTableHandle tableHandle);
6667

68+
List<RelationCommentMetadata> getAllTableComments(ConnectorSession session, Optional<String> schema);
69+
6770
Optional<ColumnMapping> toColumnMapping(ConnectorSession session, Connection connection, JdbcTypeHandle typeHandle);
6871

6972
/**

plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/JdbcClientStats.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public final class JdbcClientStats
3939
private final JdbcApiStats dropTable = new JdbcApiStats();
4040
private final JdbcApiStats finishInsertTable = new JdbcApiStats();
4141
private final JdbcApiStats getColumns = new JdbcApiStats();
42+
private final JdbcApiStats getAllTableComments = new JdbcApiStats();
4243
private final JdbcApiStats getConnectionWithHandle = new JdbcApiStats();
4344
private final JdbcApiStats getConnectionWithSplit = new JdbcApiStats();
4445
private final JdbcApiStats getConnectionWithProcedure = new JdbcApiStats();
@@ -215,6 +216,13 @@ public JdbcApiStats getGetColumns()
215216
return getColumns;
216217
}
217218

219+
@Managed
220+
@Nested
221+
public JdbcApiStats getGetAllTableComments()
222+
{
223+
return getAllTableComments;
224+
}
225+
218226
@Managed
219227
@Nested
220228
public JdbcApiStats getGetConnectionWithHandle()

plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/StatisticsAwareJdbcClient.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import io.trino.spi.connector.ConnectorTableMetadata;
3939
import io.trino.spi.connector.JoinStatistics;
4040
import io.trino.spi.connector.JoinType;
41+
import io.trino.spi.connector.RelationCommentMetadata;
4142
import io.trino.spi.connector.SchemaTableName;
4243
import io.trino.spi.connector.SystemTable;
4344
import io.trino.spi.connector.TableScanRedirectApplicationResult;
@@ -126,6 +127,12 @@ public List<JdbcColumnHandle> getColumns(ConnectorSession session, JdbcTableHand
126127
return stats.getGetColumns().wrap(() -> delegate().getColumns(session, tableHandle));
127128
}
128129

130+
@Override
131+
public List<RelationCommentMetadata> getAllTableComments(ConnectorSession session, Optional<String> schema)
132+
{
133+
return stats.getGetAllTableComments().wrap(() -> delegate().getAllTableComments(session, schema));
134+
}
135+
129136
@Override
130137
public Optional<ColumnMapping> toColumnMapping(ConnectorSession session, Connection connection, JdbcTypeHandle typeHandle)
131138
{

0 commit comments

Comments
 (0)