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