diff --git a/presto-docs/src/main/sphinx/develop/delete-and-update.rst b/presto-docs/src/main/sphinx/develop/delete-and-update.rst index 9e31630eaa5c0..094d52f7a9422 100644 --- a/presto-docs/src/main/sphinx/develop/delete-and-update.rst +++ b/presto-docs/src/main/sphinx/develop/delete-and-update.rst @@ -106,7 +106,7 @@ A connector implementing ``DELETE`` must specify three ``ConnectorMetadata`` met * ``beginDelete()``:: - ConnectorTableHandle beginDelete( + ConnectorDeleteTableHandle beginDelete( ConnectorSession session, ConnectorTableHandle tableHandle) @@ -116,7 +116,7 @@ A connector implementing ``DELETE`` must specify three ``ConnectorMetadata`` met ``beginDelete()`` performs any orchestration needed in the connector to start processing the ``DELETE``. This orchestration varies from connector to connector. - ``beginDelete()`` returns a ``ConnectorTableHandle`` with any added information the connector needs when the handle + ``beginDelete()`` returns a ``ConnectorDeleteTableHandle`` with any added information the connector needs when the handle is passed back to ``finishDelete()`` and the split generation machinery. For most connectors, the returned table handle contains a flag identifying the table handle as a table handle for a ``DELETE`` operation. @@ -124,7 +124,7 @@ A connector implementing ``DELETE`` must specify three ``ConnectorMetadata`` met void finishDelete( ConnectorSession session, - ConnectorTableHandle tableHandle, + ConnectoDeleteTableHandle tableHandle, Collection fragments) During ``DELETE`` processing, the Presto engine accumulates the ``Slice`` collections returned by ``UpdatablePageSource.finish()``. diff --git a/presto-hive/src/main/java/com/facebook/presto/hive/HiveMetadata.java b/presto-hive/src/main/java/com/facebook/presto/hive/HiveMetadata.java index 30b6bd7577d56..d7d56ec073aaf 100644 --- a/presto-hive/src/main/java/com/facebook/presto/hive/HiveMetadata.java +++ b/presto-hive/src/main/java/com/facebook/presto/hive/HiveMetadata.java @@ -43,6 +43,7 @@ import com.facebook.presto.hive.statistics.HiveStatisticsProvider; import com.facebook.presto.spi.ColumnHandle; import com.facebook.presto.spi.ColumnMetadata; +import com.facebook.presto.spi.ConnectorDeleteTableHandle; import com.facebook.presto.spi.ConnectorInsertTableHandle; import com.facebook.presto.spi.ConnectorMetadataUpdateHandle; import com.facebook.presto.spi.ConnectorNewTableLayout; @@ -2517,7 +2518,7 @@ public Optional> getReferencedMaterializedViews(ConnectorS } @Override - public ConnectorTableHandle beginDelete(ConnectorSession session, ConnectorTableHandle tableHandle) + public ConnectorDeleteTableHandle beginDelete(ConnectorSession session, ConnectorTableHandle tableHandle) { throw new PrestoException(NOT_SUPPORTED, "This connector only supports delete where one or more partitions are deleted entirely"); } diff --git a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergAbstractMetadata.java b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergAbstractMetadata.java index 41842d2bbd26f..d46b44d9a271d 100644 --- a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergAbstractMetadata.java +++ b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergAbstractMetadata.java @@ -31,6 +31,7 @@ import com.facebook.presto.iceberg.statistics.StatisticsFileCache; import com.facebook.presto.spi.ColumnHandle; import com.facebook.presto.spi.ColumnMetadata; +import com.facebook.presto.spi.ConnectorDeleteTableHandle; import com.facebook.presto.spi.ConnectorInsertTableHandle; import com.facebook.presto.spi.ConnectorNewTableLayout; import com.facebook.presto.spi.ConnectorOutputTableHandle; @@ -978,7 +979,7 @@ public void truncateTable(ConnectorSession session, ConnectorTableHandle tableHa } @Override - public ConnectorTableHandle beginDelete(ConnectorSession session, ConnectorTableHandle tableHandle) + public ConnectorDeleteTableHandle beginDelete(ConnectorSession session, ConnectorTableHandle tableHandle) { IcebergTableHandle handle = (IcebergTableHandle) tableHandle; Table icebergTable = getIcebergTable(session, handle.getSchemaTableName()); @@ -991,11 +992,9 @@ public ConnectorTableHandle beginDelete(ConnectorSession session, ConnectorTable if (formatVersion < MIN_FORMAT_VERSION_FOR_DELETE) { throw new PrestoException(NOT_SUPPORTED, format("This connector only supports delete where one or more partitions are deleted entirely for table versions older than %d", MIN_FORMAT_VERSION_FOR_DELETE)); } - if (getDeleteMode(icebergTable) == RowLevelOperationMode.COPY_ON_WRITE) { throw new PrestoException(NOT_SUPPORTED, "This connector only supports delete where one or more partitions are deleted entirely. Configure delete_mode table property to allow row level deletions."); } - validateTableMode(session, icebergTable); transaction = icebergTable.newTransaction(); @@ -1003,7 +1002,7 @@ public ConnectorTableHandle beginDelete(ConnectorSession session, ConnectorTable } @Override - public void finishDelete(ConnectorSession session, ConnectorTableHandle tableHandle, Collection fragments) + public void finishDelete(ConnectorSession session, ConnectorDeleteTableHandle tableHandle, Collection fragments) { IcebergTableHandle handle = (IcebergTableHandle) tableHandle; Table icebergTable = getIcebergTable(session, handle.getSchemaTableName()); diff --git a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergHandleResolver.java b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergHandleResolver.java index ca5e9fecdef3c..199939c6b7985 100644 --- a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergHandleResolver.java +++ b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergHandleResolver.java @@ -15,6 +15,7 @@ import com.facebook.presto.hive.HiveTransactionHandle; import com.facebook.presto.spi.ColumnHandle; +import com.facebook.presto.spi.ConnectorDeleteTableHandle; import com.facebook.presto.spi.ConnectorHandleResolver; import com.facebook.presto.spi.ConnectorInsertTableHandle; import com.facebook.presto.spi.ConnectorOutputTableHandle; @@ -62,6 +63,12 @@ public Class getInsertTableHandleClass() return IcebergInsertTableHandle.class; } + @Override + public Class getDeleteTableHandleClass() + { + return IcebergTableHandle.class; + } + @Override public Class getTransactionHandleClass() { diff --git a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergTableHandle.java b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergTableHandle.java index 78f77e78ed599..633f80d51eb33 100644 --- a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergTableHandle.java +++ b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergTableHandle.java @@ -14,6 +14,7 @@ package com.facebook.presto.iceberg; import com.facebook.presto.hive.BaseHiveTableHandle; +import com.facebook.presto.spi.ConnectorDeleteTableHandle; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableList; @@ -28,6 +29,7 @@ public class IcebergTableHandle extends BaseHiveTableHandle + implements ConnectorDeleteTableHandle { private final IcebergTableName icebergTableName; private final boolean snapshotSpecified; diff --git a/presto-kudu/src/main/java/com/facebook/presto/kudu/KuduHandleResolver.java b/presto-kudu/src/main/java/com/facebook/presto/kudu/KuduHandleResolver.java index 5375827b9318c..a444846aff542 100755 --- a/presto-kudu/src/main/java/com/facebook/presto/kudu/KuduHandleResolver.java +++ b/presto-kudu/src/main/java/com/facebook/presto/kudu/KuduHandleResolver.java @@ -14,6 +14,7 @@ package com.facebook.presto.kudu; import com.facebook.presto.spi.ColumnHandle; +import com.facebook.presto.spi.ConnectorDeleteTableHandle; import com.facebook.presto.spi.ConnectorHandleResolver; import com.facebook.presto.spi.ConnectorInsertTableHandle; import com.facebook.presto.spi.ConnectorOutputTableHandle; @@ -61,6 +62,12 @@ public Class getInsertTableHandleClass() return KuduInsertTableHandle.class; } + @Override + public Class getDeleteTableHandleClass() + { + return KuduTableHandle.class; + } + @Override public Class getOutputTableHandleClass() { diff --git a/presto-kudu/src/main/java/com/facebook/presto/kudu/KuduMetadata.java b/presto-kudu/src/main/java/com/facebook/presto/kudu/KuduMetadata.java index ff6ced78b19e4..fbfcf46426398 100755 --- a/presto-kudu/src/main/java/com/facebook/presto/kudu/KuduMetadata.java +++ b/presto-kudu/src/main/java/com/facebook/presto/kudu/KuduMetadata.java @@ -20,6 +20,7 @@ import com.facebook.presto.kudu.properties.PartitionDesign; import com.facebook.presto.spi.ColumnHandle; import com.facebook.presto.spi.ColumnMetadata; +import com.facebook.presto.spi.ConnectorDeleteTableHandle; import com.facebook.presto.spi.ConnectorInsertTableHandle; import com.facebook.presto.spi.ConnectorNewTableLayout; import com.facebook.presto.spi.ConnectorOutputTableHandle; @@ -357,13 +358,13 @@ public ColumnHandle getDeleteRowIdColumnHandle(ConnectorSession session, Connect } @Override - public ConnectorTableHandle beginDelete(ConnectorSession session, ConnectorTableHandle tableHandle) + public ConnectorDeleteTableHandle beginDelete(ConnectorSession session, ConnectorTableHandle tableHandle) { - return tableHandle; + return (ConnectorDeleteTableHandle) tableHandle; } @Override - public void finishDelete(ConnectorSession session, ConnectorTableHandle tableHandle, Collection fragments) + public void finishDelete(ConnectorSession session, ConnectorDeleteTableHandle tableHandle, Collection fragments) { } diff --git a/presto-kudu/src/main/java/com/facebook/presto/kudu/KuduTableHandle.java b/presto-kudu/src/main/java/com/facebook/presto/kudu/KuduTableHandle.java index bf357007a9e86..7dbafa6c46c98 100755 --- a/presto-kudu/src/main/java/com/facebook/presto/kudu/KuduTableHandle.java +++ b/presto-kudu/src/main/java/com/facebook/presto/kudu/KuduTableHandle.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.kudu; +import com.facebook.presto.spi.ConnectorDeleteTableHandle; import com.facebook.presto.spi.ConnectorTableHandle; import com.facebook.presto.spi.SchemaTableName; import com.fasterxml.jackson.annotation.JsonCreator; @@ -25,7 +26,7 @@ import static java.util.Objects.requireNonNull; public class KuduTableHandle - implements ConnectorTableHandle + implements ConnectorTableHandle, ConnectorDeleteTableHandle { private final String connectorId; private final SchemaTableName schemaTableName; diff --git a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/ExecutionWriterTarget.java b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/ExecutionWriterTarget.java index 248bfd2def3ef..2b0c9e5167dac 100644 --- a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/ExecutionWriterTarget.java +++ b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/ExecutionWriterTarget.java @@ -14,6 +14,7 @@ package com.facebook.presto.execution.scheduler; +import com.facebook.presto.metadata.DeleteTableHandle; import com.facebook.presto.metadata.InsertTableHandle; import com.facebook.presto.metadata.OutputTableHandle; import com.facebook.presto.spi.SchemaTableName; @@ -106,12 +107,12 @@ public String toString() public static class DeleteHandle extends ExecutionWriterTarget { - private final TableHandle handle; + private final DeleteTableHandle handle; private final SchemaTableName schemaTableName; @JsonCreator public DeleteHandle( - @JsonProperty("handle") TableHandle handle, + @JsonProperty("handle") DeleteTableHandle handle, @JsonProperty("schemaTableName") SchemaTableName schemaTableName) { this.handle = requireNonNull(handle, "handle is null"); @@ -119,7 +120,7 @@ public DeleteHandle( } @JsonProperty - public TableHandle getHandle() + public DeleteTableHandle getHandle() { return handle; } diff --git a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/TableWriteInfo.java b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/TableWriteInfo.java index 6cdc1c318b08a..793b6b8f451e0 100644 --- a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/TableWriteInfo.java +++ b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/TableWriteInfo.java @@ -145,7 +145,7 @@ private static Optional createDeleteScanInfo(StreamingSubPlan pl { if (writerTarget.isPresent() && writerTarget.get() instanceof ExecutionWriterTarget.DeleteHandle) { DeleteNode delete = getOnlyElement(findPlanNodes(plan, DeleteNode.class)); - return createDeleteScanInfo(delete, writerTarget, metadata, session); + return createDeleteScanInfo(delete, metadata, session); } return Optional.empty(); } @@ -154,19 +154,18 @@ private static Optional createDeleteScanInfo(PlanNode planNode, { if (writerTarget.isPresent() && writerTarget.get() instanceof ExecutionWriterTarget.DeleteHandle) { DeleteNode delete = findSinglePlanNode(planNode, DeleteNode.class).get(); - return createDeleteScanInfo(delete, writerTarget, metadata, session); + return createDeleteScanInfo(delete, metadata, session); } return Optional.empty(); } - private static Optional createDeleteScanInfo(DeleteNode delete, Optional writerTarget, Metadata metadata, Session session) + private static Optional createDeleteScanInfo(DeleteNode delete, Metadata metadata, Session session) { - TableHandle tableHandle = ((ExecutionWriterTarget.DeleteHandle) writerTarget.get()).getHandle(); TableScanNode tableScan = getDeleteTableScan(delete); TupleDomain originalEnforcedConstraint = tableScan.getEnforcedConstraint(); TableLayoutResult layoutResult = metadata.getLayout( session, - tableHandle, + tableScan.getTable(), new Constraint<>(originalEnforcedConstraint), Optional.of(ImmutableSet.copyOf(tableScan.getAssignments().values()))); diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/DelegatingMetadataManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/DelegatingMetadataManager.java index 83cd4594032f5..8679321cc952e 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/DelegatingMetadataManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/DelegatingMetadataManager.java @@ -379,13 +379,13 @@ public OptionalLong metadataDelete(Session session, TableHandle tableHandle) } @Override - public TableHandle beginDelete(Session session, TableHandle tableHandle) + public DeleteTableHandle beginDelete(Session session, TableHandle tableHandle) { return delegate.beginDelete(session, tableHandle); } @Override - public void finishDelete(Session session, TableHandle tableHandle, Collection fragments) + public void finishDelete(Session session, DeleteTableHandle tableHandle, Collection fragments) { delegate.finishDelete(session, tableHandle, fragments); } diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/DeleteTableHandle.java b/presto-main/src/main/java/com/facebook/presto/metadata/DeleteTableHandle.java new file mode 100644 index 0000000000000..ea05b223843d5 --- /dev/null +++ b/presto-main/src/main/java/com/facebook/presto/metadata/DeleteTableHandle.java @@ -0,0 +1,87 @@ +/* + * Licensed 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 com.facebook.presto.metadata; + +import com.facebook.presto.spi.ConnectorDeleteTableHandle; +import com.facebook.presto.spi.ConnectorId; +import com.facebook.presto.spi.connector.ConnectorTransactionHandle; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +import static java.util.Objects.requireNonNull; + +public final class DeleteTableHandle +{ + private final ConnectorId connectorId; + private final ConnectorTransactionHandle transactionHandle; + private final ConnectorDeleteTableHandle connectorHandle; + + @JsonCreator + public DeleteTableHandle( + @JsonProperty("connectorId") ConnectorId connectorId, + @JsonProperty("transactionHandle") ConnectorTransactionHandle transactionHandle, + @JsonProperty("connectorHandle") ConnectorDeleteTableHandle connectorHandle) + { + this.connectorId = requireNonNull(connectorId, "connectorId is null"); + this.transactionHandle = requireNonNull(transactionHandle, "transactionHandle is null"); + this.connectorHandle = requireNonNull(connectorHandle, "connectorHandle is null"); + } + + @JsonProperty + public ConnectorId getConnectorId() + { + return connectorId; + } + + @JsonProperty + public ConnectorTransactionHandle getTransactionHandle() + { + return transactionHandle; + } + + @JsonProperty + public ConnectorDeleteTableHandle getConnectorHandle() + { + return connectorHandle; + } + + @Override + public int hashCode() + { + return Objects.hash(connectorId, transactionHandle, connectorHandle); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + DeleteTableHandle o = (DeleteTableHandle) obj; + return Objects.equals(this.connectorId, o.connectorId) && + Objects.equals(this.transactionHandle, o.transactionHandle) && + Objects.equals(this.connectorHandle, o.connectorHandle); + } + + @Override + public String toString() + { + return connectorId + ":" + connectorHandle; + } +} diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/DeleteTableHandleJacksonModule.java b/presto-main/src/main/java/com/facebook/presto/metadata/DeleteTableHandleJacksonModule.java new file mode 100644 index 0000000000000..513348cf0fff4 --- /dev/null +++ b/presto-main/src/main/java/com/facebook/presto/metadata/DeleteTableHandleJacksonModule.java @@ -0,0 +1,30 @@ +/* + * Licensed 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 com.facebook.presto.metadata; + +import com.facebook.presto.spi.ConnectorDeleteTableHandle; + +import javax.inject.Inject; + +public class DeleteTableHandleJacksonModule + extends AbstractTypedJacksonModule +{ + @Inject + public DeleteTableHandleJacksonModule(HandleResolver handleResolver) + { + super(ConnectorDeleteTableHandle.class, + handleResolver::getId, + handleResolver::getDeleteTableHandleClass); + } +} diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/HandleJsonModule.java b/presto-main/src/main/java/com/facebook/presto/metadata/HandleJsonModule.java index 0c07b99aaab4e..61eae56f41895 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/HandleJsonModule.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/HandleJsonModule.java @@ -32,6 +32,7 @@ public void configure(Binder binder) jsonBinder(binder).addModuleBinding().to(SplitJacksonModule.class); jsonBinder(binder).addModuleBinding().to(OutputTableHandleJacksonModule.class); jsonBinder(binder).addModuleBinding().to(InsertTableHandleJacksonModule.class); + jsonBinder(binder).addModuleBinding().to(DeleteTableHandleJacksonModule.class); jsonBinder(binder).addModuleBinding().to(IndexHandleJacksonModule.class); jsonBinder(binder).addModuleBinding().to(TransactionHandleJacksonModule.class); jsonBinder(binder).addModuleBinding().to(PartitioningHandleJacksonModule.class); diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/HandleResolver.java b/presto-main/src/main/java/com/facebook/presto/metadata/HandleResolver.java index c6293cfb74720..09992ef314575 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/HandleResolver.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/HandleResolver.java @@ -16,6 +16,7 @@ import com.facebook.presto.connector.informationSchema.InformationSchemaHandleResolver; import com.facebook.presto.connector.system.SystemHandleResolver; import com.facebook.presto.spi.ColumnHandle; +import com.facebook.presto.spi.ConnectorDeleteTableHandle; import com.facebook.presto.spi.ConnectorHandleResolver; import com.facebook.presto.spi.ConnectorIndexHandle; import com.facebook.presto.spi.ConnectorInsertTableHandle; @@ -114,6 +115,11 @@ public String getId(ConnectorInsertTableHandle insertHandle) return getId(insertHandle, MaterializedHandleResolver::getInsertTableHandleClass); } + public String getId(ConnectorDeleteTableHandle deleteHandle) + { + return getId(deleteHandle, MaterializedHandleResolver::getDeleteTableHandleClass); + } + public String getId(ConnectorPartitioningHandle partitioningHandle) { return getId(partitioningHandle, MaterializedHandleResolver::getPartitioningHandleClass); @@ -169,6 +175,11 @@ public Class getInsertTableHandleClass(Str return resolverFor(id).getInsertTableHandleClass().orElseThrow(() -> new IllegalArgumentException("No resolver for " + id)); } + public Class getDeleteTableHandleClass(String id) + { + return resolverFor(id).getDeleteTableHandleClass().orElseThrow(() -> new IllegalArgumentException("No resolver for " + id)); + } + public Class getPartitioningHandleClass(String id) { return resolverFor(id).getPartitioningHandleClass().orElseThrow(() -> new IllegalArgumentException("No resolver for " + id)); @@ -214,7 +225,7 @@ private String getId(T handle, Function String getFunctionNamespaceId(T handle, Function>> getter) @@ -240,6 +251,7 @@ private static class MaterializedHandleResolver private final Optional> indexHandle; private final Optional> outputTableHandle; private final Optional> insertTableHandle; + private final Optional> deleteTableHandle; private final Optional> partitioningHandle; private final Optional> transactionHandle; private final Optional> metadataUpdateHandle; @@ -253,6 +265,7 @@ public MaterializedHandleResolver(ConnectorHandleResolver resolver) indexHandle = getHandleClass(resolver::getIndexHandleClass); outputTableHandle = getHandleClass(resolver::getOutputTableHandleClass); insertTableHandle = getHandleClass(resolver::getInsertTableHandleClass); + deleteTableHandle = getHandleClass(resolver::getDeleteTableHandleClass); partitioningHandle = getHandleClass(resolver::getPartitioningHandleClass); transactionHandle = getHandleClass(resolver::getTransactionHandleClass); metadataUpdateHandle = getHandleClass(resolver::getMetadataUpdateHandleClass); @@ -303,6 +316,11 @@ public Optional> getInsertTableHandl return insertTableHandle; } + public Optional> getDeleteTableHandleClass() + { + return deleteTableHandle; + } + public Optional> getPartitioningHandleClass() { return partitioningHandle; @@ -335,6 +353,7 @@ public boolean equals(Object o) Objects.equals(indexHandle, that.indexHandle) && Objects.equals(outputTableHandle, that.outputTableHandle) && Objects.equals(insertTableHandle, that.insertTableHandle) && + Objects.equals(deleteTableHandle, that.deleteTableHandle) && Objects.equals(partitioningHandle, that.partitioningHandle) && Objects.equals(transactionHandle, that.transactionHandle) && Objects.equals(metadataUpdateHandle, that.metadataUpdateHandle); @@ -343,7 +362,7 @@ public boolean equals(Object o) @Override public int hashCode() { - return Objects.hash(tableHandle, layoutHandle, columnHandle, split, indexHandle, outputTableHandle, insertTableHandle, partitioningHandle, transactionHandle, metadataUpdateHandle); + return Objects.hash(tableHandle, layoutHandle, columnHandle, split, indexHandle, outputTableHandle, insertTableHandle, deleteTableHandle, partitioningHandle, transactionHandle, metadataUpdateHandle); } } diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java b/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java index 4f3f698be42c9..21bc189fdce47 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java @@ -324,12 +324,12 @@ public interface Metadata /** * Begin delete query */ - TableHandle beginDelete(Session session, TableHandle tableHandle); + DeleteTableHandle beginDelete(Session session, TableHandle tableHandle); /** * Finish delete query */ - void finishDelete(Session session, TableHandle tableHandle, Collection fragments); + void finishDelete(Session session, DeleteTableHandle tableHandle, Collection fragments); /** * Begin update query diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java index ead35ca3cc4be..8a2b1ce55dfc8 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java @@ -29,6 +29,7 @@ import com.facebook.presto.execution.QueryManager; import com.facebook.presto.spi.ColumnHandle; import com.facebook.presto.spi.ColumnMetadata; +import com.facebook.presto.spi.ConnectorDeleteTableHandle; import com.facebook.presto.spi.ConnectorId; import com.facebook.presto.spi.ConnectorInsertTableHandle; import com.facebook.presto.spi.ConnectorMetadataUpdateHandle; @@ -895,20 +896,19 @@ public OptionalLong metadataDelete(Session session, TableHandle tableHandle) } @Override - public TableHandle beginDelete(Session session, TableHandle tableHandle) + public DeleteTableHandle beginDelete(Session session, TableHandle tableHandle) { ConnectorId connectorId = tableHandle.getConnectorId(); CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, connectorId); - ConnectorTableHandle newHandle = catalogMetadata.getMetadata().beginDelete(session.toConnectorSession(connectorId), tableHandle.getConnectorHandle()); - return new TableHandle( + ConnectorDeleteTableHandle newHandle = catalogMetadata.getMetadata().beginDelete(session.toConnectorSession(connectorId), tableHandle.getConnectorHandle()); + return new DeleteTableHandle( tableHandle.getConnectorId(), - newHandle, tableHandle.getTransaction(), - Optional.empty()); + newHandle); } @Override - public void finishDelete(Session session, TableHandle tableHandle, Collection fragments) + public void finishDelete(Session session, DeleteTableHandle tableHandle, Collection fragments) { ConnectorId connectorId = tableHandle.getConnectorId(); ConnectorMetadata metadata = getMetadata(session, connectorId); diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java b/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java index 49a6051c22362..1f1eb6b09bc13 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java @@ -411,13 +411,13 @@ public OptionalLong metadataDelete(Session session, TableHandle tableHandle) } @Override - public TableHandle beginDelete(Session session, TableHandle tableHandle) + public DeleteTableHandle beginDelete(Session session, TableHandle tableHandle) { throw new UnsupportedOperationException(); } @Override - public void finishDelete(Session session, TableHandle tableHandle, Collection fragments) + public void finishDelete(Session session, DeleteTableHandle tableHandle, Collection fragments) { throw new UnsupportedOperationException(); } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorDeleteTableHandle.java b/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorDeleteTableHandle.java new file mode 100644 index 0000000000000..927a01c248a67 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorDeleteTableHandle.java @@ -0,0 +1,19 @@ +/* + * Licensed 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 com.facebook.presto.spi; + +@SuppressWarnings("MarkerInterface") +public interface ConnectorDeleteTableHandle +{ +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorHandleResolver.java b/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorHandleResolver.java index 1e83bb99c47c1..79f1550e7c274 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorHandleResolver.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorHandleResolver.java @@ -41,6 +41,11 @@ default Class getInsertTableHandleClass() throw new UnsupportedOperationException(); } + default Class getDeleteTableHandleClass() + { + throw new UnsupportedOperationException(); + } + default Class getPartitioningHandleClass() { throw new UnsupportedOperationException(); diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorMetadata.java b/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorMetadata.java index d31c12b68e23b..73031bb83e11e 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorMetadata.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorMetadata.java @@ -17,6 +17,7 @@ import com.facebook.presto.common.type.Type; import com.facebook.presto.spi.ColumnHandle; import com.facebook.presto.spi.ColumnMetadata; +import com.facebook.presto.spi.ConnectorDeleteTableHandle; import com.facebook.presto.spi.ConnectorInsertTableHandle; import com.facebook.presto.spi.ConnectorMetadataUpdateHandle; import com.facebook.presto.spi.ConnectorNewTableLayout; @@ -528,7 +529,7 @@ default ColumnHandle getUpdateRowIdColumnHandle(ConnectorSession session, Connec /** * Begin delete query */ - default ConnectorTableHandle beginDelete(ConnectorSession session, ConnectorTableHandle tableHandle) + default ConnectorDeleteTableHandle beginDelete(ConnectorSession session, ConnectorTableHandle tableHandle) { throw new PrestoException(NOT_SUPPORTED, "This connector does not support deletes"); } @@ -538,7 +539,7 @@ default ConnectorTableHandle beginDelete(ConnectorSession session, ConnectorTabl * * @param fragments all fragments returned by {@link com.facebook.presto.spi.UpdatablePageSource#finish()} */ - default void finishDelete(ConnectorSession session, ConnectorTableHandle tableHandle, Collection fragments) + default void finishDelete(ConnectorSession session, ConnectorDeleteTableHandle tableHandle, Collection fragments) { throw new PrestoException(NOT_SUPPORTED, "This connector does not support deletes"); } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorPageSinkProvider.java b/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorPageSinkProvider.java index f200da4d13269..5b8665d0f14fc 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorPageSinkProvider.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorPageSinkProvider.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.spi.connector; +import com.facebook.presto.spi.ConnectorDeleteTableHandle; import com.facebook.presto.spi.ConnectorInsertTableHandle; import com.facebook.presto.spi.ConnectorOutputTableHandle; import com.facebook.presto.spi.ConnectorPageSink; @@ -24,4 +25,9 @@ public interface ConnectorPageSinkProvider ConnectorPageSink createPageSink(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorOutputTableHandle outputTableHandle, PageSinkContext pageSinkContext); ConnectorPageSink createPageSink(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorInsertTableHandle insertTableHandle, PageSinkContext pageSinkContext); + + default ConnectorPageSink createPageSink(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorDeleteTableHandle deleteTableHandle, PageSinkContext pageSinkContext) + { + throw new UnsupportedOperationException("ConnectorPageSinkProvider does not support connectorDeleteTableHandle"); + } } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/connector/classloader/ClassLoaderSafeConnectorMetadata.java b/presto-spi/src/main/java/com/facebook/presto/spi/connector/classloader/ClassLoaderSafeConnectorMetadata.java index fa1aeb780f691..09f315f81535e 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/connector/classloader/ClassLoaderSafeConnectorMetadata.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/connector/classloader/ClassLoaderSafeConnectorMetadata.java @@ -17,6 +17,7 @@ import com.facebook.presto.common.type.Type; import com.facebook.presto.spi.ColumnHandle; import com.facebook.presto.spi.ColumnMetadata; +import com.facebook.presto.spi.ConnectorDeleteTableHandle; import com.facebook.presto.spi.ConnectorInsertTableHandle; import com.facebook.presto.spi.ConnectorMetadataUpdateHandle; import com.facebook.presto.spi.ConnectorNewTableLayout; @@ -585,7 +586,7 @@ public ColumnHandle getUpdateRowIdColumnHandle(ConnectorSession session, Connect } @Override - public ConnectorTableHandle beginDelete(ConnectorSession session, ConnectorTableHandle tableHandle) + public ConnectorDeleteTableHandle beginDelete(ConnectorSession session, ConnectorTableHandle tableHandle) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.beginDelete(session, tableHandle); @@ -593,7 +594,7 @@ public ConnectorTableHandle beginDelete(ConnectorSession session, ConnectorTable } @Override - public void finishDelete(ConnectorSession session, ConnectorTableHandle tableHandle, Collection fragments) + public void finishDelete(ConnectorSession session, ConnectorDeleteTableHandle tableHandle, Collection fragments) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.finishDelete(session, tableHandle, fragments); diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/connector/classloader/ClassLoaderSafeConnectorPageSinkProvider.java b/presto-spi/src/main/java/com/facebook/presto/spi/connector/classloader/ClassLoaderSafeConnectorPageSinkProvider.java index 19466998df657..761b6537e2a14 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/connector/classloader/ClassLoaderSafeConnectorPageSinkProvider.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/connector/classloader/ClassLoaderSafeConnectorPageSinkProvider.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.spi.connector.classloader; +import com.facebook.presto.spi.ConnectorDeleteTableHandle; import com.facebook.presto.spi.ConnectorInsertTableHandle; import com.facebook.presto.spi.ConnectorOutputTableHandle; import com.facebook.presto.spi.ConnectorPageSink; @@ -51,4 +52,12 @@ public ConnectorPageSink createPageSink(ConnectorTransactionHandle transactionHa return new ClassLoaderSafeConnectorPageSink(delegate.createPageSink(transactionHandle, session, insertTableHandle, pageSinkContext), classLoader); } } + + @Override + public ConnectorPageSink createPageSink(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorDeleteTableHandle deleteTableHandle, PageSinkContext pageSinkContext) + { + try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { + return new ClassLoaderSafeConnectorPageSink(delegate.createPageSink(transactionHandle, session, deleteTableHandle, pageSinkContext), classLoader); + } + } }