Skip to content

Commit c521ff1

Browse files
committed
1
1 parent 4830ae7 commit c521ff1

File tree

6 files changed

+327
-61
lines changed

6 files changed

+327
-61
lines changed

src/iceberg/snapshot.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ ICEBERG_EXPORT constexpr Result<SnapshotRefType> SnapshotRefTypeFromString(
6262

6363
/// \brief A reference to a snapshot, either a branch or a tag.
6464
struct ICEBERG_EXPORT SnapshotRef {
65+
static constexpr std::string_view kMainBranch = "main";
66+
6567
struct ICEBERG_EXPORT Branch {
6668
/// A positive number for the minimum number of snapshots to keep in a branch while
6769
/// expiring snapshots. Defaults to table property

src/iceberg/table_requirements.cc

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#include <memory>
2323

24+
#include "iceberg/snapshot.h"
2425
#include "iceberg/table_metadata.h"
2526
#include "iceberg/table_requirement.h"
2627
#include "iceberg/table_update.h"
@@ -85,12 +86,23 @@ void TableUpdateContext::RequireDefaultSortOrderIdUnchanged() {
8586
}
8687
}
8788

89+
void TableUpdateContext::RequireNoBranchesChanged() {
90+
if (base_ != nullptr && !is_replace_) {
91+
for (const auto& [name, ref] : base_->refs) {
92+
if (ref->type() == SnapshotRefType::kBranch && name != SnapshotRef::kMainBranch) {
93+
AddRequirement(
94+
std::make_unique<table::AssertRefSnapshotID>(name, ref->snapshot_id));
95+
}
96+
}
97+
}
98+
}
99+
88100
Result<std::vector<std::unique_ptr<TableRequirement>>> TableRequirements::ForCreateTable(
89101
const std::vector<std::unique_ptr<TableUpdate>>& table_updates) {
90102
TableUpdateContext context(nullptr, false);
91103
context.AddRequirement(std::make_unique<table::AssertDoesNotExist>());
92104
for (const auto& update : table_updates) {
93-
ICEBERG_RETURN_UNEXPECTED(update->GenerateRequirements(context));
105+
update->GenerateRequirements(context);
94106
}
95107
return context.Build();
96108
}
@@ -101,7 +113,7 @@ Result<std::vector<std::unique_ptr<TableRequirement>>> TableRequirements::ForRep
101113
TableUpdateContext context(&base, true);
102114
context.AddRequirement(std::make_unique<table::AssertUUID>(base.table_uuid));
103115
for (const auto& update : table_updates) {
104-
ICEBERG_RETURN_UNEXPECTED(update->GenerateRequirements(context));
116+
update->GenerateRequirements(context);
105117
}
106118
return context.Build();
107119
}
@@ -112,7 +124,7 @@ Result<std::vector<std::unique_ptr<TableRequirement>>> TableRequirements::ForUpd
112124
TableUpdateContext context(&base, false);
113125
context.AddRequirement(std::make_unique<table::AssertUUID>(base.table_uuid));
114126
for (const auto& update : table_updates) {
115-
ICEBERG_RETURN_UNEXPECTED(update->GenerateRequirements(context));
127+
update->GenerateRequirements(context);
116128
}
117129
return context.Build();
118130
}

