Skip to content

Commit b8edbdf

Browse files
authored
feat: add update sort order (#432)
1 parent f952779 commit b8edbdf

25 files changed

+565
-93
lines changed

src/iceberg/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ set(ICEBERG_SOURCES
7777
transform_function.cc
7878
type.cc
7979
update/pending_update.cc
80+
update/update_sort_order.cc
8081
update/update_properties.cc
8182
util/bucket_util.cc
8283
util/conversions.cc

src/iceberg/expression/term.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,8 @@ class ICEBERG_EXPORT BoundReference
151151

152152
std::shared_ptr<Type> type() const override { return field_.type(); }
153153

154+
int32_t field_id() const { return field_.field_id(); }
155+
154156
bool MayProduceNull() const override { return field_.optional(); }
155157

156158
bool Equals(const BoundTerm& other) const override;

src/iceberg/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ iceberg_sources = files(
100100
'type.cc',
101101
'update/pending_update.cc',
102102
'update/update_properties.cc',
103+
'update/update_sort_order.cc',
103104
'util/bucket_util.cc',
104105
'util/conversions.cc',
105106
'util/decimal.cc',

src/iceberg/sort_order.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ Result<std::unique_ptr<SortOrder>> SortOrder::Make(const Schema& schema, int32_t
111111
}
112112

113113
if (fields.empty() && sort_id != kUnsortedOrderId) [[unlikely]] {
114-
return InvalidArgument("Sort order must have at least one sort field");
114+
return InvalidArgument("Sort order must have at least one sort field.");
115115
}
116116

117117
auto sort_order = std::unique_ptr<SortOrder>(new SortOrder(sort_id, std::move(fields)));

src/iceberg/table.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,13 @@ Result<std::shared_ptr<UpdateProperties>> Table::NewUpdateProperties() {
154154
return transaction->NewUpdateProperties();
155155
}
156156

157+
Result<std::shared_ptr<UpdateSortOrder>> Table::NewUpdateSortOrder() {
158+
ICEBERG_ASSIGN_OR_RAISE(
159+
auto transaction, Transaction::Make(shared_from_this(), Transaction::Kind::kUpdate,
160+
/*auto_commit=*/true));
161+
return transaction->NewUpdateSortOrder();
162+
}
163+
157164
Result<std::shared_ptr<StagedTable>> StagedTable::Make(
158165
TableIdentifier identifier, std::shared_ptr<TableMetadata> metadata,
159166
std::string metadata_location, std::shared_ptr<FileIO> io,

src/iceberg/table.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,10 @@ class ICEBERG_EXPORT Table : public std::enable_shared_from_this<Table> {
132132
/// changes.
133133
virtual Result<std::shared_ptr<UpdateProperties>> NewUpdateProperties();
134134

135+
/// \brief Create a new UpdateSortOrder to update the table sort order and commit the
136+
/// changes.
137+
virtual Result<std::shared_ptr<UpdateSortOrder>> NewUpdateSortOrder();
138+
135139
protected:
136140
Table(TableIdentifier identifier, std::shared_ptr<TableMetadata> metadata,
137141
std::string metadata_location, std::shared_ptr<FileIO> io,

src/iceberg/table_metadata.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <ranges>
3030
#include <string>
3131
#include <unordered_map>
32+
#include <unordered_set>
3233
#include <utility>
3334

3435
#include <nlohmann/json.hpp>
@@ -426,7 +427,7 @@ class TableMetadataBuilder::Impl {
426427
Status SetDefaultSortOrder(int32_t order_id);
427428
Result<int32_t> AddSortOrder(const SortOrder& order);
428429
Status SetProperties(const std::unordered_map<std::string, std::string>& updated);
429-
Status RemoveProperties(const std::vector<std::string>& removed);
430+
Status RemoveProperties(const std::unordered_set<std::string>& removed);
430431

431432
std::unique_ptr<TableMetadata> Build();
432433

@@ -590,7 +591,7 @@ Status TableMetadataBuilder::Impl::SetProperties(
590591
}
591592

592593
Status TableMetadataBuilder::Impl::RemoveProperties(
593-
const std::vector<std::string>& removed) {
594+
const std::unordered_set<std::string>& removed) {
594595
// If removed is empty, return early (no-op)
595596
if (removed.empty()) {
596597
return {};
@@ -820,7 +821,7 @@ TableMetadataBuilder& TableMetadataBuilder::SetProperties(
820821
}
821822

822823
TableMetadataBuilder& TableMetadataBuilder::RemoveProperties(
823-
const std::vector<std::string>& removed) {
824+
const std::unordered_set<std::string>& removed) {
824825
ICEBERG_BUILDER_RETURN_IF_ERROR(impl_->RemoveProperties(removed));
825826
return *this;
826827
}

src/iceberg/table_metadata.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ class ICEBERG_EXPORT TableMetadataBuilder : public ErrorCollector {
394394
///
395395
/// \param removed Set of property keys to remove
396396
/// \return Reference to this builder for method chaining
397-
TableMetadataBuilder& RemoveProperties(const std::vector<std::string>& removed);
397+
TableMetadataBuilder& RemoveProperties(const std::unordered_set<std::string>& removed);
398398

399399
/// \brief Set the table location
400400
///

src/iceberg/table_update.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <optional>
2727
#include <string>
2828
#include <unordered_map>
29+
#include <unordered_set>
2930
#include <vector>
3031

3132
#include "iceberg/iceberg_export.h"
@@ -379,10 +380,10 @@ class ICEBERG_EXPORT SetProperties : public TableUpdate {
379380
/// \brief Represents removing table properties
380381
class ICEBERG_EXPORT RemoveProperties : public TableUpdate {
381382
public:
382-
explicit RemoveProperties(std::vector<std::string> removed)
383+
explicit RemoveProperties(std::unordered_set<std::string> removed)
383384
: removed_(std::move(removed)) {}
384385

385-
const std::vector<std::string>& removed() const { return removed_; }
386+
const std::unordered_set<std::string>& removed() const { return removed_; }
386387

387388
void ApplyTo(TableMetadataBuilder& builder) const override;
388389

@@ -391,7 +392,7 @@ class ICEBERG_EXPORT RemoveProperties : public TableUpdate {
391392
Kind kind() const override { return Kind::kRemoveProperties; }
392393

393394
private:
394-
std::vector<std::string> removed_;
395+
std::unordered_set<std::string> removed_;
395396
};
396397

397398
/// \brief Represents setting the table location

src/iceberg/test/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ if(ICEBERG_BUILD_BUNDLE)
154154
USE_BUNDLE
155155
SOURCES
156156
transaction_test.cc
157-
update_properties_test.cc)
157+
update_properties_test.cc
158+
update_sort_order_test.cc)
158159

159160
endif()
160161

0 commit comments

Comments
 (0)