Skip to content

Commit 0b66c1e

Browse files
Add connector_name to metadata.catalogs table
1 parent b4bb7ce commit 0b66c1e

File tree

11 files changed

+156
-13
lines changed

11 files changed

+156
-13
lines changed

presto-docs/src/main/sphinx/connector/system.rst

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,40 @@ System Connector Tables
3636
``metadata.catalogs``
3737
^^^^^^^^^^^^^^^^^^^^^
3838

39-
The catalogs table contains the list of available catalogs.
39+
The catalogs table contains the list of available catalogs. The columns in ``metadata.catalogs`` are:
40+
41+
======================================= ======================================================================
42+
Column Name Description
43+
======================================= ======================================================================
44+
``catalog_name`` The value of this column is derived from the names of
45+
catalog.properties files present under ``etc/catalog`` path under
46+
presto installation directory. Everything except the suffix
47+
``.properties`` is treated as the catalog name. For example, if there
48+
is a file named ``my_catalog.properties``, then ``my_catalog`` will be
49+
listed as the value for this column.
50+
51+
``connector_id`` The values in this column are a duplicate of the values in the
52+
``catalog_name`` column.
53+
54+
``connector_name`` This column represents the actual name of the underlying connector
55+
that a particular catalog is using. This column contains the value of
56+
``connector.name`` property from the catalog.properties file.
57+
======================================= ======================================================================
58+
59+
Example:
60+
61+
Suppose a user configures a single catalog by creating a file named ``my_catalog.properties`` with the
62+
below contents::
63+
64+
connector.name=hive-hadoop2
65+
hive.metastore.uri=thrift://localhost:9083
66+
67+
``metadata.catalogs`` table will show below output::
68+
69+
presto> select * from system.metadata.catalogs;
70+
catalog_name | connector_id | connector_name
71+
--------------+--------------+----------------
72+
my_catalog | my_catalog | hive-hadoop2
4073

4174
``metadata.schema_properties``
4275
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

presto-main-base/src/main/java/com/facebook/presto/connector/ConnectorManager.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,10 @@ public synchronized ConnectorId createConnection(String catalogName, String conn
215215
requireNonNull(connectorName, "connectorName is null");
216216
ConnectorFactory connectorFactory = connectorFactories.get(connectorName);
217217
checkArgument(connectorFactory != null, "No factory for connector %s", connectorName);
218-
return createConnection(catalogName, connectorFactory, properties);
218+
return createConnection(catalogName, connectorFactory, properties, connectorName);
219219
}
220220

