|
20 | 20 | #include "iceberg/table_requirements.h" |
21 | 21 |
|
22 | 22 | #include <memory> |
| 23 | +#include <ranges> |
23 | 24 | #include <string> |
24 | 25 | #include <vector> |
25 | 26 |
|
|
33 | 34 | #include "iceberg/table_requirement.h" |
34 | 35 | #include "iceberg/table_update.h" |
35 | 36 | #include "iceberg/test/matchers.h" |
| 37 | +#include "iceberg/type.h" |
36 | 38 |
|
37 | 39 | namespace iceberg { |
38 | 40 |
|
@@ -60,21 +62,17 @@ std::unique_ptr<TableMetadata> CreateBaseMetadata( |
60 | 62 | // Helper function to create a simple schema for tests |
61 | 63 | std::shared_ptr<Schema> CreateTestSchema(int32_t schema_id = 0) { |
62 | 64 | std::vector<SchemaField> fields; |
63 | | - fields.emplace_back(SchemaField::MakeRequired(1, "id", std::make_shared<IntType>())); |
| 65 | + fields.emplace_back(SchemaField::MakeRequired(1, "id", int32())); |
64 | 66 | return std::make_shared<Schema>(std::move(fields), schema_id); |
65 | 67 | } |
66 | 68 |
|
67 | 69 | // Helper function to count requirements of a specific type |
68 | 70 | template <typename T> |
69 | 71 | int CountRequirementsOfType( |
70 | 72 | const std::vector<std::unique_ptr<TableRequirement>>& requirements) { |
71 | | - int count = 0; |
72 | | - for (const auto& req : requirements) { |
73 | | - if (dynamic_cast<T*>(req.get()) != nullptr) { |
74 | | - count++; |
75 | | - } |
76 | | - } |
77 | | - return count; |
| 73 | + return std::ranges::count_if(requirements, [](const auto& req) { |
| 74 | + return dynamic_cast<T*>(req.get()) != nullptr; |
| 75 | + }); |
78 | 76 | } |
79 | 77 |
|
80 | 78 | // Helper function to add a branch to metadata |
@@ -815,47 +813,98 @@ TEST(TableRequirementsTest, SetDefaultSortOrderFailure) { |
815 | 813 |
|
816 | 814 | TEST(TableRequirementsTest, AddSnapshot) { |
817 | 815 | auto metadata = CreateBaseMetadata(); |
818 | | - std::vector<std::unique_ptr<TableUpdate>> updates; |
819 | 816 |
|
| 817 | + std::vector<std::unique_ptr<TableUpdate>> updates; |
820 | 818 | auto snapshot = std::make_shared<Snapshot>(); |
821 | 819 | snapshot->snapshot_id = 1; |
822 | 820 | snapshot->sequence_number = 1; |
823 | 821 | snapshot->timestamp_ms = TimePointMs{std::chrono::milliseconds(1000)}; |
824 | 822 | snapshot->manifest_list = "s3://bucket/manifest_list"; |
825 | | - |
826 | 823 | updates.push_back(std::make_unique<table::AddSnapshot>(snapshot)); |
827 | 824 |
|
828 | 825 | auto result = TableRequirements::ForUpdateTable(*metadata, updates); |
829 | 826 | ASSERT_THAT(result, IsOk()); |
830 | 827 |
|
831 | 828 | auto& requirements = result.value(); |
832 | | - // AddSnapshot doesn't add additional requirements |
833 | 829 | ASSERT_EQ(requirements.size(), 1); |
834 | 830 | EXPECT_EQ(CountRequirementsOfType<table::AssertUUID>(requirements), 1); |
835 | 831 |
|
836 | | - // Validate against base metadata |
837 | 832 | for (const auto& req : requirements) { |
838 | 833 | EXPECT_THAT(req->Validate(metadata.get()), IsOk()); |
839 | 834 | } |
840 | 835 | } |
841 | 836 |
|
| 837 | +// RemoveSnapshots Tests |
| 838 | + |
| 839 | +TEST(TableRequirementsTest, RemoveSnapshots) { |
| 840 | + auto metadata = CreateBaseMetadata(); |
| 841 | + |
| 842 | + std::vector<std::unique_ptr<TableUpdate>> updates; |
| 843 | + updates.push_back(std::make_unique<table::RemoveSnapshots>(std::vector<int64_t>{0})); |
| 844 | + |
| 845 | + auto result = TableRequirements::ForUpdateTable(*metadata, updates); |
| 846 | + ASSERT_THAT(result, IsOk()); |
| 847 | + |
| 848 | + auto& requirements = result.value(); |
| 849 | + ASSERT_EQ(requirements.size(), 1); |
| 850 | + EXPECT_EQ(CountRequirementsOfType<table::AssertUUID>(requirements), 1); |
| 851 | + |
| 852 | + for (const auto& req : requirements) { |
| 853 | + EXPECT_THAT(req->Validate(metadata.get()), IsOk()); |
| 854 | + } |
| 855 | +} |
| 856 | + |
| 857 | +// SetSnapshotRef Tests |
| 858 | + |
| 859 | +TEST(TableRequirementsTest, SetSnapshotRef) { |
| 860 | + constexpr int64_t kSnapshotId = 14; |
| 861 | + const std::string kRefName = "branch"; |
| 862 | + |
| 863 | + auto metadata = CreateBaseMetadata(); |
| 864 | + AddBranch(*metadata, kRefName, kSnapshotId); |
| 865 | + |
| 866 | + // Multiple updates to same ref should deduplicate |
| 867 | + std::vector<std::unique_ptr<TableUpdate>> updates; |
| 868 | + updates.push_back(std::make_unique<table::SetSnapshotRef>(kRefName, kSnapshotId, |
| 869 | + SnapshotRefType::kBranch)); |
| 870 | + updates.push_back(std::make_unique<table::SetSnapshotRef>(kRefName, kSnapshotId + 1, |
| 871 | + SnapshotRefType::kBranch)); |
| 872 | + updates.push_back(std::make_unique<table::SetSnapshotRef>(kRefName, kSnapshotId + 2, |
| 873 | + SnapshotRefType::kBranch)); |
| 874 | + |
| 875 | + auto result = TableRequirements::ForUpdateTable(*metadata, updates); |
| 876 | + ASSERT_THAT(result, IsOk()); |
| 877 | + |
| 878 | + auto& requirements = result.value(); |
| 879 | + for (const auto& req : requirements) { |
| 880 | + EXPECT_THAT(req->Validate(metadata.get()), IsOk()); |
| 881 | + } |
| 882 | + |
| 883 | + ASSERT_EQ(requirements.size(), 2); |
| 884 | + EXPECT_EQ(CountRequirementsOfType<table::AssertUUID>(requirements), 1); |
| 885 | + EXPECT_EQ(CountRequirementsOfType<table::AssertRefSnapshotID>(requirements), 1); |
| 886 | + |
| 887 | + auto* assert_ref = dynamic_cast<table::AssertRefSnapshotID*>(requirements[1].get()); |
| 888 | + ASSERT_NE(assert_ref, nullptr); |
| 889 | + EXPECT_EQ(assert_ref->snapshot_id(), kSnapshotId); |
| 890 | + EXPECT_EQ(assert_ref->ref_name(), kRefName); |
| 891 | +} |
| 892 | + |
842 | 893 | // RemoveSnapshotRef Tests |
843 | 894 |
|
844 | 895 | TEST(TableRequirementsTest, RemoveSnapshotRef) { |
845 | 896 | auto metadata = CreateBaseMetadata(); |
846 | | - std::vector<std::unique_ptr<TableUpdate>> updates; |
847 | 897 |
|
| 898 | + std::vector<std::unique_ptr<TableUpdate>> updates; |
848 | 899 | updates.push_back(std::make_unique<table::RemoveSnapshotRef>("branch")); |
849 | 900 |
|
850 | 901 | auto result = TableRequirements::ForUpdateTable(*metadata, updates); |
851 | 902 | ASSERT_THAT(result, IsOk()); |
852 | 903 |
|
853 | 904 | auto& requirements = result.value(); |
854 | | - // RemoveSnapshotRef doesn't add additional requirements |
855 | 905 | ASSERT_EQ(requirements.size(), 1); |
856 | 906 | EXPECT_EQ(CountRequirementsOfType<table::AssertUUID>(requirements), 1); |
857 | 907 |
|
858 | | - // Validate against base metadata |
859 | 908 | for (const auto& req : requirements) { |
860 | 909 | EXPECT_THAT(req->Validate(metadata.get()), IsOk()); |
861 | 910 | } |
|
0 commit comments