Skip to content

Commit e62acea

Browse files
authored
feat: add TableRequirement::Kind (#439)
1 parent 4557a6b commit e62acea

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

src/iceberg/table_requirement.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,22 @@ namespace iceberg {
4242
/// a specific type of requirement check.
4343
class ICEBERG_EXPORT TableRequirement {
4444
public:
45+
enum class Kind : uint8_t {
46+
AssertDoesNotExist,
47+
AssertUUID,
48+
AssertRefSnapshotID,
49+
AssertLastAssignedFieldId,
50+
AssertCurrentSchemaID,
51+
AssertLastAssignedPartitionId,
52+
AssertDefaultSpecID,
53+
AssertDefaultSortOrderID,
54+
};
55+
4556
virtual ~TableRequirement() = default;
4657

58+
/// \brief Return the kind of requirement
59+
virtual Kind kind() const = 0;
60+
4761
/// \brief Validate this requirement against table metadata
4862
///
4963
/// \param base The base table metadata to validate against (may be nullptr)
@@ -61,6 +75,8 @@ class ICEBERG_EXPORT AssertDoesNotExist : public TableRequirement {
6175
public:
6276
AssertDoesNotExist() = default;
6377

78+
Kind kind() const override { return Kind::AssertDoesNotExist; }
79+
6480
Status Validate(const TableMetadata* base) const override;
6581
};
6682

@@ -74,6 +90,8 @@ class ICEBERG_EXPORT AssertUUID : public TableRequirement {
7490

7591
const std::string& uuid() const { return uuid_; }
7692

93+
Kind kind() const override { return Kind::AssertUUID; }
94+
7795
Status Validate(const TableMetadata* base) const override;
7896

7997
private:
@@ -94,6 +112,8 @@ class ICEBERG_EXPORT AssertRefSnapshotID : public TableRequirement {
94112

95113
const std::optional<int64_t>& snapshot_id() const { return snapshot_id_; }
96114

115+
Kind kind() const override { return Kind::AssertRefSnapshotID; }
116+
97117
Status Validate(const TableMetadata* base) const override;
98118

99119
private:
@@ -112,6 +132,8 @@ class ICEBERG_EXPORT AssertLastAssignedFieldId : public TableRequirement {
112132

113133
int32_t last_assigned_field_id() const { return last_assigned_field_id_; }
114134

135+
Kind kind() const override { return Kind::AssertLastAssignedFieldId; }
136+
115137
Status Validate(const TableMetadata* base) const override;
116138

117139
private:
@@ -128,6 +150,8 @@ class ICEBERG_EXPORT AssertCurrentSchemaID : public TableRequirement {
128150

129151
int32_t schema_id() const { return schema_id_; }
130152

153+
Kind kind() const override { return Kind::AssertCurrentSchemaID; }
154+
131155
Status Validate(const TableMetadata* base) const override;
132156

133157
private:
@@ -145,6 +169,8 @@ class ICEBERG_EXPORT AssertLastAssignedPartitionId : public TableRequirement {
145169

146170
int32_t last_assigned_partition_id() const { return last_assigned_partition_id_; }
147171

172+
Kind kind() const override { return Kind::AssertLastAssignedPartitionId; }
173+
148174
Status Validate(const TableMetadata* base) const override;
149175

150176
private:
@@ -161,6 +187,8 @@ class ICEBERG_EXPORT AssertDefaultSpecID : public TableRequirement {
161187

162188
int32_t spec_id() const { return spec_id_; }
163189

190+
Kind kind() const override { return Kind::AssertDefaultSpecID; }
191+
164192
Status Validate(const TableMetadata* base) const override;
165193

166194
private:
@@ -178,6 +206,8 @@ class ICEBERG_EXPORT AssertDefaultSortOrderID : public TableRequirement {
178206

179207
int32_t sort_order_id() const { return sort_order_id_; }
180208

209+
Kind kind() const override { return Kind::AssertDefaultSortOrderID; }
210+
181211
Status Validate(const TableMetadata* base) const override;
182212

183213
private:

src/iceberg/test/table_requirement_test.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ TEST(TableRequirementTest, AssertUUID) {
3636

3737
// Success - UUID matches
3838
table::AssertUUID requirement("test-uuid-1234");
39+
EXPECT_EQ(TableRequirement::Kind::AssertUUID, requirement.kind());
3940
ASSERT_THAT(requirement.Validate(base.get()), IsOk());
4041

4142
// UUID mismatch
@@ -62,6 +63,7 @@ TEST(TableRequirementTest, AssertCurrentSchemaID) {
6263

6364
// Success - schema ID matches
6465
table::AssertCurrentSchemaID requirement(5);
66+
EXPECT_EQ(TableRequirement::Kind::AssertCurrentSchemaID, requirement.kind());
6567
ASSERT_THAT(requirement.Validate(base.get()), IsOk());
6668

6769
// Schema ID mismatch
@@ -87,6 +89,7 @@ TEST(TableRequirementTest, AssertCurrentSchemaID) {
8789
TEST(TableRequirementTest, AssertDoesNotExist) {
8890
// Success - table does not exist (null metadata)
8991
table::AssertDoesNotExist requirement;
92+
EXPECT_EQ(TableRequirement::Kind::AssertDoesNotExist, requirement.kind());
9093
ASSERT_THAT(requirement.Validate(nullptr), IsOk());
9194

9295
// Table already exists
@@ -105,6 +108,7 @@ TEST(TableRequirementTest, AssertRefSnapshotID) {
105108

106109
// Success - ref snapshot ID matches
107110
table::AssertRefSnapshotID requirement("main", 100);
111+
EXPECT_EQ(TableRequirement::Kind::AssertRefSnapshotID, requirement.kind());
108112
ASSERT_THAT(requirement.Validate(base.get()), IsOk());
109113

110114
// Snapshot ID mismatch
@@ -136,6 +140,7 @@ TEST(TableRequirementTest, AssertLastAssignedFieldId) {
136140

137141
// Success - field ID matches
138142
table::AssertLastAssignedFieldId requirement(10);
143+
EXPECT_EQ(TableRequirement::Kind::AssertLastAssignedFieldId, requirement.kind());
139144
ASSERT_THAT(requirement.Validate(base.get()), IsOk());
140145

141146
// Field ID mismatch
@@ -155,6 +160,7 @@ TEST(TableRequirementTest, AssertLastAssignedPartitionId) {
155160

156161
// Success - partition ID matches
157162
table::AssertLastAssignedPartitionId requirement(5);
163+
EXPECT_EQ(TableRequirement::Kind::AssertLastAssignedPartitionId, requirement.kind());
158164
ASSERT_THAT(requirement.Validate(base.get()), IsOk());
159165

160166
// Partition ID mismatch
@@ -176,6 +182,7 @@ TEST(TableRequirementTest, AssertDefaultSpecID) {
176182

177183
// Success - spec ID matches
178184
table::AssertDefaultSpecID requirement(3);
185+
EXPECT_EQ(TableRequirement::Kind::AssertDefaultSpecID, requirement.kind());
179186
ASSERT_THAT(requirement.Validate(base.get()), IsOk());
180187

181188
// Spec ID mismatch
@@ -191,6 +198,7 @@ TEST(TableRequirementTest, AssertDefaultSortOrderID) {
191198

192199
// Success - sort order ID matches
193200
table::AssertDefaultSortOrderID requirement(2);
201+
EXPECT_EQ(TableRequirement::Kind::AssertDefaultSortOrderID, requirement.kind());
194202
ASSERT_THAT(requirement.Validate(base.get()), IsOk());
195203

196204
// Sort order ID mismatch

0 commit comments

Comments
 (0)