|
36 | 36 |
|
37 | 37 | namespace iceberg { |
38 | 38 |
|
39 | | -class UpdateSortOrderTest : public UpdateTestBase {}; |
| 39 | +class UpdateSortOrderTest : public UpdateTestBase { |
| 40 | + protected: |
| 41 | + // Helper function to apply update and verify the resulting sort order |
| 42 | + void ApplyAndExpectSortOrder(UpdateSortOrder* update, |
| 43 | + std::vector<SortField> expected_fields) { |
| 44 | + ICEBERG_UNWRAP_OR_FAIL(auto result, update->Apply()); |
| 45 | + ICEBERG_UNWRAP_OR_FAIL( |
| 46 | + auto expected_sort_order, |
| 47 | + SortOrder::Make(result.sort_order->order_id(), std::move(expected_fields))); |
| 48 | + EXPECT_EQ(*result.sort_order, *expected_sort_order); |
| 49 | + } |
| 50 | +}; |
| 51 | + |
| 52 | +TEST_F(UpdateSortOrderTest, EmptySortOrder) { |
| 53 | + ICEBERG_UNWRAP_OR_FAIL(auto update, table_->NewUpdateSortOrder()); |
| 54 | + ICEBERG_UNWRAP_OR_FAIL(auto result, update->Apply()); |
| 55 | + // Should succeed with an unsorted order |
| 56 | + EXPECT_TRUE(result.sort_order->fields().empty()); |
| 57 | +} |
40 | 58 |
|
41 | 59 | TEST_F(UpdateSortOrderTest, AddSingleSortFieldAscending) { |
42 | 60 | ICEBERG_UNWRAP_OR_FAIL(auto update, table_->NewUpdateSortOrder()); |
43 | 61 | auto term = Expressions::Transform("x", Transform::Identity()); |
44 | | - |
45 | 62 | update->AddSortField(term, SortDirection::kAscending, NullOrder::kFirst); |
46 | 63 |
|
47 | | - ICEBERG_UNWRAP_OR_FAIL(auto result, update->Apply()); |
48 | | - EXPECT_FALSE(result.sort_order->is_unsorted()); |
49 | | - |
50 | 64 | std::vector<SortField> expected_fields; |
51 | 65 | expected_fields.emplace_back(1, Transform::Identity(), SortDirection::kAscending, |
52 | 66 | NullOrder::kFirst); |
53 | | - ICEBERG_UNWRAP_OR_FAIL( |
54 | | - auto expected_sort_order, |
55 | | - SortOrder::Make(result.sort_order->order_id(), std::move(expected_fields))); |
56 | | - EXPECT_EQ(*result.sort_order, *expected_sort_order); |
| 67 | + ApplyAndExpectSortOrder(update.get(), std::move(expected_fields)); |
57 | 68 | } |
58 | 69 |
|
59 | 70 | TEST_F(UpdateSortOrderTest, AddSingleSortFieldDescending) { |
60 | 71 | ICEBERG_UNWRAP_OR_FAIL(auto update, table_->NewUpdateSortOrder()); |
61 | 72 | auto term = Expressions::Transform("y", Transform::Identity()); |
62 | | - |
63 | 73 | update->AddSortField(term, SortDirection::kDescending, NullOrder::kLast); |
64 | 74 |
|
65 | | - ICEBERG_UNWRAP_OR_FAIL(auto result, update->Apply()); |
66 | | - |
67 | 75 | std::vector<SortField> expected_fields; |
68 | 76 | expected_fields.emplace_back(2, Transform::Identity(), SortDirection::kDescending, |
69 | 77 | NullOrder::kLast); |
70 | | - ICEBERG_UNWRAP_OR_FAIL( |
71 | | - auto expected_sort_order, |
72 | | - SortOrder::Make(result.sort_order->order_id(), std::move(expected_fields))); |
73 | | - EXPECT_EQ(*result.sort_order, *expected_sort_order); |
| 78 | + ApplyAndExpectSortOrder(update.get(), std::move(expected_fields)); |
74 | 79 | } |
75 | 80 |
|
76 | 81 | TEST_F(UpdateSortOrderTest, AddMultipleSortFields) { |
77 | 82 | ICEBERG_UNWRAP_OR_FAIL(auto update, table_->NewUpdateSortOrder()); |
78 | 83 | auto term1 = Expressions::Transform("y", Transform::Identity()); |
79 | 84 | auto term2 = Expressions::Transform("x", Transform::Identity()); |
80 | | - |
81 | 85 | update->AddSortField(term1, SortDirection::kAscending, NullOrder::kFirst) |
82 | 86 | .AddSortField(term2, SortDirection::kDescending, NullOrder::kLast); |
83 | 87 |
|
84 | | - ICEBERG_UNWRAP_OR_FAIL(auto result, update->Apply()); |
85 | | - |
86 | 88 | std::vector<SortField> expected_fields; |
87 | 89 | expected_fields.emplace_back(2, Transform::Identity(), SortDirection::kAscending, |
88 | 90 | NullOrder::kFirst); |
89 | 91 | expected_fields.emplace_back(1, Transform::Identity(), SortDirection::kDescending, |
90 | 92 | NullOrder::kLast); |
91 | | - ICEBERG_UNWRAP_OR_FAIL( |
92 | | - auto expected_sort_order, |
93 | | - SortOrder::Make(result.sort_order->order_id(), std::move(expected_fields))); |
94 | | - EXPECT_EQ(*result.sort_order, *expected_sort_order); |
| 93 | + ApplyAndExpectSortOrder(update.get(), std::move(expected_fields)); |
95 | 94 | } |
96 | 95 |
|
97 | 96 | TEST_F(UpdateSortOrderTest, AddSortFieldWithNamedReference) { |
98 | 97 | // Test that we can directly use NamedReference (kReference) which is treated as |
99 | 98 | // identity |
100 | 99 | ICEBERG_UNWRAP_OR_FAIL(auto update, table_->NewUpdateSortOrder()); |
101 | 100 | auto ref = Expressions::Ref("x"); |
102 | | - |
103 | 101 | update->AddSortField(ref, SortDirection::kAscending, NullOrder::kFirst); |
104 | 102 |
|
105 | | - ICEBERG_UNWRAP_OR_FAIL(auto result, update->Apply()); |
106 | | - |
107 | 103 | std::vector<SortField> expected_fields; |
108 | 104 | expected_fields.emplace_back(1, Transform::Identity(), SortDirection::kAscending, |
109 | 105 | NullOrder::kFirst); |
110 | | - ICEBERG_UNWRAP_OR_FAIL( |
111 | | - auto expected_sort_order, |
112 | | - SortOrder::Make(result.sort_order->order_id(), std::move(expected_fields))); |
113 | | - EXPECT_EQ(*result.sort_order, *expected_sort_order); |
| 106 | + ApplyAndExpectSortOrder(update.get(), std::move(expected_fields)); |
114 | 107 | } |
115 | 108 |
|
116 | 109 | TEST_F(UpdateSortOrderTest, AddSortFieldByName) { |
117 | 110 | // Test the convenience method for adding sort field by name |
118 | 111 | ICEBERG_UNWRAP_OR_FAIL(auto update, table_->NewUpdateSortOrder()); |
119 | | - |
120 | 112 | update->AddSortFieldByName("x", SortDirection::kAscending, NullOrder::kFirst); |
121 | 113 |
|
122 | | - ICEBERG_UNWRAP_OR_FAIL(auto result, update->Apply()); |
123 | | - |
124 | 114 | std::vector<SortField> expected_fields; |
125 | 115 | expected_fields.emplace_back(1, Transform::Identity(), SortDirection::kAscending, |
126 | 116 | NullOrder::kFirst); |
127 | | - ICEBERG_UNWRAP_OR_FAIL( |
128 | | - auto expected_sort_order, |
129 | | - SortOrder::Make(result.sort_order->order_id(), std::move(expected_fields))); |
130 | | - EXPECT_EQ(*result.sort_order, *expected_sort_order); |
| 117 | + ApplyAndExpectSortOrder(update.get(), std::move(expected_fields)); |
131 | 118 | } |
132 | 119 |
|
133 | 120 | TEST_F(UpdateSortOrderTest, AddSortFieldWithTruncateTransform) { |
134 | 121 | ICEBERG_UNWRAP_OR_FAIL(auto update, table_->NewUpdateSortOrder()); |
135 | 122 | auto term = Expressions::Truncate("x", 10); |
136 | | - |
137 | 123 | update->AddSortField(term, SortDirection::kAscending, NullOrder::kFirst); |
138 | 124 |
|
139 | | - ICEBERG_UNWRAP_OR_FAIL(auto result, update->Apply()); |
140 | | - |
141 | 125 | std::vector<SortField> expected_fields; |
142 | 126 | expected_fields.emplace_back(1, Transform::Truncate(10), SortDirection::kAscending, |
143 | 127 | NullOrder::kFirst); |
144 | | - ICEBERG_UNWRAP_OR_FAIL( |
145 | | - auto expected_sort_order, |
146 | | - SortOrder::Make(result.sort_order->order_id(), std::move(expected_fields))); |
147 | | - EXPECT_EQ(*result.sort_order, *expected_sort_order); |
| 128 | + ApplyAndExpectSortOrder(update.get(), std::move(expected_fields)); |
148 | 129 | } |
149 | 130 |
|
150 | 131 | TEST_F(UpdateSortOrderTest, AddSortFieldWithBucketTransform) { |
151 | 132 | ICEBERG_UNWRAP_OR_FAIL(auto update, table_->NewUpdateSortOrder()); |
152 | 133 | auto term = Expressions::Bucket("y", 10); |
153 | | - |
154 | 134 | update->AddSortField(term, SortDirection::kDescending, NullOrder::kLast); |
155 | 135 |
|
156 | | - ICEBERG_UNWRAP_OR_FAIL(auto result, update->Apply()); |
157 | | - |
158 | 136 | std::vector<SortField> expected_fields; |
159 | 137 | expected_fields.emplace_back(2, Transform::Bucket(10), SortDirection::kDescending, |
160 | 138 | NullOrder::kLast); |
161 | | - ICEBERG_UNWRAP_OR_FAIL( |
162 | | - auto expected_sort_order, |
163 | | - SortOrder::Make(result.sort_order->order_id(), std::move(expected_fields))); |
164 | | - EXPECT_EQ(*result.sort_order, *expected_sort_order); |
| 139 | + ApplyAndExpectSortOrder(update.get(), std::move(expected_fields)); |
165 | 140 | } |
166 | 141 |
|
167 | 142 | TEST_F(UpdateSortOrderTest, AddSortFieldNullTerm) { |
@@ -219,19 +194,14 @@ TEST_F(UpdateSortOrderTest, CaseSensitiveFalse) { |
219 | 194 | ICEBERG_UNWRAP_OR_FAIL(auto update, table_->NewUpdateSortOrder()); |
220 | 195 | auto ref = NamedReference::Make("X").value(); // Uppercase |
221 | 196 | auto term = UnboundTransform::Make(std::move(ref), Transform::Identity()).value(); |
222 | | - |
223 | 197 | update->CaseSensitive(false).AddSortField(std::move(term), SortDirection::kAscending, |
224 | 198 | NullOrder::kFirst); |
225 | 199 |
|
226 | | - ICEBERG_UNWRAP_OR_FAIL(auto result, update->Apply()); |
227 | 200 | // Should succeed because case-insensitive matching |
228 | 201 | std::vector<SortField> expected_fields; |
229 | 202 | expected_fields.emplace_back(1, Transform::Identity(), SortDirection::kAscending, |
230 | 203 | NullOrder::kFirst); |
231 | | - ICEBERG_UNWRAP_OR_FAIL( |
232 | | - auto expected_sort_order, |
233 | | - SortOrder::Make(result.sort_order->order_id(), std::move(expected_fields))); |
234 | | - EXPECT_EQ(*result.sort_order, *expected_sort_order); |
| 204 | + ApplyAndExpectSortOrder(update.get(), std::move(expected_fields)); |
235 | 205 | } |
236 | 206 |
|
237 | 207 | TEST_F(UpdateSortOrderTest, CommitSuccess) { |
@@ -263,11 +233,4 @@ TEST_F(UpdateSortOrderTest, CommitSuccess) { |
263 | 233 | EXPECT_EQ(*sort_order, *expected_sort_order); |
264 | 234 | } |
265 | 235 |
|
266 | | -TEST_F(UpdateSortOrderTest, EmptySortOrder) { |
267 | | - ICEBERG_UNWRAP_OR_FAIL(auto update, table_->NewUpdateSortOrder()); |
268 | | - ICEBERG_UNWRAP_OR_FAIL(auto result, update->Apply()); |
269 | | - // Should succeed with an unsorted order |
270 | | - EXPECT_TRUE(result.sort_order->fields().empty()); |
271 | | -} |
272 | | - |
273 | 236 | } // namespace iceberg |
0 commit comments