diff --git a/src/iceberg/table_requirement.h b/src/iceberg/table_requirement.h index c054532ac..eb818106c 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& 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 24af87dfd..8b67561f8 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