src/iceberg/table_requirements.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ class ICEBERG_EXPORT TableUpdateContext {
7979
void RequireDefaultSpecIdUnchanged();
8080
/// \brief Require that the default sort order ID remains unchanged
8181
void RequireDefaultSortOrderIdUnchanged();
82+
/// \brief Require that no branches have been changed
83+
void RequireNoBranchesChanged();
8284

8385
private:
8486
const TableMetadata* base_;

src/iceberg/table_update.cc

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121

2222
#include "iceberg/exception.h"
2323
#include "iceberg/table_metadata.h"
24-
#include "iceberg/table_requirement.h"
2524
#include "iceberg/table_requirements.h"
2625

2726
namespace iceberg::table {
@@ -32,9 +31,8 @@ void AssignUUID::ApplyTo(TableMetadataBuilder& builder) const {
3231
builder.AssignUUID(uuid_);
3332
}
3433

35-
Status AssignUUID::GenerateRequirements(TableUpdateContext& context) const {
34+
void AssignUUID::GenerateRequirements(TableUpdateContext& context) const {
3635
// AssignUUID does not generate additional requirements.
37-
return {};
3836
}
3937

4038
// UpgradeFormatVersion
@@ -43,8 +41,8 @@ void UpgradeFormatVersion::ApplyTo(TableMetadataBuilder& builder) const {
4341
throw IcebergError(std::format("{} not implemented", __FUNCTION__));
4442
}
4543

46-
Status UpgradeFormatVersion::GenerateRequirements(TableUpdateContext& context) const {
47-
return NotImplemented("UpgradeFormatVersion::GenerateRequirements not implemented");
44+
void UpgradeFormatVersion::GenerateRequirements(TableUpdateContext& context) const {
45+
// UpgradeFormatVersion doesn't generate any requirements
4846
}
4947

5048
// AddSchema
@@ -53,8 +51,8 @@ void AddSchema::ApplyTo(TableMetadataBuilder& builder) const {
5351
throw IcebergError(std::format("{} not implemented", __FUNCTION__));
5452
}
5553

56-
Status AddSchema::GenerateRequirements(TableUpdateContext& context) const {
57-
return NotImplemented("AddTableSchema::GenerateRequirements not implemented");
54+
void AddSchema::GenerateRequirements(TableUpdateContext& context) const {
55+
context.RequireLastAssignedFieldIdUnchanged();
5856
}
5957

6058
// SetCurrentSchema
@@ -63,8 +61,8 @@ void SetCurrentSchema::ApplyTo(TableMetadataBuilder& builder) const {
6361
throw IcebergError(std::format("{} not implemented", __FUNCTION__));
6462
}
6563

66-
Status SetCurrentSchema::GenerateRequirements(TableUpdateContext& context) const {
67-
return NotImplemented("SetCurrentTableSchema::GenerateRequirements not implemented");
64+
void SetCurrentSchema::GenerateRequirements(TableUpdateContext& context) const {
65+
context.RequireCurrentSchemaIdUnchanged();
6866
}
6967

7068
// AddPartitionSpec
@@ -73,8 +71,8 @@ void AddPartitionSpec::ApplyTo(TableMetadataBuilder& builder) const {
7371
throw IcebergError(std::format("{} not implemented", __FUNCTION__));
7472
}
7573

76-
Status AddPartitionSpec::GenerateRequirements(TableUpdateContext& context) const {
77-
return NotImplemented("AddTablePartitionSpec::GenerateRequirements not implemented");
74+
void AddPartitionSpec::GenerateRequirements(TableUpdateContext& context) const {
75+
context.RequireLastAssignedPartitionIdUnchanged();
7876
}
7977

8078
// SetDefaultPartitionSpec
@@ -83,9 +81,8 @@ void SetDefaultPartitionSpec::ApplyTo(TableMetadataBuilder& builder) const {
8381
throw IcebergError(std::format("{} not implemented", __FUNCTION__));
8482
}
8583

86-
Status SetDefaultPartitionSpec::GenerateRequirements(TableUpdateContext& context) const {
87-
return NotImplemented(
88-
"SetDefaultTablePartitionSpec::GenerateRequirements not implemented");
84+
void SetDefaultPartitionSpec::GenerateRequirements(TableUpdateContext& context) const {
85+
context.RequireDefaultSpecIdUnchanged();
8986
}
9087

9188
// RemovePartitionSpecs
@@ -94,9 +91,9 @@ void RemovePartitionSpecs::ApplyTo(TableMetadataBuilder& builder) const {
9491
throw IcebergError(std::format("{} not implemented", __FUNCTION__));
9592
}
9693

97-
Status RemovePartitionSpecs::GenerateRequirements(TableUpdateContext& context) const {
98-
return NotImplemented(
99-
"RemoveTablePartitionSpecs::GenerateRequirements not implemented");
94+
void RemovePartitionSpecs::GenerateRequirements(TableUpdateContext& context) const {
95+
context.RequireDefaultSpecIdUnchanged();
96+
context.RequireNoBranchesChanged();
10097
}
10198

10299
// RemoveSchemas
@@ -105,8 +102,9 @@ void RemoveSchemas::ApplyTo(TableMetadataBuilder& builder) const {
105102
throw IcebergError(std::format("{} not implemented", __FUNCTION__));
106103
}
107104

108-
Status RemoveSchemas::GenerateRequirements(TableUpdateContext& context) const {
109-
return NotImplemented("RemoveTableSchemas::GenerateRequirements not implemented");
105+
void RemoveSchemas::GenerateRequirements(TableUpdateContext& context) const {
106+
context.RequireCurrentSchemaIdUnchanged();
107+
context.RequireNoBranchesChanged();
110108
}
111109

112110
// AddSortOrder
@@ -115,9 +113,8 @@ void AddSortOrder::ApplyTo(TableMetadataBuilder& builder) const {
115113
builder.AddSortOrder(sort_order_);
116114
}
117115

118-
Status AddSortOrder::GenerateRequirements(TableUpdateContext& context) const {
116+
void AddSortOrder::GenerateRequirements(TableUpdateContext& context) const {
119117
// AddSortOrder doesn't generate any requirements
120-
return {};
121118
}
122119

123120
// SetDefaultSortOrder
@@ -126,9 +123,8 @@ void SetDefaultSortOrder::ApplyTo(TableMetadataBuilder& builder) const {
126123
builder.SetDefaultSortOrder(sort_order_id_);
127124
}
128125

129-
Status SetDefaultSortOrder::GenerateRequirements(TableUpdateContext& context) const {
126+
void SetDefaultSortOrder::GenerateRequirements(TableUpdateContext& context) const {
130127
context.RequireDefaultSortOrderIdUnchanged();
131-
return {};
132128
}
133129

134130
// AddSnapshot
@@ -137,16 +133,16 @@ void AddSnapshot::ApplyTo(TableMetadataBuilder& builder) const {
137133
throw IcebergError(std::format("{} not implemented", __FUNCTION__));
138134
}
139135

140-
Status AddSnapshot::GenerateRequirements(TableUpdateContext& context) const {
141-
return NotImplemented("AddTableSnapshot::GenerateRequirements not implemented");
136+
void AddSnapshot::GenerateRequirements(TableUpdateContext& context) const {
137+
// AddSnapshot doesn't generate any requirements
142138
}
143139

144140
// RemoveSnapshots
145141

146142
void RemoveSnapshots::ApplyTo(TableMetadataBuilder& builder) const {}
147143

148-
Status RemoveSnapshots::GenerateRequirements(TableUpdateContext& context) const {
149-
return NotImplemented("RemoveTableSnapshots::GenerateRequirements not implemented");
144+
void RemoveSnapshots::GenerateRequirements(TableUpdateContext& context) const {
145+
throw NotImplemented("RemoveTableSnapshots::GenerateRequirements not implemented");
150146
}
151147

152148
// RemoveSnapshotRef
@@ -155,8 +151,8 @@ void RemoveSnapshotRef::ApplyTo(TableMetadataBuilder& builder) const {
155151
throw IcebergError(std::format("{} not implemented", __FUNCTION__));
156152
}
157153

158-
Status RemoveSnapshotRef::GenerateRequirements(TableUpdateContext& context) const {
159-
return NotImplemented("RemoveTableSnapshotRef::GenerateRequirements not implemented");
154+
void RemoveSnapshotRef::GenerateRequirements(TableUpdateContext& context) const {
155+
// RemoveSnapshotRef doesn't generate any requirements
160156
}
161157

162158
// SetSnapshotRef
@@ -165,8 +161,8 @@ void SetSnapshotRef::ApplyTo(TableMetadataBuilder& builder) const {
165161
throw IcebergError(std::format("{} not implemented", __FUNCTION__));
166162
}
167163

168-
Status SetSnapshotRef::GenerateRequirements(TableUpdateContext& context) const {
169-
return NotImplemented("SetTableSnapshotRef::GenerateRequirements not implemented");
164+
void SetSnapshotRef::GenerateRequirements(TableUpdateContext& context) const {
165+
throw NotImplemented("SetTableSnapshotRef::GenerateRequirements not implemented");
170166
}
171167

172168
// SetProperties
@@ -175,8 +171,8 @@ void SetProperties::ApplyTo(TableMetadataBuilder& builder) const {
175171
throw IcebergError(std::format("{} not implemented", __FUNCTION__));
176172
}
177173

178-
Status SetProperties::GenerateRequirements(TableUpdateContext& context) const {
179-
return NotImplemented("SetTableProperties::GenerateRequirements not implemented");
174+
void SetProperties::GenerateRequirements(TableUpdateContext& context) const {
175+
// SetProperties doesn't generate any requirements
180176
}
181177

182178
// RemoveProperties
@@ -185,8 +181,8 @@ void RemoveProperties::ApplyTo(TableMetadataBuilder& builder) const {
185181
throw IcebergError(std::format("{} not implemented", __FUNCTION__));
186182
}
187183

188-
Status RemoveProperties::GenerateRequirements(TableUpdateContext& context) const {
189-
return NotImplemented("RemoveTableProperties::GenerateRequirements not implemented");
184+
void RemoveProperties::GenerateRequirements(TableUpdateContext& context) const {
185+
// RemoveProperties doesn't generate any requirements
190186
}
191187

192188
// SetLocation
@@ -195,8 +191,8 @@ void SetLocation::ApplyTo(TableMetadataBuilder& builder) const {
195191
throw IcebergError(std::format("{} not implemented", __FUNCTION__));
196192
}
197193

198-
Status SetLocation::GenerateRequirements(TableUpdateContext& context) const {
199-
return NotImplemented("SetTableLocation::GenerateRequirements not implemented");
194+
void SetLocation::GenerateRequirements(TableUpdateContext& context) const {
195+
// SetLocation doesn't generate any requirements
200196
}
201197

202198
} // namespace iceberg::table

0 commit comments

Comments
 (0)