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
2726namespace 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,28 +102,29 @@ 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
113111
114112void AddSortOrder::ApplyTo (TableMetadataBuilder& builder) const {
115- throw IcebergError ( std::format ( " {} not implemented " , __FUNCTION__) );
113+ builder. AddSortOrder (sort_order_ );
116114}
117115
118- Status AddSortOrder::GenerateRequirements (TableUpdateContext& context) const {
119- return NotImplemented ( " AddTableSortOrder::GenerateRequirements not implemented " );
116+ void AddSortOrder::GenerateRequirements (TableUpdateContext& context) const {
117+ // AddSortOrder doesn't generate any requirements
120118}
121119
122120// SetDefaultSortOrder
123121
124122void SetDefaultSortOrder::ApplyTo (TableMetadataBuilder& builder) const {
125- throw IcebergError ( std::format ( " {} not implemented " , __FUNCTION__) );
123+ builder. SetDefaultSortOrder (sort_order_id_ );
126124}
127125
128- Status SetDefaultSortOrder::GenerateRequirements (TableUpdateContext& context) const {
129- return NotImplemented ( " SetDefaultTableSortOrder::GenerateRequirements not implemented " );
126+ void SetDefaultSortOrder::GenerateRequirements (TableUpdateContext& context) const {
127+ context. RequireDefaultSortOrderIdUnchanged ( );
130128}
131129
132130// AddSnapshot
@@ -135,16 +133,16 @@ void AddSnapshot::ApplyTo(TableMetadataBuilder& builder) const {
135133 throw IcebergError (std::format (" {} not implemented" , __FUNCTION__));
136134}
137135
138- Status AddSnapshot::GenerateRequirements (TableUpdateContext& context) const {
139- return NotImplemented ( " AddTableSnapshot::GenerateRequirements not implemented " );
136+ void AddSnapshot::GenerateRequirements (TableUpdateContext& context) const {
137+ // AddSnapshot doesn't generate any requirements
140138}
141139
142140// RemoveSnapshots
143141
144142void RemoveSnapshots::ApplyTo (TableMetadataBuilder& builder) const {}
145143
146- Status RemoveSnapshots::GenerateRequirements (TableUpdateContext& context) const {
147- return NotImplemented ( " RemoveTableSnapshots::GenerateRequirements not implemented " );
144+ void RemoveSnapshots::GenerateRequirements (TableUpdateContext& context) const {
145+ // RemoveSnapshots doesn't generate any requirements
148146}
149147
150148// RemoveSnapshotRef
@@ -153,8 +151,8 @@ void RemoveSnapshotRef::ApplyTo(TableMetadataBuilder& builder) const {
153151 throw IcebergError (std::format (" {} not implemented" , __FUNCTION__));
154152}
155153
156- Status RemoveSnapshotRef::GenerateRequirements (TableUpdateContext& context) const {
157- return NotImplemented ( " RemoveTableSnapshotRef::GenerateRequirements not implemented " );
154+ void RemoveSnapshotRef::GenerateRequirements (TableUpdateContext& context) const {
155+ // RemoveSnapshotRef doesn't generate any requirements
158156}
159157
160158// SetSnapshotRef
@@ -163,8 +161,17 @@ void SetSnapshotRef::ApplyTo(TableMetadataBuilder& builder) const {
163161 throw IcebergError (std::format (" {} not implemented" , __FUNCTION__));
164162}
165163
166- Status SetSnapshotRef::GenerateRequirements (TableUpdateContext& context) const {
167- return NotImplemented (" SetTableSnapshotRef::GenerateRequirements not implemented" );
164+ void SetSnapshotRef::GenerateRequirements (TableUpdateContext& context) const {
165+ bool added = context.AddChangedRef (ref_name_);
166+ if (added && context.base () != nullptr && !context.is_replace ()) {
167+ const auto & refs = context.base ()->refs ;
168+ auto it = refs.find (ref_name_);
169+ // Require that the ref does not exist (nullopt) or is the same as the base snapshot
170+ std::optional<int64_t > base_snapshot_id =
171+ (it != refs.end ()) ? std::make_optional (it->second ->snapshot_id ) : std::nullopt ;
172+ context.AddRequirement (
173+ std::make_unique<table::AssertRefSnapshotID>(ref_name_, base_snapshot_id));
174+ }
168175}
169176
170177// SetProperties
@@ -173,9 +180,8 @@ void SetProperties::ApplyTo(TableMetadataBuilder& builder) const {
173180 builder.SetProperties (updated_);
174181}
175182
176- Status SetProperties::GenerateRequirements (TableUpdateContext& context) const {
177- // No requirements
178- return {};
183+ void SetProperties::GenerateRequirements (TableUpdateContext& context) const {
184+ // SetProperties doesn't generate any requirements
179185}
180186
181187// RemoveProperties
@@ -184,9 +190,8 @@ void RemoveProperties::ApplyTo(TableMetadataBuilder& builder) const {
184190 builder.RemoveProperties (removed_);
185191}
186192
187- Status RemoveProperties::GenerateRequirements (TableUpdateContext& context) const {
188- // No requirements
189- return {};
193+ void RemoveProperties::GenerateRequirements (TableUpdateContext& context) const {
194+ // RemoveProperties doesn't generate any requirements
190195}
191196
192197// SetLocation
@@ -195,8 +200,8 @@ void SetLocation::ApplyTo(TableMetadataBuilder& builder) const {
195200 throw IcebergError (std::format (" {} not implemented" , __FUNCTION__));
196201}
197202
198- Status SetLocation::GenerateRequirements (TableUpdateContext& context) const {
199- return NotImplemented ( " SetTableLocation::GenerateRequirements not implemented " );
203+ void SetLocation::GenerateRequirements (TableUpdateContext& context) const {
204+ // SetLocation doesn't generate any requirements
200205}
201206
202207} // namespace iceberg::table
0 commit comments