private ConnectorMetadata getMetadataForWrite(Session session, ConnectorId connectorId) { return getCatalogMetadataForWrite(session, connectorId).getMetadata(); }
@Override public void createTable(Session session, String catalogName, ConnectorTableMetadata tableMetadata, boolean ignoreExisting) { CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, catalogName); ConnectorId connectorId = catalogMetadata.getConnectorId(); ConnectorMetadata metadata = catalogMetadata.getMetadata(); metadata.createTable(session.toConnectorSession(connectorId), tableMetadata, ignoreExisting); }
@Override public TableStatisticsMetadata getStatisticsCollectionMetadata(Session session, String catalogName, ConnectorTableMetadata tableMetadata) { CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, catalogName); ConnectorMetadata metadata = catalogMetadata.getMetadata(); ConnectorId connectorId = catalogMetadata.getConnectorId(); return metadata.getStatisticsCollectionMetadata(session.toConnectorSession(connectorId), tableMetadata); }
@Override public Optional<NewTableLayout> getNewTableLayout(Session session, String catalogName, ConnectorTableMetadata tableMetadata) { CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, catalogName); ConnectorId connectorId = catalogMetadata.getConnectorId(); ConnectorMetadata metadata = catalogMetadata.getMetadata(); ConnectorTransactionHandle transactionHandle = catalogMetadata.getTransactionHandleFor(connectorId); ConnectorSession connectorSession = session.toConnectorSession(connectorId); return metadata.getNewTableLayout(connectorSession, tableMetadata) .map(layout -> new NewTableLayout(connectorId, transactionHandle, layout)); }
@Override public OutputTableHandle beginCreateTable(Session session, String catalogName, ConnectorTableMetadata tableMetadata, Optional<NewTableLayout> layout) { CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, catalogName); ConnectorId connectorId = catalogMetadata.getConnectorId(); ConnectorMetadata metadata = catalogMetadata.getMetadata(); ConnectorTransactionHandle transactionHandle = catalogMetadata.getTransactionHandleFor(connectorId); ConnectorSession connectorSession = session.toConnectorSession(connectorId); ConnectorOutputTableHandle handle = metadata.beginCreateTable(connectorSession, tableMetadata, layout.map(NewTableLayout::getLayout)); return new OutputTableHandle(connectorId, transactionHandle, handle); }
@Override public Optional<NewTableLayout> getInsertLayout(Session session, TableHandle table) { ConnectorId connectorId = table.getConnectorId(); CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, connectorId); ConnectorMetadata metadata = catalogMetadata.getMetadata(); return metadata.getInsertLayout(session.toConnectorSession(connectorId), table.getConnectorHandle()) .map(layout -> new NewTableLayout(connectorId, catalogMetadata.getTransactionHandleFor(connectorId), layout)); }
@Override public void dropSchema(Session session, CatalogSchemaName schema) { CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, schema.getCatalogName()); ConnectorId connectorId = catalogMetadata.getConnectorId(); ConnectorMetadata metadata = catalogMetadata.getMetadata(); metadata.dropSchema(session.toConnectorSession(connectorId), schema.getSchemaName()); }
@Override public void createView(Session session, QualifiedObjectName viewName, String viewData, boolean replace) { CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, viewName.getCatalogName()); ConnectorId connectorId = catalogMetadata.getConnectorId(); ConnectorMetadata metadata = catalogMetadata.getMetadata(); metadata.createView(session.toConnectorSession(connectorId), viewName.asSchemaTableName(), viewData, replace); }
@Override public void dropView(Session session, QualifiedObjectName viewName) { CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, viewName.getCatalogName()); ConnectorId connectorId = catalogMetadata.getConnectorId(); ConnectorMetadata metadata = catalogMetadata.getMetadata(); metadata.dropView(session.toConnectorSession(connectorId), viewName.asSchemaTableName()); }
@Override public void revokeTablePrivileges(Session session, QualifiedObjectName tableName, Set<Privilege> privileges, String grantee, boolean grantOption) { CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, tableName.getCatalogName()); ConnectorId connectorId = catalogMetadata.getConnectorId(); ConnectorMetadata metadata = catalogMetadata.getMetadata(); metadata.revokeTablePrivileges(session.toConnectorSession(connectorId), tableName.asSchemaTableName(), privileges, grantee, grantOption); }
@Override public void grantTablePrivileges(Session session, QualifiedObjectName tableName, Set<Privilege> privileges, String grantee, boolean grantOption) { CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, tableName.getCatalogName()); ConnectorId connectorId = catalogMetadata.getConnectorId(); ConnectorMetadata metadata = catalogMetadata.getMetadata(); metadata.grantTablePrivileges(session.toConnectorSession(connectorId), tableName.asSchemaTableName(), privileges, grantee, grantOption); }
@Override public void createSchema(Session session, CatalogSchemaName schema, Map<String, Object> properties) { CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, schema.getCatalogName()); ConnectorId connectorId = catalogMetadata.getConnectorId(); ConnectorMetadata metadata = catalogMetadata.getMetadata(); metadata.createSchema(session.toConnectorSession(connectorId), schema.getSchemaName(), properties); }
@Override public void renameSchema(Session session, CatalogSchemaName source, String target) { CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, source.getCatalogName()); ConnectorId connectorId = catalogMetadata.getConnectorId(); ConnectorMetadata metadata = catalogMetadata.getMetadata(); metadata.renameSchema(session.toConnectorSession(connectorId), source.getSchemaName(), target); }
@Override public InsertTableHandle beginInsert(Session session, TableHandle tableHandle) { ConnectorId connectorId = tableHandle.getConnectorId(); CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, connectorId); ConnectorMetadata metadata = catalogMetadata.getMetadata(); ConnectorTransactionHandle transactionHandle = catalogMetadata.getTransactionHandleFor(connectorId); ConnectorInsertTableHandle handle = metadata.beginInsert(session.toConnectorSession(connectorId), tableHandle.getConnectorHandle()); return new InsertTableHandle(tableHandle.getConnectorId(), transactionHandle, handle); }
@Override public void renameTable(Session session, TableHandle tableHandle, QualifiedObjectName newTableName) { String catalogName = newTableName.getCatalogName(); CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, catalogName); ConnectorId connectorId = catalogMetadata.getConnectorId(); if (!tableHandle.getConnectorId().equals(connectorId)) { throw new PrestoException(SYNTAX_ERROR, "Cannot rename tables across catalogs"); } ConnectorMetadata metadata = catalogMetadata.getMetadata(); metadata.renameTable(session.toConnectorSession(connectorId), tableHandle.getConnectorHandle(), newTableName.asSchemaTableName()); }
@Test public void testAbortedTransactionWorkflow() { try (IdleCheckExecutor executor = new IdleCheckExecutor()) { CatalogManager catalogManager = new CatalogManager(); TransactionManager transactionManager = InMemoryTransactionManager.create(new TransactionManagerConfig(), executor.getExecutor(), catalogManager, finishingExecutor); Connector c1 = new TpchConnectorFactory().create(CATALOG_NAME, ImmutableMap.of(), new TestingConnectorContext()); registerConnector(catalogManager, transactionManager, CATALOG_NAME, CONNECTOR_ID, c1); TransactionId transactionId = transactionManager.beginTransaction(false); assertEquals(transactionManager.getAllTransactionInfos().size(), 1); TransactionInfo transactionInfo = transactionManager.getTransactionInfo(transactionId); assertFalse(transactionInfo.isAutoCommitContext()); assertTrue(transactionInfo.getConnectorIds().isEmpty()); assertFalse(transactionInfo.getWrittenConnectorId().isPresent()); ConnectorMetadata metadata = transactionManager.getOptionalCatalogMetadata(transactionId, CATALOG_NAME).get().getMetadata(); metadata.listSchemaNames(TEST_SESSION.toConnectorSession(CONNECTOR_ID)); transactionInfo = transactionManager.getTransactionInfo(transactionId); assertEquals(transactionInfo.getConnectorIds(), ImmutableList.of(CONNECTOR_ID, INFORMATION_SCHEMA_ID, SYSTEM_TABLES_ID)); assertFalse(transactionInfo.getWrittenConnectorId().isPresent()); getFutureValue(transactionManager.asyncAbort(transactionId)); assertTrue(transactionManager.getAllTransactionInfos().isEmpty()); } }
@Test public void testTransactionWorkflow() { try (IdleCheckExecutor executor = new IdleCheckExecutor()) { CatalogManager catalogManager = new CatalogManager(); TransactionManager transactionManager = InMemoryTransactionManager.create(new TransactionManagerConfig(), executor.getExecutor(), catalogManager, finishingExecutor); Connector c1 = new TpchConnectorFactory().create(CATALOG_NAME, ImmutableMap.of(), new TestingConnectorContext()); registerConnector(catalogManager, transactionManager, CATALOG_NAME, CONNECTOR_ID, c1); TransactionId transactionId = transactionManager.beginTransaction(false); assertEquals(transactionManager.getAllTransactionInfos().size(), 1); TransactionInfo transactionInfo = transactionManager.getTransactionInfo(transactionId); assertFalse(transactionInfo.isAutoCommitContext()); assertTrue(transactionInfo.getConnectorIds().isEmpty()); assertFalse(transactionInfo.getWrittenConnectorId().isPresent()); ConnectorMetadata metadata = transactionManager.getOptionalCatalogMetadata(transactionId, CATALOG_NAME).get().getMetadata(); metadata.listSchemaNames(TEST_SESSION.toConnectorSession(CONNECTOR_ID)); transactionInfo = transactionManager.getTransactionInfo(transactionId); assertEquals(transactionInfo.getConnectorIds(), ImmutableList.of(CONNECTOR_ID, INFORMATION_SCHEMA_ID, SYSTEM_TABLES_ID)); assertFalse(transactionInfo.getWrittenConnectorId().isPresent()); getFutureValue(transactionManager.asyncCommit(transactionId)); assertTrue(transactionManager.getAllTransactionInfos().isEmpty()); } }
assertFalse(transactionInfo.getWrittenConnectorId().isPresent()); ConnectorMetadata metadata = transactionManager.getOptionalCatalogMetadata(transactionId, CATALOG_NAME).get().getMetadata(); metadata.listSchemaNames(TEST_SESSION.toConnectorSession(CONNECTOR_ID)); transactionInfo = transactionManager.getTransactionInfo(transactionId);