Skip to content

Commit 31275eb

Browse files
committed
refactor: make SortOrder constructor private
1 parent abd6b3f commit 31275eb

File tree

7 files changed

+102
-66
lines changed

7 files changed

+102
-66
lines changed

src/iceberg/json_internal.cc

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,19 @@ Result<std::unique_ptr<SortField>> SortFieldFromJson(const nlohmann::json& json)
206206
null_order);
207207
}
208208

209+
Result<std::unique_ptr<SortOrder>> SortOrderFromJson(
210+
const nlohmann::json& json, const std::shared_ptr<Schema>& current_schema) {
211+
ICEBERG_ASSIGN_OR_RAISE(auto order_id, GetJsonValue<int32_t>(json, kOrderId));
212+
ICEBERG_ASSIGN_OR_RAISE(auto fields, GetJsonValue<nlohmann::json>(json, kFields));
213+
214+
std::vector<SortField> sort_fields;
215+
for (const auto& field_json : fields) {
216+
ICEBERG_ASSIGN_OR_RAISE(auto sort_field, SortFieldFromJson(field_json));
217+
sort_fields.push_back(std::move(*sort_field));
218+
}
219+
return SortOrder::Make(*current_schema, order_id, std::move(sort_fields));
220+
}
221+
209222
Result<std::unique_ptr<SortOrder>> SortOrderFromJson(const nlohmann::json& json) {
210223
ICEBERG_ASSIGN_OR_RAISE(auto order_id, GetJsonValue<int32_t>(json, kOrderId));
211224
ICEBERG_ASSIGN_OR_RAISE(auto fields, GetJsonValue<nlohmann::json>(json, kFields));
@@ -215,7 +228,7 @@ Result<std::unique_ptr<SortOrder>> SortOrderFromJson(const nlohmann::json& json)
215228
ICEBERG_ASSIGN_OR_RAISE(auto sort_field, SortFieldFromJson(field_json));
216229
sort_fields.push_back(std::move(*sort_field));
217230
}
218-
return std::make_unique<SortOrder>(order_id, std::move(sort_fields));
231+
return SortOrder::Make(order_id, std::move(sort_fields));
219232
}
220233

