diff --git a/api/src/main/java/org/apache/iceberg/actions/ExpireSnapshots.java b/api/src/main/java/org/apache/iceberg/actions/ExpireSnapshots.java
index 0e02f4bec964..286ab115d14f 100644
--- a/api/src/main/java/org/apache/iceberg/actions/ExpireSnapshots.java
+++ b/api/src/main/java/org/apache/iceberg/actions/ExpireSnapshots.java
@@ -22,6 +22,7 @@
import java.util.function.Consumer;
import org.apache.iceberg.Snapshot;
import org.apache.iceberg.io.SupportsBulkOperations;
+import org.immutables.value.Value;
/**
* An action that expires snapshots in a table.
@@ -29,6 +30,7 @@
*
Similar to {@link org.apache.iceberg.ExpireSnapshots} but may use a query engine to distribute
* parts of the work.
*/
+@Value.Enclosing
public interface ExpireSnapshots extends Action {
/**
* Expires a specific {@link Snapshot} identified by id.
@@ -98,6 +100,7 @@ public interface ExpireSnapshots extends Action manifestListLocations(Table table, Set snapshot
* @return the location of statistics files
*/
public static List statisticsFilesLocations(Table table) {
- List statisticsFilesLocations = Lists.newArrayList();
- for (StatisticsFile statisticsFile : table.statisticsFiles()) {
- statisticsFilesLocations.add(statisticsFile.path());
- }
+ return statisticsFilesLocations(table, statisticsFile -> true);
+ }
- return statisticsFilesLocations;
+ /**
+ * Returns locations of statistics files for a table matching the given predicate .
+ *
+ * @param table table for which statistics files needs to be listed
+ * @param predicate predicate for filtering the statistics files
+ * @return the location of statistics files
+ */
+ public static List statisticsFilesLocations(
+ Table table, Predicate predicate) {
+ return table.statisticsFiles().stream()
+ .filter(predicate)
+ .map(StatisticsFile::path)
+ .collect(Collectors.toList());
}
}
diff --git a/core/src/main/java/org/apache/iceberg/actions/BaseExpireSnapshotsActionResult.java b/core/src/main/java/org/apache/iceberg/actions/BaseExpireSnapshotsActionResult.java
index 93fd8431b34e..d750bcdbc9f0 100644
--- a/core/src/main/java/org/apache/iceberg/actions/BaseExpireSnapshotsActionResult.java
+++ b/core/src/main/java/org/apache/iceberg/actions/BaseExpireSnapshotsActionResult.java
@@ -18,6 +18,8 @@
*/
package org.apache.iceberg.actions;
+/** @deprecated will be removed in 1.3.0. */
+@Deprecated
public class BaseExpireSnapshotsActionResult implements ExpireSnapshots.Result {
private final long deletedDataFilesCount;
diff --git a/spark/v3.3/spark-extensions/src/test/java/org/apache/iceberg/spark/extensions/TestExpireSnapshotsProcedure.java b/spark/v3.3/spark-extensions/src/test/java/org/apache/iceberg/spark/extensions/TestExpireSnapshotsProcedure.java
index e7f648ed6f7d..efb3d43668f1 100644
--- a/spark/v3.3/spark-extensions/src/test/java/org/apache/iceberg/spark/extensions/TestExpireSnapshotsProcedure.java
+++ b/spark/v3.3/spark-extensions/src/test/java/org/apache/iceberg/spark/extensions/TestExpireSnapshotsProcedure.java
@@ -20,28 +20,40 @@
import static org.apache.iceberg.TableProperties.GC_ENABLED;
+import java.io.File;
import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.iceberg.AssertHelpers;
+import org.apache.iceberg.GenericBlobMetadata;
+import org.apache.iceberg.GenericStatisticsFile;
import org.apache.iceberg.Snapshot;
+import org.apache.iceberg.StatisticsFile;
import org.apache.iceberg.Table;
import org.apache.iceberg.exceptions.ValidationException;
+import org.apache.iceberg.io.FileIO;
+import org.apache.iceberg.puffin.Blob;
+import org.apache.iceberg.puffin.Puffin;
+import org.apache.iceberg.puffin.PuffinWriter;
import org.apache.iceberg.relocated.com.google.common.collect.ImmutableList;
import org.apache.iceberg.relocated.com.google.common.collect.Iterables;
import org.apache.iceberg.relocated.com.google.common.collect.Lists;
-import org.apache.iceberg.spark.Spark3Util;
import org.apache.iceberg.spark.SparkCatalog;
import org.apache.iceberg.spark.data.TestHelpers;
import org.apache.iceberg.spark.source.SimpleRecord;
import org.apache.spark.sql.AnalysisException;
import org.apache.spark.sql.Encoders;
import org.apache.spark.sql.catalyst.analysis.NoSuchProcedureException;
+import org.assertj.core.api.Assertions;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
@@ -63,7 +75,8 @@ public void testExpireSnapshotsInEmptyTable() {
sql("CREATE TABLE %s (id bigint NOT NULL, data string) USING iceberg", tableName);
List