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 f9527791 refactor: move the TableMetadataBuilder's update into
TableMetadataBu… (#434)
f9527791 is described below
commit f952779196ae497d9e62db3e87b30f41fb82865d
Author: wzhuo <[email protected]>
AuthorDate: Wed Dec 24 16:28:11 2025 +0800
refactor: move the TableMetadataBuilder's update into TableMetadataBu…
(#434)
Refactor TableMetadataBuilder, so that all updates implement in
TableMetadataBuilder::Impl, and no more private method in header file for
TableMetadataBuilder class.
---
src/iceberg/table_metadata.cc | 509 +++++++++++++++++++++++-------------------
src/iceberg/table_metadata.h | 11 -
2 files changed, 285 insertions(+), 235 deletions(-)
diff --git a/src/iceberg/table_metadata.cc b/src/iceberg/table_metadata.cc
index 2136494f..40dcb03c 100644
--- a/src/iceberg/table_metadata.cc
+++ b/src/iceberg/table_metadata.cc
@@ -363,64 +363,295 @@ Result<std::string>
TableMetadataUtil::NewTableMetadataFilePath(const TableMetad
// TableMetadataBuilder implementation
-struct TableMetadataBuilder::Impl {
- // Base metadata (nullptr for new tables)
- const TableMetadata* base;
-
- // Working metadata copy
- TableMetadata metadata;
-
- // Change tracking
- std::vector<std::unique_ptr<TableUpdate>> changes;
- std::optional<int32_t> last_added_schema_id;
- std::optional<int32_t> last_added_order_id;
- std::optional<int32_t> last_added_spec_id;
-
- // Metadata location tracking
- std::string metadata_location;
- std::string previous_metadata_location;
-
- // indexes for convenience
- std::unordered_map<int32_t, std::shared_ptr<Schema>> schemas_by_id;
- std::unordered_map<int32_t, std::shared_ptr<PartitionSpec>> specs_by_id;
- std::unordered_map<int32_t, std::shared_ptr<SortOrder>> sort_orders_by_id;
-
+class TableMetadataBuilder::Impl {
+ public:
// Constructor for new table
- explicit Impl(int8_t format_version) : base(nullptr), metadata{} {
- metadata.format_version = format_version;
- metadata.last_sequence_number = TableMetadata::kInitialSequenceNumber;
- metadata.last_updated_ms = kInvalidLastUpdatedMs;
- metadata.last_column_id = Schema::kInvalidColumnId;
- metadata.default_spec_id = PartitionSpec::kInitialSpecId;
- metadata.last_partition_id = PartitionSpec::kInvalidPartitionFieldId;
- metadata.current_snapshot_id = Snapshot::kInvalidSnapshotId;
- metadata.default_sort_order_id = SortOrder::kInitialSortOrderId;
- metadata.next_row_id = TableMetadata::kInitialRowId;
+ explicit Impl(int8_t format_version) : base_(nullptr), metadata_{} {
+ metadata_.format_version = format_version;
+ metadata_.last_sequence_number = TableMetadata::kInitialSequenceNumber;
+ metadata_.last_updated_ms = kInvalidLastUpdatedMs;
+ metadata_.last_column_id = Schema::kInvalidColumnId;
+ metadata_.default_spec_id = PartitionSpec::kInitialSpecId;
+ metadata_.last_partition_id = PartitionSpec::kInvalidPartitionFieldId;
+ metadata_.current_snapshot_id = Snapshot::kInvalidSnapshotId;
+ metadata_.default_sort_order_id = SortOrder::kInitialSortOrderId;
+ metadata_.next_row_id = TableMetadata::kInitialRowId;
}
// Constructor from existing metadata
explicit Impl(const TableMetadata* base_metadata,
std::string base_metadata_location = "")
- : base(base_metadata), metadata(*base_metadata) {
+ : base_(base_metadata), metadata_(*base_metadata) {
// Initialize index maps from base metadata
- for (const auto& schema : metadata.schemas) {
+ for (const auto& schema : metadata_.schemas) {
if (schema->schema_id().has_value()) {
- schemas_by_id.emplace(schema->schema_id().value(), schema);
+ schemas_by_id_.emplace(schema->schema_id().value(), schema);
}
}
- for (const auto& spec : metadata.partition_specs) {
- specs_by_id.emplace(spec->spec_id(), spec);
+ for (const auto& spec : metadata_.partition_specs) {
+ specs_by_id_.emplace(spec->spec_id(), spec);
+ }
+
+ for (const auto& order : metadata_.sort_orders) {
+ sort_orders_by_id_.emplace(order->order_id(), order);
}
- for (const auto& order : metadata.sort_orders) {
- sort_orders_by_id.emplace(order->order_id(), order);
+ metadata_.last_updated_ms = kInvalidLastUpdatedMs;
+ }
+
+ bool UUIDSet() const { return !metadata_.table_uuid.empty(); }
+ const std::vector<std::unique_ptr<TableUpdate>>& changes() const { return
changes_; }
+ const TableMetadata* base() const { return base_; }
+ const TableMetadata& metadata() const { return metadata_; }
+
+ void SetMetadataLocation(std::string_view metadata_location) {
+ metadata_location_ = std::string(metadata_location);
+ if (base_ != nullptr) {
+ // Carry over lastUpdatedMillis from base and set previousFileLocation
to null to
+ // avoid writing a new metadata log entry.
+ // This is safe since setting metadata location doesn't cause any
changes and no
+ // other changes can be added when metadata location is configured
+ previous_metadata_location_ = std::string();
+ metadata_.last_updated_ms = base_->last_updated_ms;
}
+ }
- metadata.last_updated_ms = kInvalidLastUpdatedMs;
+ void SetPreviousMetadataLocation(std::string_view
previous_metadata_location) {
+ previous_metadata_location_ = std::string(previous_metadata_location);
}
+
+ Status AssignUUID(std::string_view uuid);
+ Status UpgradeFormatVersion(int8_t new_format_version);
+ Status SetDefaultSortOrder(int32_t order_id);
+ Result<int32_t> AddSortOrder(const SortOrder& order);
+ Status SetProperties(const std::unordered_map<std::string, std::string>&
updated);
+ Status RemoveProperties(const std::vector<std::string>& removed);
+
+ std::unique_ptr<TableMetadata> Build();
+
+ private:
+ /// \brief Internal method to check for existing sort order and reuse its ID
or create a
+ /// new one
+ /// \param new_order The sort order to check
+ /// \return The ID to use for this sort order (reused if exists, new
otherwise)
+ int32_t ReuseOrCreateNewSortOrderId(const SortOrder& new_order);
+
+ private:
+ // Base metadata (nullptr for new tables)
+ const TableMetadata* base_;
+
+ // Working metadata copy
+ TableMetadata metadata_;
+
+ // Change tracking
+ std::vector<std::unique_ptr<TableUpdate>> changes_;
+ std::optional<int32_t> last_added_schema_id_;
+ std::optional<int32_t> last_added_order_id_;
+ std::optional<int32_t> last_added_spec_id_;
+
+ // Metadata location tracking
+ std::string metadata_location_;
+ std::string previous_metadata_location_;
+
+ // indexes for convenience
+ std::unordered_map<int32_t, std::shared_ptr<Schema>> schemas_by_id_;
+ std::unordered_map<int32_t, std::shared_ptr<PartitionSpec>> specs_by_id_;
+ std::unordered_map<int32_t, std::shared_ptr<SortOrder>> sort_orders_by_id_;
};
+Status TableMetadataBuilder::Impl::AssignUUID(std::string_view uuid) {
+ if (uuid.empty()) {
+ return InvalidArgument("Cannot assign empty UUID");
+ }
+
+ std::string uuid_str = std::string(uuid);
+ // Check if UUID is already set to the same value (no-op)
+ if (StringUtils::EqualsIgnoreCase(metadata_.table_uuid, uuid_str)) {
+ return {};
+ }
+
+ // Update the metadata
+ metadata_.table_uuid = uuid_str;
+
+ // Record the change
+ changes_.push_back(std::make_unique<table::AssignUUID>(std::move(uuid_str)));
+ return {};
+}
+
+Status TableMetadataBuilder::Impl::UpgradeFormatVersion(int8_t
new_format_version) {
+ // Check that the new format version is supported
+ if (new_format_version > TableMetadata::kSupportedTableFormatVersion) {
+ return InvalidArgument(
+ "Cannot upgrade table to unsupported format version: v{} (supported:
v{})",
+ new_format_version, TableMetadata::kSupportedTableFormatVersion);
+ }
+
+ // Check that we're not downgrading
+ if (new_format_version < metadata_.format_version) {
+ return InvalidArgument("Cannot downgrade v{} table to v{}",
metadata_.format_version,
+ new_format_version);
+ }
+
+ // No-op if the version is the same
+ if (new_format_version == metadata_.format_version) {
+ return {};
+ }
+
+ // Update the format version
+ metadata_.format_version = new_format_version;
+
+ // Record the change
+
changes_.push_back(std::make_unique<table::UpgradeFormatVersion>(new_format_version));
+
+ return {};
+}
+
+Status TableMetadataBuilder::Impl::SetDefaultSortOrder(int32_t order_id) {
+ if (order_id == -1) {
+ if (!last_added_order_id_.has_value()) {
+ return InvalidArgument(
+ "Cannot set last added sort order: no sort order has been added");
+ }
+ return SetDefaultSortOrder(last_added_order_id_.value());
+ }
+
+ if (order_id == metadata_.default_sort_order_id) {
+ return {};
+ }
+
+ metadata_.default_sort_order_id = order_id;
+
+ if (last_added_order_id_ == std::make_optional(order_id)) {
+
changes_.push_back(std::make_unique<table::SetDefaultSortOrder>(kLastAdded));
+ } else {
+ changes_.push_back(std::make_unique<table::SetDefaultSortOrder>(order_id));
+ }
+ return {};
+}
+
+Result<int32_t> TableMetadataBuilder::Impl::AddSortOrder(const SortOrder&
order) {
+ int32_t new_order_id = ReuseOrCreateNewSortOrderId(order);
+
+ if (sort_orders_by_id_.find(new_order_id) != sort_orders_by_id_.end()) {
+ // update last_added_order_id if the order was added in this set of
changes (since it
+ // is now the last)
+ bool is_new_order =
+ last_added_order_id_.has_value() &&
+ std::ranges::find_if(changes_, [new_order_id](const auto& change) {
+ auto* add_sort_order =
dynamic_cast<table::AddSortOrder*>(change.get());
+ return add_sort_order &&
+ add_sort_order->sort_order()->order_id() == new_order_id;
+ }) != changes_.cend();
+ last_added_order_id_ = is_new_order ? std::make_optional(new_order_id) :
std::nullopt;
+ return new_order_id;
+ }
+
+ // Get current schema and validate the sort order against it
+ ICEBERG_ASSIGN_OR_RAISE(auto schema, metadata_.Schema());
+ ICEBERG_RETURN_UNEXPECTED(order.Validate(*schema));
+
+ std::shared_ptr<SortOrder> new_order;
+ if (order.is_unsorted()) {
+ new_order = SortOrder::Unsorted();
+ } else {
+ // Unlike freshSortOrder from Java impl, we don't use field name from old
bound
+ // schema to rebuild the sort order.
+ ICEBERG_ASSIGN_OR_RAISE(
+ new_order,
+ SortOrder::Make(new_order_id,
std::vector<SortField>(order.fields().begin(),
+
order.fields().end())));
+ }
+
+ metadata_.sort_orders.push_back(new_order);
+ sort_orders_by_id_.emplace(new_order_id, new_order);
+
+ changes_.push_back(std::make_unique<table::AddSortOrder>(new_order));
+ last_added_order_id_ = new_order_id;
+ return new_order_id;
+}
+
+Status TableMetadataBuilder::Impl::SetProperties(
+ const std::unordered_map<std::string, std::string>& updated) {
+ // If updated is empty, return early (no-op)
+ if (updated.empty()) {
+ return {};
+ }
+
+ // Add all updated properties to the metadata properties
+ for (const auto& [key, value] : updated) {
+ metadata_.properties.mutable_configs()[key] = value;
+ }
+
+ // Record the change
+ changes_.push_back(std::make_unique<table::SetProperties>(updated));
+
+ return {};
+}
+
+Status TableMetadataBuilder::Impl::RemoveProperties(
+ const std::vector<std::string>& removed) {
+ // If removed is empty, return early (no-op)
+ if (removed.empty()) {
+ return {};
+ }
+
+ // Remove each property from the metadata properties
+ for (const auto& key : removed) {
+ metadata_.properties.mutable_configs().erase(key);
+ }
+
+ // Record the change
+ changes_.push_back(std::make_unique<table::RemoveProperties>(removed));
+
+ return {};
+}
+
+std::unique_ptr<TableMetadata> TableMetadataBuilder::Impl::Build() {
+ // 1. Validate metadata consistency through TableMetadata#Validate
+
+ // 2. Update last_updated_ms if there are changes
+ if (metadata_.last_updated_ms == kInvalidLastUpdatedMs) {
+ metadata_.last_updated_ms =
+ TimePointMs{std::chrono::duration_cast<std::chrono::milliseconds>(
+ std::chrono::system_clock::now().time_since_epoch())};
+ }
+
+ // 3. Buildup metadata_log from base metadata
+ int32_t max_metadata_log_size =
+ metadata_.properties.Get(TableProperties::kMetadataPreviousVersionsMax);
+ if (base_ != nullptr && !previous_metadata_location_.empty()) {
+ metadata_.metadata_log.emplace_back(base_->last_updated_ms,
+ previous_metadata_location_);
+ }
+ if (metadata_.metadata_log.size() > max_metadata_log_size) {
+ metadata_.metadata_log.erase(metadata_.metadata_log.begin(),
+ metadata_.metadata_log.end() -
max_metadata_log_size);
+ }
+
+ // TODO(anyone): 4. update snapshot_log
+
+ // 5. Create and return the TableMetadata
+ return std::make_unique<TableMetadata>(std::move(metadata_));
+}
+
+int32_t TableMetadataBuilder::Impl::ReuseOrCreateNewSortOrderId(
+ const SortOrder& new_order) {
+ if (new_order.is_unsorted()) {
+ return SortOrder::kUnsortedOrderId;
+ }
+ // determine the next order id
+ int32_t new_order_id = SortOrder::kInitialSortOrderId;
+ for (const auto& order : metadata_.sort_orders) {
+ if (order->SameOrder(new_order)) {
+ return order->order_id();
+ } else if (new_order_id <= order->order_id()) {
+ new_order_id = order->order_id() + 1;
+ }
+ }
+ return new_order_id;
+}
+
TableMetadataBuilder::TableMetadataBuilder(int8_t format_version)
: impl_(std::make_unique<Impl>(format_version)) {}
@@ -447,77 +678,32 @@ std::unique_ptr<TableMetadataBuilder>
TableMetadataBuilder::BuildFrom(
TableMetadataBuilder& TableMetadataBuilder::SetMetadataLocation(
std::string_view metadata_location) {
- impl_->metadata_location = std::string(metadata_location);
- if (impl_->base != nullptr) {
- // Carry over lastUpdatedMillis from base and set previousFileLocation to
null to
- // avoid writing a new metadata log entry.
- // This is safe since setting metadata location doesn't cause any changes
and no other
- // changes can be added when metadata location is configured
- impl_->previous_metadata_location = std::string();
- impl_->metadata.last_updated_ms = impl_->base->last_updated_ms;
- }
+ impl_->SetMetadataLocation(metadata_location);
return *this;
}
TableMetadataBuilder& TableMetadataBuilder::SetPreviousMetadataLocation(
std::string_view previous_metadata_location) {
- impl_->previous_metadata_location = std::string(previous_metadata_location);
+ impl_->SetPreviousMetadataLocation(previous_metadata_location);
return *this;
}
TableMetadataBuilder& TableMetadataBuilder::AssignUUID() {
- if (impl_->metadata.table_uuid.empty()) {
+ if (!impl_->UUIDSet()) {
// Generate a random UUID
return AssignUUID(Uuid::GenerateV4().ToString());
}
-
return *this;
}
TableMetadataBuilder& TableMetadataBuilder::AssignUUID(std::string_view uuid) {
- std::string uuid_str(uuid);
-
- ICEBERG_BUILDER_CHECK(!uuid_str.empty(), "Cannot assign empty UUID");
-
- // Check if UUID is already set to the same value (no-op)
- if (StringUtils::EqualsIgnoreCase(impl_->metadata.table_uuid, uuid_str)) {
- return *this;
- }
-
- // Update the metadata
- impl_->metadata.table_uuid = uuid_str;
-
- // Record the change
-
impl_->changes.push_back(std::make_unique<table::AssignUUID>(std::move(uuid_str)));
-
+ ICEBERG_BUILDER_RETURN_IF_ERROR(impl_->AssignUUID(uuid));
return *this;
}
TableMetadataBuilder& TableMetadataBuilder::UpgradeFormatVersion(
int8_t new_format_version) {
- // Check that the new format version is supported
- ICEBERG_BUILDER_CHECK(
- new_format_version <= TableMetadata::kSupportedTableFormatVersion,
- "Cannot upgrade table to unsupported format version: v{} (supported:
v{})",
- new_format_version, TableMetadata::kSupportedTableFormatVersion);
-
- // Check that we're not downgrading
- ICEBERG_BUILDER_CHECK(new_format_version >= impl_->metadata.format_version,
- "Cannot downgrade v{} table to v{}",
- impl_->metadata.format_version, new_format_version);
-
- // No-op if the version is the same
- if (new_format_version == impl_->metadata.format_version) {
- return *this;
- }
-
- // Update the format version
- impl_->metadata.format_version = new_format_version;
-
- // Record the change
- impl_->changes.push_back(
- std::make_unique<table::UpgradeFormatVersion>(new_format_version));
-
+
ICEBERG_BUILDER_RETURN_IF_ERROR(impl_->UpgradeFormatVersion(new_format_version));
return *this;
}
@@ -560,96 +746,21 @@ TableMetadataBuilder& TableMetadataBuilder::RemoveSchemas(
TableMetadataBuilder& TableMetadataBuilder::SetDefaultSortOrder(
std::shared_ptr<SortOrder> order) {
- ICEBERG_BUILDER_ASSIGN_OR_RETURN(auto order_id,
AddSortOrderInternal(*order));
+ ICEBERG_BUILDER_ASSIGN_OR_RETURN(auto order_id, impl_->AddSortOrder(*order));
return SetDefaultSortOrder(order_id);
}
TableMetadataBuilder& TableMetadataBuilder::SetDefaultSortOrder(int32_t
order_id) {
- if (order_id == -1) {
- ICEBERG_BUILDER_CHECK(
- impl_->last_added_order_id.has_value(),
- "Cannot set last added sort order: no sort order has been added");
- return SetDefaultSortOrder(impl_->last_added_order_id.value());
- }
-
- if (order_id == impl_->metadata.default_sort_order_id) {
- return *this;
- }
-
- impl_->metadata.default_sort_order_id = order_id;
-
- if (impl_->last_added_order_id == std::make_optional(order_id)) {
-
impl_->changes.push_back(std::make_unique<table::SetDefaultSortOrder>(kLastAdded));
- } else {
-
impl_->changes.push_back(std::make_unique<table::SetDefaultSortOrder>(order_id));
- }
+ ICEBERG_BUILDER_RETURN_IF_ERROR(impl_->SetDefaultSortOrder(order_id));
return *this;
}
-Result<int32_t> TableMetadataBuilder::AddSortOrderInternal(const SortOrder&
order) {
- int32_t new_order_id = ReuseOrCreateNewSortOrderId(order);
-
- if (impl_->sort_orders_by_id.find(new_order_id) !=
impl_->sort_orders_by_id.end()) {
- // update last_added_order_id if the order was added in this set of
changes (since it
- // is now the last)
- bool is_new_order =
- impl_->last_added_order_id.has_value() &&
- std::ranges::find_if(impl_->changes, [new_order_id](const auto&
change) {
- auto* add_sort_order =
dynamic_cast<table::AddSortOrder*>(change.get());
- return add_sort_order &&
- add_sort_order->sort_order()->order_id() == new_order_id;
- }) != impl_->changes.cend();
- impl_->last_added_order_id =
- is_new_order ? std::make_optional(new_order_id) : std::nullopt;
- return new_order_id;
- }
-
- // Get current schema and validate the sort order against it
- ICEBERG_ASSIGN_OR_RAISE(auto schema, impl_->metadata.Schema());
- ICEBERG_RETURN_UNEXPECTED(order.Validate(*schema));
-
- std::shared_ptr<SortOrder> new_order;
- if (order.is_unsorted()) {
- new_order = SortOrder::Unsorted();
- } else {
- // Unlike freshSortOrder from Java impl, we don't use field name from old
bound
- // schema to rebuild the sort order.
- ICEBERG_ASSIGN_OR_RAISE(
- new_order,
- SortOrder::Make(new_order_id,
std::vector<SortField>(order.fields().begin(),
-
order.fields().end())));
- }
-
- impl_->metadata.sort_orders.push_back(new_order);
- impl_->sort_orders_by_id.emplace(new_order_id, new_order);
-
- impl_->changes.push_back(std::make_unique<table::AddSortOrder>(new_order));
- impl_->last_added_order_id = new_order_id;
- return new_order_id;
-}
-
TableMetadataBuilder& TableMetadataBuilder::AddSortOrder(
std::shared_ptr<SortOrder> order) {
- ICEBERG_BUILDER_ASSIGN_OR_RETURN(auto order_id,
AddSortOrderInternal(*order));
+ ICEBERG_BUILDER_ASSIGN_OR_RETURN(auto order_id, impl_->AddSortOrder(*order));
return *this;
}
-int32_t TableMetadataBuilder::ReuseOrCreateNewSortOrderId(const SortOrder&
new_order) {
- if (new_order.is_unsorted()) {
- return SortOrder::kUnsortedOrderId;
- }
- // determine the next order id
- int32_t new_order_id = SortOrder::kInitialSortOrderId;
- for (const auto& order : impl_->metadata.sort_orders) {
- if (order->SameOrder(new_order)) {
- return order->order_id();
- } else if (new_order_id <= order->order_id()) {
- new_order_id = order->order_id() + 1;
- }
- }
- return new_order_id;
-}
-
TableMetadataBuilder& TableMetadataBuilder::AddSnapshot(
std::shared_ptr<Snapshot> snapshot) {
throw IcebergError(std::format("{} not implemented", __FUNCTION__));
@@ -704,37 +815,13 @@ TableMetadataBuilder&
TableMetadataBuilder::RemovePartitionStatistics(
TableMetadataBuilder& TableMetadataBuilder::SetProperties(
const std::unordered_map<std::string, std::string>& updated) {
- // If updated is empty, return early (no-op)
- if (updated.empty()) {
- return *this;
- }
-
- // Add all updated properties to the metadata properties
- for (const auto& [key, value] : updated) {
- impl_->metadata.properties.mutable_configs()[key] = value;
- }
-
- // Record the change
- impl_->changes.push_back(std::make_unique<table::SetProperties>(updated));
-
+ ICEBERG_BUILDER_RETURN_IF_ERROR(impl_->SetProperties(updated));
return *this;
}
TableMetadataBuilder& TableMetadataBuilder::RemoveProperties(
const std::vector<std::string>& removed) {
- // If removed is empty, return early (no-op)
- if (removed.empty()) {
- return *this;
- }
-
- // Remove each property from the metadata properties
- for (const auto& key : removed) {
- impl_->metadata.properties.mutable_configs().erase(key);
- }
-
- // Record the change
- impl_->changes.push_back(std::make_unique<table::RemoveProperties>(removed));
-
+ ICEBERG_BUILDER_RETURN_IF_ERROR(impl_->RemoveProperties(removed));
return *this;
}
@@ -754,41 +841,15 @@ TableMetadataBuilder&
TableMetadataBuilder::RemoveEncryptionKey(std::string_view
Result<std::unique_ptr<TableMetadata>> TableMetadataBuilder::Build() {
// 1. Check for accumulated errors
ICEBERG_RETURN_UNEXPECTED(CheckErrors());
-
- // 2. Validate metadata consistency through TableMetadata#Validate
-
- // 3. Update last_updated_ms if there are changes
- if (impl_->metadata.last_updated_ms == kInvalidLastUpdatedMs) {
- impl_->metadata.last_updated_ms =
- TimePointMs{std::chrono::duration_cast<std::chrono::milliseconds>(
- std::chrono::system_clock::now().time_since_epoch())};
- }
-
- // 4. Buildup metadata_log from base metadata
- int32_t max_metadata_log_size =
-
impl_->metadata.properties.Get(TableProperties::kMetadataPreviousVersionsMax);
- if (impl_->base != nullptr && !impl_->previous_metadata_location.empty()) {
- impl_->metadata.metadata_log.emplace_back(impl_->base->last_updated_ms,
-
impl_->previous_metadata_location);
- }
- if (impl_->metadata.metadata_log.size() > max_metadata_log_size) {
- impl_->metadata.metadata_log.erase(
- impl_->metadata.metadata_log.begin(),
- impl_->metadata.metadata_log.end() - max_metadata_log_size);
- }
-
- // TODO(anyone): 5. update snapshot_log
-
- // 6. Create and return the TableMetadata
- return std::make_unique<TableMetadata>(std::move(impl_->metadata));
+ return impl_->Build();
}
const std::vector<std::unique_ptr<TableUpdate>>&
TableMetadataBuilder::changes() const {
- return impl_->changes;
+ return impl_->changes();
}
-const TableMetadata* TableMetadataBuilder::base() const { return impl_->base; }
+const TableMetadata* TableMetadataBuilder::base() const { return
impl_->base(); }
-const TableMetadata& TableMetadataBuilder::current() const { return
impl_->metadata; }
+const TableMetadata& TableMetadataBuilder::current() const { return
impl_->metadata(); }
} // namespace iceberg
diff --git a/src/iceberg/table_metadata.h b/src/iceberg/table_metadata.h
index 3f2f3610..ce7975c6 100644
--- a/src/iceberg/table_metadata.h
+++ b/src/iceberg/table_metadata.h
@@ -446,17 +446,6 @@ class ICEBERG_EXPORT TableMetadataBuilder : public
ErrorCollector {
/// \brief Private constructor for building from existing metadata
explicit TableMetadataBuilder(const TableMetadata* base);
- /// \brief Internal method to add a sort order and return its ID
- /// \param order The sort order to add
- /// \return The ID of the added or reused sort order
- Result<int32_t> AddSortOrderInternal(const SortOrder& order);
-
- /// \brief Internal method to check for existing sort order and reuse its ID
or create a
- /// new one
- /// \param new_order The sort order to check
- /// \return The ID to use for this sort order (reused if exists, new
otherwise)
- int32_t ReuseOrCreateNewSortOrderId(const SortOrder& new_order);
-
/// Internal state members
struct Impl;
std::unique_ptr<Impl> impl_;