221234
nlohmann::json ToJson(const SchemaField& field) {
@@ -915,9 +928,11 @@ Status ParsePartitionSpecs(const nlohmann::json& json, int8_t format_version,
915928
///
916929
/// \param[in] json The JSON object to parse.
917930
/// \param[in] format_version The format version of the table.
931+
/// \param[in] current_schema The current schema.
918932
/// \param[out] default_sort_order_id The default sort order ID.
919933
/// \param[out] sort_orders The list of sort orders.
920934
Status ParseSortOrders(const nlohmann::json& json, int8_t format_version,
935+
const std::shared_ptr<Schema>& current_schema,
921936
int32_t& default_sort_order_id,
922937
std::vector<std::shared_ptr<SortOrder>>& sort_orders) {
923938
if (json.contains(kSortOrders)) {
@@ -926,7 +941,8 @@ Status ParseSortOrders(const nlohmann::json& json, int8_t format_version,
926941
ICEBERG_ASSIGN_OR_RAISE(auto sort_order_array,
927942
GetJsonValue<nlohmann::json>(json, kSortOrders));
928943
for (const auto& sort_order_json : sort_order_array) {
929-
ICEBERG_ASSIGN_OR_RAISE(auto sort_order, SortOrderFromJson(sort_order_json));
944+
ICEBERG_ASSIGN_OR_RAISE(auto sort_order,
945+
SortOrderFromJson(sort_order_json, current_schema));
930946
sort_orders.push_back(std::move(sort_order));
931947
}
932948
} else {
@@ -1001,9 +1017,9 @@ Result<std::unique_ptr<TableMetadata>> TableMetadataFromJson(const nlohmann::jso
10011017
}
10021018
}
10031019

1004-
ICEBERG_RETURN_UNEXPECTED(ParseSortOrders(json, table_metadata->format_version,
1005-
table_metadata->default_sort_order_id,
1006-
table_metadata->sort_orders));
1020+
ICEBERG_RETURN_UNEXPECTED(ParseSortOrders(
1021+
json, table_metadata->format_version, current_schema,
1022+
table_metadata->default_sort_order_id, table_metadata->sort_orders));
10071023

10081024
if (json.contains(kProperties)) {
10091025
ICEBERG_ASSIGN_OR_RAISE(table_metadata->properties, FromJsonMap(json, kProperties));

src/iceberg/json_internal.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,15 @@ ICEBERG_EXPORT nlohmann::json ToJson(const SortOrder& sort_order);
6969
/// Each `SortField` will be parsed using the `SortFieldFromJson` function.
7070
///
7171
/// \param json The JSON object representing a `SortOrder`.
72+
/// \param current_schema The current schema associated with the sort order.
7273
/// \return An `expected` value containing either a `SortOrder` object or an error. If the
7374
/// JSON is malformed or missing expected fields, an error will be returned.
75+
ICEBERG_EXPORT Result<std::unique_ptr<SortOrder>> SortOrderFromJson(
76+
const nlohmann::json& json, const std::shared_ptr<Schema>& current_schema);
77+
78+
/// \brief Deserializes a JSON object into a `SortOrder` object.
79+
///
80+
/// Same as above but the returned SortOrder will not be validated against any schema.
7481
ICEBERG_EXPORT Result<std::unique_ptr<SortOrder>> SortOrderFromJson(
7582
const nlohmann::json& json);
7683

src/iceberg/sort_order.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ SortOrder::SortOrder(int32_t order_id, std::vector<SortField> fields)
3636
: order_id_(order_id), fields_(std::move(fields)) {}
3737

3838
const std::shared_ptr<SortOrder>& SortOrder::Unsorted() {
39-
static const std::shared_ptr<SortOrder> unsorted =
40-
std::make_shared<SortOrder>(kUnsortedOrderId, std::vector<SortField>{});
39+
static const std::shared_ptr<SortOrder> unsorted = std::shared_ptr<SortOrder>(
40+
new SortOrder(kUnsortedOrderId, std::vector<SortField>{}));
4141
return unsorted;
4242
}
4343

@@ -126,7 +126,7 @@ Result<std::unique_ptr<SortOrder>> SortOrder::Make(const Schema& schema, int32_t
126126
}
127127
}
128128

129-
return std::make_unique<SortOrder>(sort_id, std::move(fields));
129+
return std::unique_ptr<SortOrder>(new SortOrder(sort_id, std::move(fields)));
130130
}
131131

132132
Result<std::unique_ptr<SortOrder>> SortOrder::Make(int32_t sort_id,
@@ -139,7 +139,7 @@ Result<std::unique_ptr<SortOrder>> SortOrder::Make(int32_t sort_id,
139139
return InvalidArgument("Sort order must have at least one sort field");
140140
}
141141

142-
return std::make_unique<SortOrder>(sort_id, std::move(fields));
142+
return std::unique_ptr<SortOrder>(new SortOrder(sort_id, std::move(fields)));
143143
}
144144

145145
} // namespace iceberg

src/iceberg/sort_order.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ class ICEBERG_EXPORT SortOrder : public util::Formattable {
4141
static constexpr int32_t kUnsortedOrderId = 0;
4242
static constexpr int32_t kInitialSortOrderId = 1;
4343

44-
SortOrder(int32_t order_id, std::vector<SortField> fields);
45-
4644
/// \brief Get an unsorted sort order singleton.
4745
static const std::shared_ptr<SortOrder>& Unsorted();
4846

@@ -95,6 +93,12 @@ class ICEBERG_EXPORT SortOrder : public util::Formattable {
9593
std::vector<SortField> fields);
9694

9795
private:
96+
/// \brief Constructs a SortOrder instance.
97+
/// \param order_id The sort order id.
98+
/// \param fields The sort fields.
99+
/// \note Use the static Make methods to create SortOrder instances.
100+
SortOrder(int32_t order_id, std::vector<SortField> fields);
101+
98102
/// \brief Compare two sort orders for equality.
99103
bool Equals(const SortOrder& other) const;
100104

src/iceberg/test/json_internal_test.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,13 @@ TEST(JsonInternalTest, SortOrder) {
110110
auto identity_transform = Transform::Identity();
111111
SortField st_ts(5, identity_transform, SortDirection::kAscending, NullOrder::kFirst);
112112
SortField st_bar(7, identity_transform, SortDirection::kDescending, NullOrder::kLast);
113-
SortOrder sort_order(100, {st_ts, st_bar});
114-
113+
ICEBERG_UNWRAP_OR_FAIL(auto sort_order, SortOrder::Make(100, {st_ts, st_bar}));
115114
nlohmann::json expected_sort_order =
116115
R"({"order-id":100,"fields":[
117116
{"transform":"identity","source-id":5,"direction":"asc","null-order":"nulls-first"},
118117
{"transform":"identity","source-id":7,"direction":"desc","null-order":"nulls-last"}]})"_json;
119118

120-
TestJsonConversion(sort_order, expected_sort_order);
119+
TestJsonConversion(*sort_order, expected_sort_order);
121120
}
122121

