diff --git a/.palantir/revapi.yml b/.palantir/revapi.yml index 79f1e51ba214..ccaf44b726cd 100644 --- a/.palantir/revapi.yml +++ b/.palantir/revapi.yml @@ -45,6 +45,9 @@ acceptedBreaks: - code: "java.method.addedToInterface" new: "method java.util.List org.apache.iceberg.Snapshot::deleteManifests(org.apache.iceberg.io.FileIO)" justification: "Allow adding a new method to the interface - old method is deprecated" + - code: "java.method.addedToInterface" + new: "method java.util.Map org.apache.iceberg.Table::refs()" + justification: "Adding new refs method to Table API for easier access" - code: "java.method.addedToInterface" new: "method long org.apache.iceberg.actions.ExpireSnapshots.Result::deletedEqualityDeleteFilesCount()" justification: "Interface is backward compatible, very unlikely anyone implements this Result bean interface" diff --git a/api/src/main/java/org/apache/iceberg/Table.java b/api/src/main/java/org/apache/iceberg/Table.java index 8278c99bfc2d..7964bd22c076 100644 --- a/api/src/main/java/org/apache/iceberg/Table.java +++ b/api/src/main/java/org/apache/iceberg/Table.java @@ -305,4 +305,25 @@ default AppendFiles newFastAppend() { /** Returns a {@link LocationProvider} to provide locations for new data files. */ LocationProvider locationProvider(); + + /** + * Returns the current refs for the table + * + * @return the current refs for the table + */ + Map refs(); + + /** + * Returns the snapshot referenced by the given name or null if no such reference exists. + * + * @return the snapshot which is referenced by the given name or null if no such reference exists. + */ + default Snapshot snapshot(String name) { + SnapshotRef ref = refs().get(name); + if (ref != null) { + return snapshot(ref.snapshotId()); + } + + return null; + } } diff --git a/core/src/main/java/org/apache/iceberg/BaseMetadataTable.java b/core/src/main/java/org/apache/iceberg/BaseMetadataTable.java index b065ade32bcb..c6615862de57 100644 --- a/core/src/main/java/org/apache/iceberg/BaseMetadataTable.java +++ b/core/src/main/java/org/apache/iceberg/BaseMetadataTable.java @@ -158,6 +158,11 @@ public List history() { return table().history(); } + @Override + public Map refs() { + return table().refs(); + } + @Override public UpdateSchema updateSchema() { throw new UnsupportedOperationException("Cannot update the schema of a metadata table"); diff --git a/core/src/main/java/org/apache/iceberg/BaseTable.java b/core/src/main/java/org/apache/iceberg/BaseTable.java index 9605b07d8dc9..d42147ae00c8 100644 --- a/core/src/main/java/org/apache/iceberg/BaseTable.java +++ b/core/src/main/java/org/apache/iceberg/BaseTable.java @@ -239,6 +239,11 @@ public LocationProvider locationProvider() { return operations().locationProvider(); } + @Override + public Map refs() { + return ops.current().refs(); + } + @Override public String toString() { return name(); diff --git a/core/src/main/java/org/apache/iceberg/BaseTransaction.java b/core/src/main/java/org/apache/iceberg/BaseTransaction.java index 38dfa0aaf3ee..b162201cf567 100644 --- a/core/src/main/java/org/apache/iceberg/BaseTransaction.java +++ b/core/src/main/java/org/apache/iceberg/BaseTransaction.java @@ -747,6 +747,11 @@ public LocationProvider locationProvider() { return transactionOps.locationProvider(); } + @Override + public Map refs() { + return current.refs(); + } + @Override public String toString() { return name(); diff --git a/core/src/main/java/org/apache/iceberg/SerializableTable.java b/core/src/main/java/org/apache/iceberg/SerializableTable.java index 37d7453c033b..ddffdae14edd 100644 --- a/core/src/main/java/org/apache/iceberg/SerializableTable.java +++ b/core/src/main/java/org/apache/iceberg/SerializableTable.java @@ -61,6 +61,7 @@ public class SerializableTable implements Table, Serializable { private final FileIO io; private final EncryptionManager encryption; private final LocationProvider locationProvider; + private final Map refs; private transient volatile Table lazyTable = null; private transient volatile Schema lazySchema = null; @@ -81,6 +82,7 @@ protected SerializableTable(Table table) { this.io = fileIO(table); this.encryption = table.encryption(); this.locationProvider = table.locationProvider(); + this.refs = table.refs(); } /** @@ -235,6 +237,11 @@ public LocationProvider locationProvider() { return locationProvider; } + @Override + public Map refs() { + return refs; + } + @Override public void refresh() { throw new UnsupportedOperationException(errorMsg("refresh"));