@@ -706,23 +706,6 @@ Status TableMetadataBuilder::Impl::RemoveSchemas(const std::vector<int32_t>& sch
706706 return {};
707707}
708708
709- int32_t TableMetadataBuilder::Impl::ReuseOrCreateNewSortOrderId (
710- const SortOrder& new_order) {
711- if (new_order.is_unsorted ()) {
712- return SortOrder::kUnsortedOrderId ;
713- }
714- // determine the next order id
715- int32_t new_order_id = SortOrder::kInitialSortOrderId ;
716- for (const auto & order : metadata_.sort_orders ) {
717- if (order->SameOrder (new_order)) {
718- return order->order_id ();
719- } else if (new_order_id <= order->order_id ()) {
720- new_order_id = order->order_id () + 1 ;
721- }
722- }
723- return new_order_id;
724- }
725-
726709Result<int32_t > TableMetadataBuilder::Impl::AddSchema (const Schema& schema,
727710 int32_t new_last_column_id) {
728711 if (new_last_column_id < metadata_.last_column_id ) {
@@ -765,6 +748,70 @@ Result<int32_t> TableMetadataBuilder::Impl::AddSchema(const Schema& schema,
765748 return new_schema_id;
766749}
767750
751+ Result<std::unique_ptr<TableMetadata>> TableMetadataBuilder::Impl::Build () {
752+ // 1. Validate metadata consistency through TableMetadata#Validate
753+
754+ // 2. Update last_updated_ms if there are changes
755+ if (metadata_.last_updated_ms == kInvalidLastUpdatedMs ) {
756+ metadata_.last_updated_ms =
757+ TimePointMs{std::chrono::duration_cast<std::chrono::milliseconds>(
758+ std::chrono::system_clock::now ().time_since_epoch ())};
759+ }
760+
761+ auto current_schema_id = metadata_.current_schema_id .value_or (Schema::kInitialSchemaId );
762+ auto schema_it = schemas_by_id_.find (current_schema_id);
763+ ICEBERG_PRECHECK (schema_it != schemas_by_id_.end (),
764+ " Current schema ID {} not found in schemas" , current_schema_id);
765+ const auto & current_schema = schema_it->second ;
766+ {
767+ auto spec_it = specs_by_id_.find (metadata_.default_spec_id );
768+ // FIXME(GuoTao.yu): Default spec must exist after we support update partition spec
769+ if (spec_it != specs_by_id_.end ()) {
770+ ICEBERG_RETURN_UNEXPECTED (
771+ spec_it->second ->Validate (*current_schema, /* allow_missing_fields=*/ false ));
772+ }
773+ auto sort_order_it = sort_orders_by_id_.find (metadata_.default_sort_order_id );
774+ ICEBERG_PRECHECK (sort_order_it != sort_orders_by_id_.end (),
775+ " Default sort order ID {} not found in sort orders" ,
776+ metadata_.default_sort_order_id );
777+ ICEBERG_RETURN_UNEXPECTED (sort_order_it->second ->Validate (*current_schema));
778+ }
779+
780+ // 3. Buildup metadata_log from base metadata
781+ int32_t max_metadata_log_size =
782+ metadata_.properties .Get (TableProperties::kMetadataPreviousVersionsMax );
783+ if (base_ != nullptr && !previous_metadata_location_.empty ()) {
784+ metadata_.metadata_log .emplace_back (base_->last_updated_ms ,
785+ previous_metadata_location_);
786+ }
787+ if (metadata_.metadata_log .size () > max_metadata_log_size) {
788+ metadata_.metadata_log .erase (metadata_.metadata_log .begin (),
789+ metadata_.metadata_log .end () - max_metadata_log_size);
790+ }
791+
792+ // TODO(anyone): 4. update snapshot_log
793+
794+ // 5. Create and return the TableMetadata
795+ return std::make_unique<TableMetadata>(std::move (metadata_));
796+ }
797+
798+ int32_t TableMetadataBuilder::Impl::ReuseOrCreateNewSortOrderId (
799+ const SortOrder& new_order) {
800+ if (new_order.is_unsorted ()) {
801+ return SortOrder::kUnsortedOrderId ;
802+ }
803+ // determine the next order id
804+ int32_t new_order_id = SortOrder::kInitialSortOrderId ;
805+ for (const auto & order : metadata_.sort_orders ) {
806+ if (order->SameOrder (new_order)) {
807+ return order->order_id ();
808+ } else if (new_order_id <= order->order_id ()) {
809+ new_order_id = order->order_id () + 1 ;
810+ }
811+ }
812+ return new_order_id;
813+ }
814+
768815int32_t TableMetadataBuilder::Impl::ReuseOrCreateNewSchemaId (
769816 const Schema& new_schema) const {
770817 // if the schema already exists, use its id; otherwise use the highest id + 1
@@ -816,53 +863,6 @@ Result<std::unique_ptr<SortOrder>> TableMetadataBuilder::Impl::UpdateSortOrderSc
816863 return SortOrder::Make (sort_order.order_id (), std::move (new_fields));
817864}
818865
819- Result<std::unique_ptr<TableMetadata>> TableMetadataBuilder::Impl::Build () {
820- // 1. Validate metadata consistency through TableMetadata#Validate
821-
822- // 2. Update last_updated_ms if there are changes
823- if (metadata_.last_updated_ms == kInvalidLastUpdatedMs ) {
824- metadata_.last_updated_ms =
825- TimePointMs{std::chrono::duration_cast<std::chrono::milliseconds>(
826- std::chrono::system_clock::now ().time_since_epoch ())};
827- }
828-
829- auto current_schema_id = metadata_.current_schema_id .value_or (Schema::kInitialSchemaId );
830- auto schema_it = schemas_by_id_.find (current_schema_id);
831- ICEBERG_PRECHECK (schema_it != schemas_by_id_.end (),
832- " Current schema ID {} not found in schemas" , current_schema_id);
833- const auto & current_schema = schema_it->second ;
834- {
835- auto spec_it = specs_by_id_.find (metadata_.default_spec_id );
836- // FIXME(GuoTao.yu): Default spec must exist after we support update partition spec
837- if (spec_it != specs_by_id_.end ()) {
838- ICEBERG_RETURN_UNEXPECTED (
839- spec_it->second ->Validate (*current_schema, /* allow_missing_fields=*/ false ));
840- }
841- auto sort_order_it = sort_orders_by_id_.find (metadata_.default_sort_order_id );
842- ICEBERG_PRECHECK (sort_order_it != sort_orders_by_id_.end (),
843- " Default sort order ID {} not found in sort orders" ,
844- metadata_.default_sort_order_id );
845- ICEBERG_RETURN_UNEXPECTED (sort_order_it->second ->Validate (*current_schema));
846- }
847-
848- // 3. Buildup metadata_log from base metadata
849- int32_t max_metadata_log_size =
850- metadata_.properties .Get (TableProperties::kMetadataPreviousVersionsMax );
851- if (base_ != nullptr && !previous_metadata_location_.empty ()) {
852- metadata_.metadata_log .emplace_back (base_->last_updated_ms ,
853- previous_metadata_location_);
854- }
855- if (metadata_.metadata_log .size () > max_metadata_log_size) {
856- metadata_.metadata_log .erase (metadata_.metadata_log .begin (),
857- metadata_.metadata_log .end () - max_metadata_log_size);
858- }
859-
860- // TODO(anyone): 4. update snapshot_log
861-
862- // 5. Create and return the TableMetadata
863- return std::make_unique<TableMetadata>(std::move (metadata_));
864- }
865-
866866TableMetadataBuilder::TableMetadataBuilder (int8_t format_version)
867867 : impl_(std::make_unique<Impl>(format_version)) {}
868868
0 commit comments