@@ -336,22 +336,6 @@ struct TableMetadataBuilder::Impl {
336336 sort_orders_by_id.emplace (order->order_id (), order);
337337 }
338338 }
339-
340- int32_t ReuseOrCreateNewSortOrderId (const SortOrder& new_order) {
341- if (new_order.is_unsorted ()) {
342- return SortOrder::kUnsortedOrderId ;
343- }
344- // determine the next order id
345- int32_t new_order_id = SortOrder::kInitialSortOrderId ;
346- for (const auto & order : metadata.sort_orders ) {
347- if (order->SameOrder (new_order)) {
348- return order->order_id ();
349- } else if (new_order_id <= order->order_id ()) {
350- new_order_id = order->order_id () + 1 ;
351- }
352- }
353- return new_order_id;
354- }
355339};
356340
357341TableMetadataBuilder::TableMetadataBuilder (int8_t format_version)
@@ -463,16 +447,38 @@ TableMetadataBuilder& TableMetadataBuilder::RemoveSchemas(
463447
464448TableMetadataBuilder& TableMetadataBuilder::SetDefaultSortOrder (
465449 std::shared_ptr<SortOrder> order) {
466- throw IcebergError (std::format (" {} not implemented" , __FUNCTION__));
450+ BUILDER_ASSIGN_OR_RETURN (auto order_id, AddSortOrderInternal (order));
451+ return SetDefaultSortOrder (order_id);
467452}
468453
469454TableMetadataBuilder& TableMetadataBuilder::SetDefaultSortOrder (int32_t order_id) {
470- throw IcebergError (std::format (" {} not implemented" , __FUNCTION__));
455+ if (order_id == -1 ) {
456+ if (!impl_->last_added_order_id .has_value ()) {
457+ impl_->errors .emplace_back (
458+ ErrorKind::kInvalidArgument ,
459+ " Cannot set last added sort order: no sort order has been added" );
460+ return *this ;
461+ }
462+ return SetDefaultSortOrder (impl_->last_added_order_id .value ());
463+ }
464+
465+ if (order_id == impl_->metadata .default_sort_order_id ) {
466+ return *this ;
467+ }
468+ impl_->metadata .default_sort_order_id = order_id;
469+
470+ if (impl_->last_added_order_id .has_value () &&
471+ impl_->last_added_order_id .value () == order_id) {
472+ impl_->changes .push_back (std::make_unique<table::SetDefaultSortOrder>(-1 ));
473+ } else {
474+ impl_->changes .push_back (std::make_unique<table::SetDefaultSortOrder>(order_id));
475+ }
476+ return *this ;
471477}
472478
473- TableMetadataBuilder& TableMetadataBuilder::AddSortOrder (
479+ Result< int32_t > TableMetadataBuilder::AddSortOrderInternal (
474480 std::shared_ptr<SortOrder> order) {
475- int32_t new_order_id = impl_-> ReuseOrCreateNewSortOrderId (*order);
481+ int32_t new_order_id = ReuseOrCreateNewSortOrderId (*order);
476482
477483 if (impl_->sort_orders_by_id .find (new_order_id) != impl_->sort_orders_by_id .end ()) {
478484 // update last_added_order_id if the order was added in this set of changes (since it
@@ -487,20 +493,20 @@ TableMetadataBuilder& TableMetadataBuilder::AddSortOrder(
487493 }
488494 impl_->last_added_order_id =
489495 is_new_order ? std::make_optional (new_order_id) : std::nullopt ;
490- return * this ;
496+ return new_order_id ;
491497 }
492498
493499 // Get current schema and validate the sort order against it
494- BUILDER_ASSIGN_OR_RETURN (auto schema, impl_->metadata .Schema ());
495- BUILDER_RETURN_IF_ERROR (order->Validate (*schema));
500+ ICEBERG_ASSIGN_OR_RAISE (auto schema, impl_->metadata .Schema ());
501+ ICEBERG_RETURN_UNEXPECTED (order->Validate (*schema));
496502
497503 std::shared_ptr<SortOrder> new_order;
498504 if (order->is_unsorted ()) {
499505 new_order = SortOrder::Unsorted ();
500506 } else {
501507 // Unlike freshSortOrder from Java impl, we don't use field name from old bound
502508 // schema to rebuild the sort order.
503- BUILDER_ASSIGN_OR_RETURN (
509+ ICEBERG_ASSIGN_OR_RAISE (
504510 new_order,
505511 SortOrder::Make (new_order_id, std::vector<SortField>(order->fields ().begin (),
506512 order->fields ().end ())));
@@ -511,9 +517,31 @@ TableMetadataBuilder& TableMetadataBuilder::AddSortOrder(
511517
512518 impl_->changes .push_back (std::make_unique<table::AddSortOrder>(new_order));
513519 impl_->last_added_order_id = new_order_id;
520+ return new_order_id;
521+ }
522+
523+ TableMetadataBuilder& TableMetadataBuilder::AddSortOrder (
524+ std::shared_ptr<SortOrder> order) {
525+ BUILDER_ASSIGN_OR_RETURN (auto order_id, AddSortOrderInternal (order));
514526 return *this ;
515527}
516528
529+ int32_t TableMetadataBuilder::ReuseOrCreateNewSortOrderId (const SortOrder& new_order) {
530+ if (new_order.is_unsorted ()) {
531+ return SortOrder::kUnsortedOrderId ;
532+ }
533+ // determine the next order id
534+ int32_t new_order_id = SortOrder::kInitialSortOrderId ;
535+ for (const auto & order : impl_->metadata .sort_orders ) {
536+ if (order->SameOrder (new_order)) {
537+ return order->order_id ();
538+ } else if (new_order_id <= order->order_id ()) {
539+ new_order_id = order->order_id () + 1 ;
540+ }
541+ }
542+ return new_order_id;
543+ }
544+
517545TableMetadataBuilder& TableMetadataBuilder::AddSnapshot (
518546 std::shared_ptr<Snapshot> snapshot) {
519547 throw IcebergError (std::format (" {} not implemented" , __FUNCTION__));
0 commit comments