123122
TEST(JsonInternalTest, PartitionField) {

src/iceberg/test/metadata_serde_test.cc

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,17 @@ TEST(MetadataSerdeTest, DeserializeV2Valid) {
148148
std::vector<PartitionField>{PartitionField(/*source_id=*/1, /*field_id=*/1000, "x",
149149
Transform::Identity())});
150150

151-
auto expected_sort_order = std::make_shared<SortOrder>(
152-
/*order_id=*/3,
153-
std::vector<SortField>{SortField(/*source_id=*/2, Transform::Identity(),
154-
SortDirection::kAscending, NullOrder::kFirst),
155-
SortField(/*source_id=*/3, Transform::Bucket(4),
156-
SortDirection::kDescending, NullOrder::kLast)});
151+
ICEBERG_UNWRAP_OR_FAIL(
152+
auto sort_order,
153+
SortOrder::Make(*expected_schema_2,
154+
/*order_id=*/3,
155+
std::vector<SortField>{
156+
SortField(/*source_id=*/2, Transform::Identity(),
157+
SortDirection::kAscending, NullOrder::kFirst),
158+
SortField(/*source_id=*/3, Transform::Bucket(4),
159+
SortDirection::kDescending, NullOrder::kLast)}));
160+
161+
auto expected_sort_order = std::shared_ptr<SortOrder>(std::move(sort_order));
157162

158163
auto expected_snapshot_1 = std::make_shared<Snapshot>(Snapshot{
159164
.snapshot_id = 3051729675574597004,
@@ -228,13 +233,18 @@ TEST(MetadataSerdeTest, DeserializeV2ValidMinimal) {
228233
std::vector<PartitionField>{PartitionField(/*source_id=*/1, /*field_id=*/1000, "x",
229234
Transform::Identity())});
230235

231-
auto expected_sort_order = std::make_shared<SortOrder>(
232-
/*order_id=*/3, std::vector<SortField>{
236+
ICEBERG_UNWRAP_OR_FAIL(
237+
auto sort_order,
238+
SortOrder::Make(*expected_schema,
239+
/*order_id=*/3,
240+
std::vector<SortField>{
233241
SortField(/*source_id=*/2, Transform::Identity(),
234242
SortDirection::kAscending, NullOrder::kFirst),
235243
SortField(/*source_id=*/3, Transform::Bucket(4),
236244
SortDirection::kDescending, NullOrder::kLast),
237-
});
245+
}));
246+
247+
auto expected_sort_order = std::shared_ptr<SortOrder>(std::move(sort_order));
238248

239249
TableMetadata expected{
240250
.format_version = 2,

src/iceberg/test/sort_order_test.cc

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ TEST(SortOrderTest, Basics) {
7070
NullOrder::kFirst);
7171
SortField st_field2(7, identity_transform, SortDirection::kDescending,
7272
NullOrder::kFirst);
73-
SortOrder sort_order(100, {st_field1, st_field2});
74-
ASSERT_EQ(sort_order, sort_order);
75-
std::span<const SortField> fields = sort_order.fields();
73+
ICEBERG_UNWRAP_OR_FAIL(auto sort_order, SortOrder::Make(100, {st_field1, st_field2}));
74+
ASSERT_EQ(*sort_order, *sort_order);
75+
std::span<const SortField> fields = sort_order->fields();
7676
ASSERT_EQ(2, fields.size());
7777
ASSERT_EQ(st_field1, fields[0]);
7878
ASSERT_EQ(st_field2, fields[1]);
@@ -81,8 +81,8 @@ TEST(SortOrderTest, Basics) {
8181
" identity(5) asc nulls-first\n"
8282
" identity(7) desc nulls-first\n"
8383
"]";
84-
EXPECT_EQ(sort_order.ToString(), sort_order_str);
85-
EXPECT_EQ(std::format("{}", sort_order), sort_order_str);
84+
EXPECT_EQ(sort_order->ToString(), sort_order_str);
85+
EXPECT_EQ(std::format("{}", *sort_order), sort_order_str);
8686
}
8787
}
8888

@@ -96,21 +96,21 @@ TEST(SortOrderTest, Equality) {
9696
SortField st_field2(7, identity_transform, SortDirection::kDescending,
9797
NullOrder::kFirst);
9898
SortField st_field3(7, bucket_transform, SortDirection::kAscending, NullOrder::kFirst);
99-
SortOrder sort_order1(100, {st_field1, st_field2});
100-
SortOrder sort_order2(100, {st_field2, st_field3});
101-
SortOrder sort_order3(100, {st_field1, st_field3});
102-
SortOrder sort_order4(101, {st_field1, st_field2});
103-
SortOrder sort_order5(100, {st_field2, st_field1});
104-
105-
ASSERT_EQ(sort_order1, sort_order1);
106-
ASSERT_NE(sort_order1, sort_order2);
107-
ASSERT_NE(sort_order2, sort_order1);
108-
ASSERT_NE(sort_order1, sort_order3);
109-
ASSERT_NE(sort_order3, sort_order1);
110-
ASSERT_NE(sort_order1, sort_order4);
111-
ASSERT_NE(sort_order4, sort_order1);
112-
ASSERT_NE(sort_order1, sort_order5);
113-
ASSERT_NE(sort_order5, sort_order1);
99+
ICEBERG_UNWRAP_OR_FAIL(auto sort_order1, SortOrder::Make(100, {st_field1, st_field2}));
100+
ICEBERG_UNWRAP_OR_FAIL(auto sort_order2, SortOrder::Make(100, {st_field2, st_field3}));
101+
ICEBERG_UNWRAP_OR_FAIL(auto sort_order3, SortOrder::Make(100, {st_field1, st_field3}));
102+
ICEBERG_UNWRAP_OR_FAIL(auto sort_order4, SortOrder::Make(101, {st_field1, st_field2}));
103+
ICEBERG_UNWRAP_OR_FAIL(auto sort_order5, SortOrder::Make(100, {st_field2, st_field1}));
104+
105+
ASSERT_EQ(*sort_order1, *sort_order1);
106+
ASSERT_NE(*sort_order1, *sort_order2);
107+
ASSERT_NE(*sort_order2, *sort_order1);
108+
ASSERT_NE(*sort_order1, *sort_order3);
109+
ASSERT_NE(*sort_order3, *sort_order1);
110+
ASSERT_NE(*sort_order1, *sort_order4);
111+
ASSERT_NE(*sort_order4, *sort_order1);
112+
ASSERT_NE(*sort_order1, *sort_order5);
113+
ASSERT_NE(*sort_order5, *sort_order1);
114114
}
115115

116116
TEST(SortOrderTest, IsUnsorted) {
@@ -124,10 +124,10 @@ TEST(SortOrderTest, IsSorted) {
124124
auto identity_transform = Transform::Identity();
125125
SortField st_field1(5, identity_transform, SortDirection::kAscending,
126126
NullOrder::kFirst);
127-
SortOrder sorted_order(100, {st_field1});
127+
ICEBERG_UNWRAP_OR_FAIL(auto sorted_order, SortOrder::Make(100, {st_field1}));
128128

129-
EXPECT_TRUE(sorted_order.is_sorted());
130-
EXPECT_FALSE(sorted_order.is_unsorted());
129+
EXPECT_TRUE(sorted_order->is_sorted());
130+
EXPECT_FALSE(sorted_order->is_unsorted());
131131
}
132132

133133
TEST(SortOrderTest, Satisfies) {
@@ -142,39 +142,39 @@ TEST(SortOrderTest, Satisfies) {
142142
NullOrder::kFirst);
143143
SortField st_field3(7, bucket_transform, SortDirection::kAscending, NullOrder::kFirst);
144144

145-
SortOrder sort_order1(100, {st_field1, st_field2});
146-
SortOrder sort_order2(101, {st_field1});
147-
SortOrder sort_order3(102, {st_field1, st_field3});
148-
SortOrder sort_order4(104, {st_field2});
145+
ICEBERG_UNWRAP_OR_FAIL(auto sort_order1, SortOrder::Make(100, {st_field1, st_field2}));
146+
ICEBERG_UNWRAP_OR_FAIL(auto sort_order2, SortOrder::Make(101, {st_field1}));
147+
ICEBERG_UNWRAP_OR_FAIL(auto sort_order3, SortOrder::Make(102, {st_field1, st_field3}));
148+
ICEBERG_UNWRAP_OR_FAIL(auto sort_order4, SortOrder::Make(104, {st_field2}));
149149
auto unsorted = SortOrder::Unsorted();
150150

151151
// Any order satisfies an unsorted order, including unsorted itself
152152
EXPECT_TRUE(unsorted->Satisfies(*unsorted));
153-
EXPECT_TRUE(sort_order1.Satisfies(*unsorted));
154-
EXPECT_TRUE(sort_order2.Satisfies(*unsorted));
155-
EXPECT_TRUE(sort_order3.Satisfies(*unsorted));
153+
EXPECT_TRUE(sort_order1->Satisfies(*unsorted));
154+
EXPECT_TRUE(sort_order2->Satisfies(*unsorted));
155+
EXPECT_TRUE(sort_order3->Satisfies(*unsorted));
156156

157157
// Unsorted does not satisfy any sorted order
158-
EXPECT_FALSE(unsorted->Satisfies(sort_order1));
159-
EXPECT_FALSE(unsorted->Satisfies(sort_order2));
160-
EXPECT_FALSE(unsorted->Satisfies(sort_order3));
158+
EXPECT_FALSE(unsorted->Satisfies(*sort_order1));
159+
EXPECT_FALSE(unsorted->Satisfies(*sort_order2));
160+
EXPECT_FALSE(unsorted->Satisfies(*sort_order3));
161161

162162
// A sort order satisfies itself
163-
EXPECT_TRUE(sort_order1.Satisfies(sort_order1));
164-
EXPECT_TRUE(sort_order2.Satisfies(sort_order2));
165-
EXPECT_TRUE(sort_order3.Satisfies(sort_order3));
163+
EXPECT_TRUE(sort_order1->Satisfies(*sort_order1));
164+
EXPECT_TRUE(sort_order2->Satisfies(*sort_order2));
165+
EXPECT_TRUE(sort_order3->Satisfies(*sort_order3));
166166

167167
// A sort order with more fields satisfy one with fewer fields
168-
EXPECT_TRUE(sort_order1.Satisfies(sort_order2));
169-
EXPECT_TRUE(sort_order3.Satisfies(sort_order2));
168+
EXPECT_TRUE(sort_order1->Satisfies(*sort_order2));
169+
EXPECT_TRUE(sort_order3->Satisfies(*sort_order2));
170170

171171
// A sort order does not satisfy one with more fields
172-
EXPECT_FALSE(sort_order2.Satisfies(sort_order1));
173-
EXPECT_FALSE(sort_order2.Satisfies(sort_order3));
172+
EXPECT_FALSE(sort_order2->Satisfies(*sort_order1));
173+
EXPECT_FALSE(sort_order2->Satisfies(*sort_order3));
174174

175-
// A sort order does not satify one with different fields
176-
EXPECT_FALSE(sort_order4.Satisfies(sort_order2));
177-
EXPECT_FALSE(sort_order2.Satisfies(sort_order4));
175+
// A sort order does not satisfy one with different fields
176+
EXPECT_FALSE(sort_order4->Satisfies(*sort_order2));
177+
EXPECT_FALSE(sort_order2->Satisfies(*sort_order4));
178178
}
179179

180180
TEST_F(SortOrderMakeTest, MakeValidSortOrder) {

0 commit comments

Comments
 (0)