3232
3333namespace iceberg {
3434
35- class SortOrderMakeTest : public ::testing::Test {
35+ class SortOrderTest : public ::testing::Test {
3636 protected:
3737 void SetUp () override {
3838 field1_ = std::make_unique<SchemaField>(1 , " x" , int32 (), true );
3939 field2_ = std::make_unique<SchemaField>(2 , " y" , string (), true );
40- field3_ = std::make_unique<SchemaField>(3 , " time" , timestamp (), true );
40+ field3_ = std::make_unique<SchemaField>(5 , " ts" , iceberg::timestamp (), true );
41+ field4_ = std::make_unique<SchemaField>(7 , " bar" , iceberg::string (), true );
4142
4243 schema_ = std::make_unique<Schema>(
43- std::vector<SchemaField>{*field1_, *field2_, *field3_}, 1 );
44+ std::vector<SchemaField>{*field1_, *field2_, *field3_, *field4_ }, 1 );
4445
4546 sort_field1_ = std::make_unique<SortField>(
4647 1 , Transform::Identity (), SortDirection::kAscending , NullOrder::kFirst );
4748 sort_field2_ = std::make_unique<SortField>(
4849 2 , Transform::Bucket (10 ), SortDirection::kDescending , NullOrder::kLast );
4950 sort_field3_ = std::make_unique<SortField>(
50- 3 , Transform::Day (), SortDirection::kAscending , NullOrder::kFirst );
51+ 5 , Transform::Day (), SortDirection::kAscending , NullOrder::kFirst );
5152 }
5253
5354 std::unique_ptr<Schema> schema_;
5455 std::unique_ptr<SchemaField> field1_;
5556 std::unique_ptr<SchemaField> field2_;
5657 std::unique_ptr<SchemaField> field3_;
58+ std::unique_ptr<SchemaField> field4_;
5759
5860 std::unique_ptr<SortField> sort_field1_;
5961 std::unique_ptr<SortField> sort_field2_;
6062 std::unique_ptr<SortField> sort_field3_;
6163};
6264
63- TEST (SortOrderTest, Basics) {
64- {
65- SchemaField field1 (5 , " ts" , iceberg::timestamp (), true );
66- SchemaField field2 (7 , " bar" , iceberg::string (), true );
67-
68- auto identity_transform = Transform::Identity ();
69- SortField st_field1 (5 , identity_transform, SortDirection::kAscending ,
70- NullOrder::kFirst );
71- SortField st_field2 (7 , identity_transform, SortDirection::kDescending ,
72- NullOrder::kFirst );
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 ();
76- ASSERT_EQ (2 , fields.size ());
77- ASSERT_EQ (st_field1, fields[0 ]);
78- ASSERT_EQ (st_field2, fields[1 ]);
79- auto sort_order_str =
80- " [\n "
81- " identity(5) asc nulls-first\n "
82- " identity(7) desc nulls-first\n "
83- " ]" ;
84- EXPECT_EQ (sort_order->ToString (), sort_order_str);
85- EXPECT_EQ (std::format (" {}" , *sort_order), sort_order_str);
86- }
65+ TEST_F (SortOrderTest, Basics) {
66+ auto identity_transform = Transform::Identity ();
67+ SortField st_field1 (5 , identity_transform, SortDirection::kAscending ,
68+ NullOrder::kFirst );
69+ SortField st_field2 (7 , identity_transform, SortDirection::kDescending ,
70+ NullOrder::kFirst );
71+ ICEBERG_UNWRAP_OR_FAIL (auto sort_order,
72+ SortOrder::Make (*schema_, 100 , {st_field1, st_field2}));
73+ ASSERT_EQ (*sort_order, *sort_order);
74+ std::span<const SortField> fields = sort_order->fields ();
75+ ASSERT_EQ (2 , fields.size ());
76+ ASSERT_EQ (st_field1, fields[0 ]);
77+ ASSERT_EQ (st_field2, fields[1 ]);
78+ auto sort_order_str =
79+ " [\n "
80+ " identity(5) asc nulls-first\n "
81+ " identity(7) desc nulls-first\n "
82+ " ]" ;
83+ EXPECT_EQ (sort_order->ToString (), sort_order_str);
84+ EXPECT_EQ (std::format (" {}" , *sort_order), sort_order_str);
8785}
8886
89- TEST (SortOrderTest, Equality) {
90- SchemaField field1 (5 , " ts" , iceberg::timestamp (), true );
91- SchemaField field2 (7 , " bar" , iceberg::string (), true );
87+ TEST_F (SortOrderTest, Equality) {
9288 auto bucket_transform = Transform::Bucket (8 );
9389 auto identity_transform = Transform::Identity ();
9490 SortField st_field1 (5 , identity_transform, SortDirection::kAscending ,
9591 NullOrder::kFirst );
9692 SortField st_field2 (7 , identity_transform, SortDirection::kDescending ,
9793 NullOrder::kFirst );
9894 SortField st_field3 (7 , bucket_transform, SortDirection::kAscending , NullOrder::kFirst );
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}));
95+ ICEBERG_UNWRAP_OR_FAIL (auto sort_order1,
96+ SortOrder::Make (*schema_, 100 , {st_field1, st_field2}));
97+ ICEBERG_UNWRAP_OR_FAIL (auto sort_order2,
98+ SortOrder::Make (*schema_, 100 , {st_field2, st_field3}));
99+ ICEBERG_UNWRAP_OR_FAIL (auto sort_order3,
100+ SortOrder::Make (*schema_, 100 , {st_field1, st_field3}));
101+ ICEBERG_UNWRAP_OR_FAIL (auto sort_order4,
102+ SortOrder::Make (*schema_, 101 , {st_field1, st_field2}));
103+ ICEBERG_UNWRAP_OR_FAIL (auto sort_order5,
104+ SortOrder::Make (*schema_, 100 , {st_field2, st_field1}));
104105
105106 ASSERT_EQ (*sort_order1, *sort_order1);
106107 ASSERT_NE (*sort_order1, *sort_order2);
@@ -113,26 +114,23 @@ TEST(SortOrderTest, Equality) {
113114 ASSERT_NE (*sort_order5, *sort_order1);
114115}
115116
116- TEST (SortOrderTest, IsUnsorted) {
117+ TEST_F (SortOrderTest, IsUnsorted) {
117118 auto unsorted = SortOrder::Unsorted ();
118119 EXPECT_TRUE (unsorted->is_unsorted ());
119120 EXPECT_FALSE (unsorted->is_sorted ());
120121}
121122
122- TEST (SortOrderTest, IsSorted) {
123- SchemaField field1 (5 , " ts" , iceberg::timestamp (), true );
123+ TEST_F (SortOrderTest, IsSorted) {
124124 auto identity_transform = Transform::Identity ();
125125 SortField st_field1 (5 , identity_transform, SortDirection::kAscending ,
126126 NullOrder::kFirst );
127- ICEBERG_UNWRAP_OR_FAIL (auto sorted_order, SortOrder::Make (100 , {st_field1}));
127+ ICEBERG_UNWRAP_OR_FAIL (auto sorted_order, SortOrder::Make (*schema_, 100 , {st_field1}));
128128
129129 EXPECT_TRUE (sorted_order->is_sorted ());
130130 EXPECT_FALSE (sorted_order->is_unsorted ());
131131}
132132
133- TEST (SortOrderTest, Satisfies) {
134- SchemaField field1 (5 , " ts" , iceberg::timestamp (), true );
135- SchemaField field2 (7 , " bar" , iceberg::string (), true );
133+ TEST_F (SortOrderTest, Satisfies) {
136134 auto identity_transform = Transform::Identity ();
137135 auto bucket_transform = Transform::Bucket (8 );
138136
@@ -142,10 +140,12 @@ TEST(SortOrderTest, Satisfies) {
142140 NullOrder::kFirst );
143141 SortField st_field3 (7 , bucket_transform, SortDirection::kAscending , NullOrder::kFirst );
144142
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}));
143+ ICEBERG_UNWRAP_OR_FAIL (auto sort_order1,
144+ SortOrder::Make (*schema_, 100 , {st_field1, st_field2}));
145+ ICEBERG_UNWRAP_OR_FAIL (auto sort_order2, SortOrder::Make (*schema_, 101 , {st_field1}));
146+ ICEBERG_UNWRAP_OR_FAIL (auto sort_order3,
147+ SortOrder::Make (*schema_, 102 , {st_field1, st_field3}));
148+ ICEBERG_UNWRAP_OR_FAIL (auto sort_order4, SortOrder::Make (*schema_, 104 , {st_field2}));
149149 auto unsorted = SortOrder::Unsorted ();
150150
151151 // Any order satisfies an unsorted order, including unsorted itself
@@ -177,7 +177,7 @@ TEST(SortOrderTest, Satisfies) {
177177 EXPECT_FALSE (sort_order2->Satisfies (*sort_order4));
178178}
179179
180- TEST_F (SortOrderMakeTest , MakeValidSortOrder) {
180+ TEST_F (SortOrderTest , MakeValidSortOrder) {
181181 ICEBERG_UNWRAP_OR_FAIL (
182182 auto sort_order,
183183 SortOrder::Make (*schema_, 1 , std::vector<SortField>{*sort_field1_, *sort_field2_}));
@@ -189,14 +189,14 @@ TEST_F(SortOrderMakeTest, MakeValidSortOrder) {
189189 EXPECT_EQ (sort_order->fields ()[1 ], *sort_field2_);
190190}
191191
192- TEST_F (SortOrderMakeTest , MakeInvalidSortOrderEmptyFields) {
192+ TEST_F (SortOrderTest , MakeInvalidSortOrderEmptyFields) {
193193 auto sort_order = SortOrder::Make (*schema_, 1 , std::vector<SortField>{});
194194 EXPECT_THAT (sort_order, IsError (ErrorKind::kInvalidArgument ));
195195 EXPECT_THAT (sort_order,
196196 HasErrorMessage (" Sort order must have at least one sort field" ));
197197}
198198
199- TEST_F (SortOrderMakeTest , MakeInvalidSortOrderUnsortedId) {
199+ TEST_F (SortOrderTest , MakeInvalidSortOrderUnsortedId) {
200200 auto sort_order = SortOrder::Make (*schema_, SortOrder::kUnsortedOrderId ,
201201 std::vector<SortField>{*sort_field1_});
202202 EXPECT_THAT (sort_order, IsError (ErrorKind::kInvalidArgument ));
@@ -205,7 +205,7 @@ TEST_F(SortOrderMakeTest, MakeInvalidSortOrderUnsortedId) {
205205 SortOrder::kUnsortedOrderId )));
206206}
207207
208- TEST_F (SortOrderMakeTest , MakeValidUnsortedSortOrder) {
208+ TEST_F (SortOrderTest , MakeValidUnsortedSortOrder) {
209209 ICEBERG_UNWRAP_OR_FAIL (auto sort_order, SortOrder::Make (SortOrder::kUnsortedOrderId ,
210210 std::vector<SortField>{}));
211211 ASSERT_NE (sort_order, nullptr );
@@ -214,7 +214,18 @@ TEST_F(SortOrderMakeTest, MakeValidUnsortedSortOrder) {
214214 EXPECT_EQ (sort_order->fields ().size (), 0 );
215215}
216216
217- TEST_F (SortOrderMakeTest, MakeInvalidSortOrderNonPrimitiveField) {
217+ TEST_F (SortOrderTest, MakeInvalidSortOrderTransformCannotApply) {
218+ // Day transform cannot be applied to string type
219+ SortField sort_field_invalid (2 , Transform::Day (), SortDirection::kAscending ,
220+ NullOrder::kFirst );
221+
222+ auto sort_order = SortOrder::Make (
223+ *schema_, 1 , std::vector<SortField>{*sort_field1_, sort_field_invalid});
224+ EXPECT_THAT (sort_order, IsError (ErrorKind::kInvalidArgument ));
225+ EXPECT_THAT (sort_order, HasErrorMessage (" Invalid source type" ));
226+ }
227+
228+ TEST_F (SortOrderTest, MakeInvalidSortOrderNonPrimitiveField) {
218229 auto struct_field = std::make_unique<SchemaField>(
219230 4 , " struct_field" ,
220231 std::make_shared<StructType>(std::vector<SchemaField>{
@@ -234,7 +245,7 @@ TEST_F(SortOrderMakeTest, MakeInvalidSortOrderNonPrimitiveField) {
234245 EXPECT_THAT (sort_order, HasErrorMessage (" Invalid source type" ));
235246}
236247
237- TEST_F (SortOrderMakeTest , MakeInvalidSortOrderFieldNotInSchema) {
248+ TEST_F (SortOrderTest , MakeInvalidSortOrderFieldNotInSchema) {
238249 SortField sort_field_invalid (999 , Transform::Identity (), SortDirection::kAscending ,
239250 NullOrder::kFirst );
240251
@@ -244,7 +255,7 @@ TEST_F(SortOrderMakeTest, MakeInvalidSortOrderFieldNotInSchema) {
244255 EXPECT_THAT (sort_order, HasErrorMessage (" Cannot find source column for sort field" ));
245256}
246257
247- TEST_F (SortOrderMakeTest , MakeUnboundSortOrder) {
258+ TEST_F (SortOrderTest , MakeUnboundSortOrder) {
248259 SortField sort_field_invalid (999 , Transform::Identity (), SortDirection::kAscending ,
249260 NullOrder::kFirst );
250261
0 commit comments