Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions src/iceberg/table_requirement.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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;
};

Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand Down
8 changes: 8 additions & 0 deletions src/iceberg/test/table_requirement_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
Loading