221-
private synchronized ConnectorId createConnection(String catalogName, ConnectorFactory connectorFactory, Map<String, String> properties)
221+
private synchronized ConnectorId createConnection(String catalogName, ConnectorFactory connectorFactory, Map<String, String> properties, String connectorName)
222222
{
223223
checkState(!stopped.get(), "ConnectorManager is stopped");
224224
requireNonNull(catalogName, "catalogName is null");
@@ -229,12 +229,12 @@ private synchronized ConnectorId createConnection(String catalogName, ConnectorF
229229
ConnectorId connectorId = new ConnectorId(catalogName);
230230
checkState(!connectors.containsKey(connectorId), "A connector %s already exists", connectorId);
231231

232-
addCatalogConnector(catalogName, connectorId, connectorFactory, properties);
232+
addCatalogConnector(catalogName, connectorId, connectorFactory, properties, connectorName);
233233

234234
return connectorId;
235235
}
236236

237-
private synchronized void addCatalogConnector(String catalogName, ConnectorId connectorId, ConnectorFactory factory, Map<String, String> properties)
237+
private synchronized void addCatalogConnector(String catalogName, ConnectorId connectorId, ConnectorFactory factory, Map<String, String> properties, String connectorName)
238238
{
239239
// create all connectors before adding, so a broken connector does not leave the system half updated
240240
MaterializedConnector connector = new MaterializedConnector(connectorId, createConnector(connectorId, factory, properties));
@@ -269,7 +269,8 @@ private synchronized void addCatalogConnector(String catalogName, ConnectorId co
269269
informationSchemaConnector.getConnectorId(),
270270
informationSchemaConnector.getConnector(),
271271
systemConnector.getConnectorId(),
272-
systemConnector.getConnector());
272+
systemConnector.getConnector(),
273+
connectorName);
273274

274275
try {
275276
addConnectorInternal(connector);

presto-main-base/src/main/java/com/facebook/presto/connector/system/CatalogSystemTable.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515

1616
import com.facebook.presto.Session;
1717
import com.facebook.presto.common.predicate.TupleDomain;
18+
import com.facebook.presto.metadata.Catalog.CatalogContext;
1819
import com.facebook.presto.metadata.Metadata;
19-
import com.facebook.presto.spi.ConnectorId;
2020
import com.facebook.presto.spi.ConnectorSession;
2121
import com.facebook.presto.spi.ConnectorTableMetadata;
2222
import com.facebook.presto.spi.InMemoryRecordSet;
@@ -32,7 +32,7 @@
3232

3333
import static com.facebook.presto.common.type.VarcharType.createUnboundedVarcharType;
3434
import static com.facebook.presto.connector.system.SystemConnectorSessionUtil.toSession;
35-
import static com.facebook.presto.metadata.MetadataListing.listCatalogs;
35+
import static com.facebook.presto.metadata.MetadataListing.listCatalogsWithConnectorContext;
3636
import static com.facebook.presto.metadata.MetadataUtil.TableMetadataBuilder.tableMetadataBuilder;
3737
import static com.facebook.presto.spi.SystemTable.Distribution.SINGLE_COORDINATOR;
3838
import static java.util.Objects.requireNonNull;
@@ -45,6 +45,7 @@ public class CatalogSystemTable
4545
public static final ConnectorTableMetadata CATALOG_TABLE = tableMetadataBuilder(CATALOG_TABLE_NAME)
4646
.column("catalog_name", createUnboundedVarcharType())
4747
.column("connector_id", createUnboundedVarcharType())
48+
.column("connector_name", createUnboundedVarcharType())
4849
.build();
4950
private final Metadata metadata;
5051
private final AccessControl accessControl;
@@ -73,8 +74,8 @@ public RecordCursor cursor(ConnectorTransactionHandle transactionHandle, Connect
7374
{
7475
Session session = toSession(transactionHandle, connectorSession);
7576
Builder table = InMemoryRecordSet.builder(CATALOG_TABLE);
76-
for (Map.Entry<String, ConnectorId> entry : listCatalogs(session, metadata, accessControl).entrySet()) {
77-
table.addRow(entry.getKey(), entry.getValue().toString());
77+
for (Map.Entry<String, CatalogContext> entry : listCatalogsWithConnectorContext(session, metadata, accessControl).entrySet()) {
78+
table.addRow(entry.getKey(), entry.getValue().getCatalogName(), entry.getValue().getConnectorName());
7879
}
7980
return table.build().cursor();
8081
}

presto-main-base/src/main/java/com/facebook/presto/metadata/Catalog.java

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public class Catalog
3232
private final ConnectorId systemTablesId;
3333
private final Connector systemTables;
3434

35+
private final CatalogContext catalogContext;
36+
3537
public Catalog(
3638
String catalogName,
3739
ConnectorId connectorId,
@@ -40,6 +42,26 @@ public Catalog(
4042
Connector informationSchema,
4143
ConnectorId systemTablesId,
4244
Connector systemTables)
45+
{
46+
this(catalogName,
47+
connectorId,
48+
connector,
49+
informationSchemaId,
50+
informationSchema,
51+
systemTablesId,
52+
systemTables,
53+
catalogName);
54+
}
55+
56+
public Catalog(
57+
String catalogName,
58+
ConnectorId connectorId,
59+
Connector connector,
60+
ConnectorId informationSchemaId,
61+
Connector informationSchema,
62+
ConnectorId systemTablesId,
63+
Connector systemTables,
64+
String connectorName)
4365
{
4466
this.catalogName = checkCatalogName(catalogName);
4567
this.connectorId = requireNonNull(connectorId, "connectorId is null");
@@ -48,8 +70,9 @@ public Catalog(
4870
this.informationSchema = requireNonNull(informationSchema, "informationSchema is null");
4971
this.systemTablesId = requireNonNull(systemTablesId, "systemTablesId is null");
5072
this.systemTables = requireNonNull(systemTables, "systemTables is null");
73+
requireNonNull(connectorName, "connectorName is null");
74+
this.catalogContext = new CatalogContext(catalogName, connectorName);
5175
}
52-
5376
public String getCatalogName()
5477
{
5578
return catalogName;
@@ -60,6 +83,11 @@ public ConnectorId getConnectorId()
6083
return connectorId;
6184
}
6285

86+
public CatalogContext getCatalogContext()
87+
{
88+
return catalogContext;
89+
}
90+
6391
public ConnectorId getInformationSchemaId()
6492
{
6593
return informationSchemaId;
@@ -92,4 +120,26 @@ public String toString()
92120
.add("connectorId", connectorId)
93121
.toString();
94122
}
123+
124+
public class CatalogContext
125+
{
126+
private final String catalogName;
127+
private final String connectorName;
128+
129+
public CatalogContext(String catalogName, String connectorName)
130+
{
131+
this.catalogName = catalogName;
132+
this.connectorName = connectorName;
133+
}
134+
135+
public String getCatalogName()
136+
{
137+
return catalogName;
138+
}
139+
140+
public String getConnectorName()
141+
{
142+
return connectorName;
143+
}
144+
}
95145
}

presto-main-base/src/main/java/com/facebook/presto/metadata/Metadata.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.facebook.presto.common.predicate.TupleDomain;
2121
import com.facebook.presto.common.type.Type;
2222
import com.facebook.presto.common.type.TypeSignature;
23+
import com.facebook.presto.metadata.Catalog.CatalogContext;
2324
import com.facebook.presto.spi.ColumnHandle;
2425
import com.facebook.presto.spi.ColumnMetadata;
2526
import com.facebook.presto.spi.ConnectorId;
@@ -52,6 +53,7 @@
5253
import com.facebook.presto.spi.statistics.ComputedStatistics;
5354
import com.facebook.presto.spi.statistics.TableStatistics;
5455
import com.facebook.presto.spi.statistics.TableStatisticsMetadata;
56+
import com.google.common.collect.ImmutableMap;
5557
import com.google.common.util.concurrent.ListenableFuture;
5658
import io.airlift.slice.Slice;
5759

@@ -360,6 +362,11 @@ public interface Metadata
360362
*/
361363
Map<String, ConnectorId> getCatalogNames(Session session);
362364

365+
default Map<String, CatalogContext> getCatalogNamesWithConnectorContext(Session session)
366+
{
367+
return ImmutableMap.of();
368+
}
369+
363370
/**
364371
* Get the names that match the specified table prefix (never null).
365372
*/

presto-main-base/src/main/java/com/facebook/presto/metadata/MetadataListing.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import com.facebook.presto.Session;
1717
import com.facebook.presto.common.QualifiedObjectName;
18+
import com.facebook.presto.metadata.Catalog.CatalogContext;
1819
import com.facebook.presto.spi.ColumnMetadata;
1920
import com.facebook.presto.spi.ConnectorId;
2021
import com.facebook.presto.spi.SchemaTableName;
@@ -54,6 +55,20 @@ public static SortedMap<String, ConnectorId> listCatalogs(Session session, Metad
5455
return result.build();
5556
}
5657

58+
public static SortedMap<String, CatalogContext> listCatalogsWithConnectorContext(Session session, Metadata metadata, AccessControl accessControl)
59+
{
60+
Map<String, CatalogContext> catalogNamesWithConnectorContext = metadata.getCatalogNamesWithConnectorContext(session);
61+
Set<String> allowedCatalogs = accessControl.filterCatalogs(session.getIdentity(), session.getAccessControlContext(), catalogNamesWithConnectorContext.keySet());
62+
63+
ImmutableSortedMap.Builder<String, CatalogContext> result = ImmutableSortedMap.naturalOrder();
64+
for (Map.Entry<String, CatalogContext> entry : catalogNamesWithConnectorContext.entrySet()) {
65+
if (allowedCatalogs.contains(entry.getKey())) {
66+
result.put(entry);
67+
}
68+
}
69+
return result.build();
70+
}
71+
5772
public static SortedSet<String> listSchemas(Session session, Metadata metadata, AccessControl accessControl, String catalogName)
5873
{
5974
Set<String> schemaNames = ImmutableSet.copyOf(metadata.listSchemaNames(session, catalogName));

presto-main-base/src/main/java/com/facebook/presto/metadata/MetadataManager.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.facebook.presto.common.predicate.TupleDomain;
2727
import com.facebook.presto.common.type.Type;
2828
import com.facebook.presto.common.type.TypeSignature;
29+
import com.facebook.presto.metadata.Catalog.CatalogContext;
2930
import com.facebook.presto.spi.ColumnHandle;
3031
import com.facebook.presto.spi.ColumnMetadata;
3132
import com.facebook.presto.spi.ConnectorDeleteTableHandle;
@@ -987,6 +988,12 @@ public Map<String, ConnectorId> getCatalogNames(Session session)
987988
return transactionManager.getCatalogNames(session.getRequiredTransactionId());
988989
}
989990

991+
@Override
992+
public Map<String, CatalogContext> getCatalogNamesWithConnectorContext(Session session)
993+
{
994+
return transactionManager.getCatalogNamesWithConnectorContext(session.getRequiredTransactionId());
995+
}
996+
990997
@Override
991998
public List<QualifiedObjectName> listViews(Session session, QualifiedTablePrefix prefix)
992999
{

presto-main-base/src/main/java/com/facebook/presto/transaction/InMemoryTransactionManager.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.facebook.airlift.units.Duration;
2020
import com.facebook.presto.common.transaction.TransactionId;
2121
import com.facebook.presto.metadata.Catalog;
22+
import com.facebook.presto.metadata.Catalog.CatalogContext;
2223
import com.facebook.presto.metadata.CatalogManager;
2324
import com.facebook.presto.metadata.CatalogMetadata;
2425
import com.facebook.presto.spi.ConnectorId;
@@ -214,6 +215,12 @@ public Map<String, ConnectorId> getCatalogNames(TransactionId transactionId)
214215
return getTransactionMetadata(transactionId).getCatalogNames();
215216
}
216217

218+
@Override
219+
public Map<String, CatalogContext> getCatalogNamesWithConnectorContext(TransactionId transactionId)
220+
{
221+
return getTransactionMetadata(transactionId).getCatalogNamesWithConnectorContext();
222+
}
223+
217224
@Override
218225
public Optional<CatalogMetadata> getOptionalCatalogMetadata(TransactionId transactionId, String catalogName)
219226
{
@@ -462,6 +469,20 @@ private synchronized Map<String, ConnectorId> getCatalogNames()
462469
return ImmutableMap.copyOf(catalogNames);
463470
}
464471

472+
private synchronized Map<String, CatalogContext> getCatalogNamesWithConnectorContext()
473+
{
474+
Map<String, CatalogContext> catalogNamesWithConnectorContext = new HashMap<>();
475+
catalogByName.values().stream()
476+
.filter(Optional::isPresent)
477+
.map(Optional::get)
478+
.forEach(catalog -> catalogNamesWithConnectorContext.put(catalog.getCatalogName(), catalog.getCatalogContext()));
479+
480+
catalogManager.getCatalogs().stream()
481+
.forEach(catalog -> catalogNamesWithConnectorContext.putIfAbsent(catalog.getCatalogName(), catalog.getCatalogContext()));
482+
483+
return ImmutableMap.copyOf(catalogNamesWithConnectorContext);
484+
}
485+
465486
private synchronized Optional<ConnectorId> getConnectorId(String catalogName)
466487
{
467488
Optional<Catalog> catalog = catalogByName.get(catalogName);

presto-main-base/src/main/java/com/facebook/presto/transaction/TransactionManager.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@
1515

1616
import com.facebook.presto.Session;
1717
import com.facebook.presto.common.transaction.TransactionId;
18+
import com.facebook.presto.metadata.Catalog.CatalogContext;
1819
import com.facebook.presto.metadata.CatalogMetadata;
1920
import com.facebook.presto.spi.ConnectorId;
2021
import com.facebook.presto.spi.connector.ConnectorTransactionHandle;
2122
import com.facebook.presto.spi.function.FunctionNamespaceManager;
2223
import com.facebook.presto.spi.function.FunctionNamespaceTransactionHandle;
2324
import com.facebook.presto.spi.security.AccessControl;
2425
import com.facebook.presto.spi.transaction.IsolationLevel;
26+
import com.google.common.collect.ImmutableMap;
2527
import com.google.common.util.concurrent.ListenableFuture;
2628

2729
import java.util.List;
@@ -47,6 +49,11 @@ public interface TransactionManager
4749

4850
Map<String, ConnectorId> getCatalogNames(TransactionId transactionId);
4951

52+
default Map<String, CatalogContext> getCatalogNamesWithConnectorContext(TransactionId transactionId)
53+
{
54+
return ImmutableMap.of();
55+
}
56+
5057
Optional<CatalogMetadata> getOptionalCatalogMetadata(TransactionId transactionId, String catalogName);
5158

5259
void enableRollback(TransactionId transactionId);

presto-product-tests/src/main/java/com/facebook/presto/tests/SystemConnectorTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,9 @@ public void selectRuntimeTasks()
108108
@Test(groups = {SYSTEM_CONNECTOR, JDBC})
109109
public void selectMetadataCatalogs()
110110
{
111-
String sql = "select catalog_name, connector_id from system.metadata.catalogs";
111+
String sql = "select catalog_name, connector_id, connector_name from system.metadata.catalogs";
112112
assertThat(query(sql))
113-
.hasColumns(VARCHAR, VARCHAR)
113+
.hasColumns(VARCHAR, VARCHAR, VARCHAR)
114114
.hasAnyRows();
115115
}
116116

0 commit comments

Comments
 (0)