This is an automated email from the ASF dual-hosted git repository.

gangwu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg-cpp.git


The following commit(s) were added to refs/heads/main by this push:
     new e62acea4 feat: add TableRequirement::Kind (#439)
e62acea4 is described below

commit e62acea44bd20dd01012ee772e91c3da7c0973a1
Author: wzhuo <[email protected]>
AuthorDate: Thu Dec 25 20:40:55 2025 +0800

    feat: add TableRequirement::Kind (#439)
---
 src/iceberg/table_requirement.h            | 30 ++++++++++++++++++++++++++++++
 src/iceberg/test/table_requirement_test.cc |  8 ++++++++
 2 files changed, 38 insertions(+)

diff --git a/src/iceberg/table_requirement.h b/src/iceberg/table_requirement.h
index c054532a..eb818106 100644
--- a/src/iceberg/table_requirement.h
+++ b/src/iceberg/table_requirement.h
@@ -42,8 +42,22 @@ namespace iceberg {
 /// a specific type of requirement check.
 class ICEBERG_EXPORT TableRequirement {
  public:
+  enum class Kind : uint8_t {
+    AssertDoesNotExist,
+    AssertUUID,
+    AssertRefSnapshotID,
+    AssertLastAssignedFieldId,
+    AssertCurrentSchemaID,
+    AssertLastAssignedPartitionId,
+    AssertDefaultSpecID,
+    AssertDefaultSortOrderID,
+  };
+
   virtual ~TableRequirement() = default;
 
+  /// \brief Return the kind of requirement
+  virtual Kind kind() const = 0;
+
   /// \brief Validate this requirement against table metadata
   ///
   /// \param base The base table metadata to validate against (may be nullptr)
@@ -61,6 +75,8 @@ class ICEBERG_EXPORT AssertDoesNotExist : public 
TableRequirement {
  public:
   AssertDoesNotExist() = default;
 
+  Kind kind() const override { return Kind::AssertDoesNotExist; }
+
   Status Validate(const TableMetadata* base) const override;
 };
 
@@ -74,6 +90,8 @@ class ICEBERG_EXPORT AssertUUID : public TableRequirement {
 
   const std::string& uuid() const { return uuid_; }
 
+  Kind kind() const override { return Kind::AssertUUID; }
+
   Status Validate(const TableMetadata* base) const override;
 
  private:
@@ -94,6 +112,8 @@ class ICEBERG_EXPORT AssertRefSnapshotID : public 
TableRequirement {
 
   const std::optional<int64_t>& snapshot_id() const { return snapshot_id_; }
 
+  Kind kind() const override { return Kind::AssertRefSnapshotID; }
+
   Status Validate(const TableMetadata* base) const override;
 
  private:
@@ -112,6 +132,8 @@ class ICEBERG_EXPORT AssertLastAssignedFieldId : public 
TableRequirement {
 
   int32_t last_assigned_field_id() const { return last_assigned_field_id_; }
 
+  Kind kind() const override { return Kind::AssertLastAssignedFieldId; }
+
   Status Validate(const TableMetadata* base) const override;
 
  private:
@@ -128,6 +150,8 @@ class ICEBERG_EXPORT AssertCurrentSchemaID : public 
TableRequirement {
 
   int32_t schema_id() const { return schema_id_; }
 
+  Kind kind() const override { return Kind::AssertCurrentSchemaID; }
+
   Status Validate(const TableMetadata* base) const override;
 
  private:
@@ -145,6 +169,8 @@ class ICEBERG_EXPORT AssertLastAssignedPartitionId : public 
TableRequirement {
 
   int32_t last_assigned_partition_id() const { return 
last_assigned_partition_id_; }
 
+  Kind kind() const override { return Kind::AssertLastAssignedPartitionId; }
+
   Status Validate(const TableMetadata* base) const override;
 
  private:
@@ -161,6 +187,8 @@ class ICEBERG_EXPORT AssertDefaultSpecID : public 
TableRequirement {
 
   int32_t spec_id() const { return spec_id_; }
 
+  Kind kind() const override { return Kind::AssertDefaultSpecID; }
+
   Status Validate(const TableMetadata* base) const override;
 
  private:
@@ -178,6 +206,8 @@ class ICEBERG_EXPORT AssertDefaultSortOrderID : public 
TableRequirement {
 
   int32_t sort_order_id() const { return sort_order_id_; }
 
+  Kind kind() const override { return Kind::AssertDefaultSortOrderID; }
+
   Status Validate(const TableMetadata* base) const override;
 
  private:
diff --git a/src/iceberg/test/table_requirement_test.cc 
b/src/iceberg/test/table_requirement_test.cc
index 24af87df..8b67561f 100644
--- a/src/iceberg/test/table_requirement_test.cc
+++ b/src/iceberg/test/table_requirement_test.cc
@@ -36,6 +36,7 @@ TEST(TableRequirementTest, AssertUUID) {
 
   // Success - UUID matches
   table::AssertUUID requirement("test-uuid-1234");
+  EXPECT_EQ(TableRequirement::Kind::AssertUUID, requirement.kind());
   ASSERT_THAT(requirement.Validate(base.get()), IsOk());
 
   // UUID mismatch
@@ -62,6 +63,7 @@ TEST(TableRequirementTest, AssertCurrentSchemaID) {
 
   // Success - schema ID matches
   table::AssertCurrentSchemaID requirement(5);
+  EXPECT_EQ(TableRequirement::Kind::AssertCurrentSchemaID, requirement.kind());
   ASSERT_THAT(requirement.Validate(base.get()), IsOk());
 
   // Schema ID mismatch
@@ -87,6 +89,7 @@ TEST(TableRequirementTest, AssertCurrentSchemaID) {
 TEST(TableRequirementTest, AssertDoesNotExist) {
   // Success - table does not exist (null metadata)
   table::AssertDoesNotExist requirement;
+  EXPECT_EQ(TableRequirement::Kind::AssertDoesNotExist, requirement.kind());
   ASSERT_THAT(requirement.Validate(nullptr), IsOk());
 
   // Table already exists
@@ -105,6 +108,7 @@ TEST(TableRequirementTest, AssertRefSnapshotID) {
 
   // Success - ref snapshot ID matches
   table::AssertRefSnapshotID requirement("main", 100);
+  EXPECT_EQ(TableRequirement::Kind::AssertRefSnapshotID, requirement.kind());
   ASSERT_THAT(requirement.Validate(base.get()), IsOk());
 
   // Snapshot ID mismatch
@@ -136,6 +140,7 @@ TEST(TableRequirementTest, AssertLastAssignedFieldId) {
 
   // Success - field ID matches
   table::AssertLastAssignedFieldId requirement(10);
+  EXPECT_EQ(TableRequirement::Kind::AssertLastAssignedFieldId, 
requirement.kind());
   ASSERT_THAT(requirement.Validate(base.get()), IsOk());
 
   // Field ID mismatch
@@ -155,6 +160,7 @@ TEST(TableRequirementTest, AssertLastAssignedPartitionId) {
 
   // Success - partition ID matches
   table::AssertLastAssignedPartitionId requirement(5);
+  EXPECT_EQ(TableRequirement::Kind::AssertLastAssignedPartitionId, 
requirement.kind());
   ASSERT_THAT(requirement.Validate(base.get()), IsOk());
 
   // Partition ID mismatch
@@ -176,6 +182,7 @@ TEST(TableRequirementTest, AssertDefaultSpecID) {
 
   // Success - spec ID matches
   table::AssertDefaultSpecID requirement(3);
+  EXPECT_EQ(TableRequirement::Kind::AssertDefaultSpecID, requirement.kind());
   ASSERT_THAT(requirement.Validate(base.get()), IsOk());
 
   // Spec ID mismatch
@@ -191,6 +198,7 @@ TEST(TableRequirementTest, AssertDefaultSortOrderID) {
 
   // Success - sort order ID matches
   table::AssertDefaultSortOrderID requirement(2);
+  EXPECT_EQ(TableRequirement::Kind::AssertDefaultSortOrderID, 
requirement.kind());
   ASSERT_THAT(requirement.Validate(base.get()), IsOk());
 
   // Sort order ID mismatch

Reply via email to