@@ -339,22 +339,6 @@ struct TableMetadataBuilder::Impl {
339339 sort_orders_by_id.emplace (order->order_id (), order);
340340 }
341341 }
342-
343- int32_t ReuseOrCreateNewSortOrderId (const SortOrder& new_order) {
344- if (new_order.is_unsorted ()) {
345- return SortOrder::kUnsortedOrderId ;
346- }
347- // determine the next order id
348- int32_t new_order_id = SortOrder::kInitialSortOrderId ;
349- for (const auto & order : metadata.sort_orders ) {
350- if (order->SameOrder (new_order)) {
351- return order->order_id ();
352- } else if (new_order_id <= order->order_id ()) {
353- new_order_id = order->order_id () + 1 ;
354- }
355- }
356- return new_order_id;
357- }
358342};
359343
360344TableMetadataBuilder::TableMetadataBuilder (int8_t format_version)
@@ -467,16 +451,38 @@ TableMetadataBuilder& TableMetadataBuilder::RemoveSchemas(
467451
468452TableMetadataBuilder& TableMetadataBuilder::SetDefaultSortOrder (
469453 std::shared_ptr<SortOrder> order) {
470- throw IcebergError (std::format (" {} not implemented" , __FUNCTION__));
454+ BUILDER_ASSIGN_OR_RETURN (auto order_id, AddSortOrderInternal (order));
455+ return SetDefaultSortOrder (order_id);
471456}
472457
473458TableMetadataBuilder& TableMetadataBuilder::SetDefaultSortOrder (int32_t order_id) {
474- throw IcebergError (std::format (" {} not implemented" , __FUNCTION__));
459+ if (order_id == -1 ) {
460+ if (!impl_->last_added_order_id .has_value ()) {
461+ impl_->errors .emplace_back (
462+ ErrorKind::kInvalidArgument ,
463+ " Cannot set last added sort order: no sort order has been added" );
464+ return *this ;
465+ }
466+ return SetDefaultSortOrder (impl_->last_added_order_id .value ());
467+ }
468+
469+ if (order_id == impl_->metadata .default_sort_order_id ) {
470+ return *this ;
471+ }
472+ impl_->metadata .default_sort_order_id = order_id;
473+
474+ if (impl_->last_added_order_id .has_value () &&
475+ impl_->last_added_order_id .value () == order_id) {
476+ impl_->changes .push_back (std::make_unique<table::SetDefaultSortOrder>(-1 ));
477+ } else {
478+ impl_->changes .push_back (std::make_unique<table::SetDefaultSortOrder>(order_id));
479+ }
480+ return *this ;
475481}
476482
477- TableMetadataBuilder& TableMetadataBuilder::AddSortOrder (
483+ Result< int32_t > TableMetadataBuilder::AddSortOrderInternal (
478484 std::shared_ptr<SortOrder> order) {
479- int32_t new_order_id = impl_-> ReuseOrCreateNewSortOrderId (*order);
485+ int32_t new_order_id = ReuseOrCreateNewSortOrderId (*order);
480486
481487 if (impl_->sort_orders_by_id .find (new_order_id) != impl_->sort_orders_by_id .end ()) {
482488 // update last_added_order_id if the order was added in this set of changes (since it
@@ -491,20 +497,20 @@ TableMetadataBuilder& TableMetadataBuilder::AddSortOrder(
491497 }
492498 impl_->last_added_order_id =
493499 is_new_order ? std::make_optional (new_order_id) : std::nullopt ;
494- return * this ;
500+ return new_order_id ;
495501 }
496502
497503 // Get current schema and validate the sort order against it
498- BUILDER_ASSIGN_OR_RETURN (auto schema, impl_->metadata .Schema ());
499- BUILDER_RETURN_IF_ERROR (order->Validate (*schema));
504+ ICEBERG_ASSIGN_OR_RAISE (auto schema, impl_->metadata .Schema ());
505+ ICEBERG_RETURN_UNEXPECTED (order->Validate (*schema));
500506
501507 std::shared_ptr<SortOrder> new_order;
502508 if (order->is_unsorted ()) {
503509 new_order = SortOrder::Unsorted ();
504510 } else {
505511 // Unlike freshSortOrder from Java impl, we don't use field name from old bound
506512 // schema to rebuild the sort order.
507- BUILDER_ASSIGN_OR_RETURN (
513+ ICEBERG_ASSIGN_OR_RAISE (
508514 new_order,
509515 SortOrder::Make (new_order_id, std::vector<SortField>(order->fields ().begin (),
510516 order->fields ().end ())));
@@ -515,9 +521,31 @@ TableMetadataBuilder& TableMetadataBuilder::AddSortOrder(
515521
516522 impl_->changes .push_back (std::make_unique<table::AddSortOrder>(new_order));
517523 impl_->last_added_order_id = new_order_id;
524+ return new_order_id;
525+ }
526+
527+ TableMetadataBuilder& TableMetadataBuilder::AddSortOrder (
528+ std::shared_ptr<SortOrder> order) {
529+ BUILDER_ASSIGN_OR_RETURN (auto order_id, AddSortOrderInternal (order));
518530 return *this ;
519531}
520532
533+ int32_t TableMetadataBuilder::ReuseOrCreateNewSortOrderId (const SortOrder& new_order) {
534+ if (new_order.is_unsorted ()) {
535+ return SortOrder::kUnsortedOrderId ;
536+ }
537+ // determine the next order id
538+ int32_t new_order_id = SortOrder::kInitialSortOrderId ;
539+ for (const auto & order : impl_->metadata .sort_orders ) {
540+ if (order->SameOrder (new_order)) {
541+ return order->order_id ();
542+ } else if (new_order_id <= order->order_id ()) {
543+ new_order_id = order->order_id () + 1 ;
544+ }
545+ }
546+ return new_order_id;
547+ }
548+
521549TableMetadataBuilder& TableMetadataBuilder::AddSnapshot (
522550 std::shared_ptr<Snapshot> snapshot) {
523551 throw IcebergError (std::format (" {} not implemented" , __FUNCTION__));
0 commit comments