| /* | |
| * Licensed to the Apache Software Foundation (ASF) under one | |
| * or more contributor license agreements. See the NOTICE file | |
| * distributed with this work for additional information | |
| * regarding copyright ownership. The ASF licenses this file | |
| * to you under the Apache License, Version 2.0 (the | |
| * "License"); you may not use this file except in compliance | |
| * with the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, | |
| * software distributed under the License is distributed on an | |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| * KIND, either express or implied. See the License for the | |
| * specific language governing permissions and limitations | |
| * under the License. | |
| */ | |
| #include <string> | |
| #include <vector> | |
| #include <gtest/gtest.h> | |
| #include "iceberg/expression/literal.h" | |
| #include "iceberg/row/partition_values.h" | |
| #include "iceberg/util/partition_value_util.h" | |
| namespace iceberg { | |
| // PartitionValues Tests | |
| TEST(PartitionValuesTest, DefaultConstruction) { | |
| PartitionValues partition; | |
| EXPECT_EQ(partition.num_fields(), 0); | |
| } | |
| TEST(PartitionValuesTest, ConstructionFromVector) { | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition(std::move(values)); | |
| EXPECT_EQ(partition.num_fields(), 2); | |
| } | |
| TEST(PartitionValuesTest, ConstructionFromSingleLiteral) { | |
| PartitionValues partition(Literal::Int(42)); | |
| EXPECT_EQ(partition.num_fields(), 1); | |
| } | |
| TEST(PartitionValuesTest, CopyConstructor) { | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition1(std::move(values)); | |
| PartitionValues partition2(partition1); | |
| EXPECT_EQ(partition2.num_fields(), 2); | |
| EXPECT_EQ(partition1, partition2); | |
| } | |
| TEST(PartitionValuesTest, MoveConstructor) { | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition1(std::move(values)); | |
| PartitionValues partition2(std::move(partition1)); | |
| EXPECT_EQ(partition2.num_fields(), 2); | |
| } | |
| TEST(PartitionValuesTest, CopyAssignment) { | |
| std::vector<Literal> values1 = {Literal::Int(1)}; | |
| std::vector<Literal> values2 = {Literal::Int(2), Literal::String("test")}; | |
| PartitionValues partition1(std::move(values1)); | |
| PartitionValues partition2(std::move(values2)); | |
| partition1 = partition2; | |
| EXPECT_EQ(partition1.num_fields(), 2); | |
| EXPECT_EQ(partition1, partition2); | |
| } | |
| TEST(PartitionValuesTest, MoveAssignment) { | |
| std::vector<Literal> values1 = {Literal::Int(1)}; | |
| std::vector<Literal> values2 = {Literal::Int(2), Literal::String("test")}; | |
| PartitionValues partition1(std::move(values1)); | |
| PartitionValues partition2(std::move(values2)); | |
| partition1 = std::move(partition2); | |
| EXPECT_EQ(partition1.num_fields(), 2); | |
| } | |
| TEST(PartitionValuesTest, GetFieldInt) { | |
| std::vector<Literal> values = {Literal::Int(42)}; | |
| PartitionValues partition(std::move(values)); | |
| auto result = partition.GetField(0); | |
| ASSERT_TRUE(result.has_value()); | |
| EXPECT_TRUE(std::holds_alternative<int32_t>(*result)); | |
| EXPECT_EQ(std::get<int32_t>(*result), 42); | |
| } | |
| TEST(PartitionValuesTest, GetFieldString) { | |
| std::vector<Literal> values = {Literal::String("hello")}; | |
| PartitionValues partition(std::move(values)); | |
| auto result = partition.GetField(0); | |
| ASSERT_TRUE(result.has_value()); | |
| EXPECT_TRUE(std::holds_alternative<std::string_view>(*result)); | |
| EXPECT_EQ(std::get<std::string_view>(*result), "hello"); | |
| } | |
| TEST(PartitionValuesTest, GetFieldMultipleTypes) { | |
| std::vector<Literal> values = {Literal::Int(1), Literal::Long(2L), | |
| Literal::String("test"), Literal::Boolean(true), | |
| Literal::Float(3.14f), Literal::Double(2.82e-04)}; | |
| PartitionValues partition(std::move(values)); | |
| auto result0 = partition.GetField(0); | |
| ASSERT_TRUE(result0.has_value()); | |
| EXPECT_EQ(std::get<int32_t>(*result0), 1); | |
| auto result1 = partition.GetField(1); | |
| ASSERT_TRUE(result1.has_value()); | |
| EXPECT_EQ(std::get<int64_t>(*result1), 2L); | |
| auto result2 = partition.GetField(2); | |
| ASSERT_TRUE(result2.has_value()); | |
| EXPECT_EQ(std::get<std::string_view>(*result2), "test"); | |
| auto result3 = partition.GetField(3); | |
| ASSERT_TRUE(result3.has_value()); | |
| EXPECT_EQ(std::get<bool>(*result3), true); | |
| auto result4 = partition.GetField(4); | |
| ASSERT_TRUE(result4.has_value()); | |
| EXPECT_FLOAT_EQ(std::get<float>(*result4), 3.14f); | |
| auto result5 = partition.GetField(5); | |
| ASSERT_TRUE(result5.has_value()); | |
| EXPECT_DOUBLE_EQ(std::get<double>(*result5), 2.82e-04); | |
| } | |
| TEST(PartitionValuesTest, GetFieldOutOfBounds) { | |
| std::vector<Literal> values = {Literal::Int(1)}; | |
| PartitionValues partition(std::move(values)); | |
| auto result = partition.GetField(1); | |
| EXPECT_FALSE(result.has_value()); | |
| } | |
| TEST(PartitionValuesTest, ValueAt) { | |
| std::vector<Literal> values = {Literal::Int(42)}; | |
| PartitionValues partition(std::move(values)); | |
| auto result = partition.ValueAt(0); | |
| ASSERT_TRUE(result.has_value()); | |
| const Literal& literal_ref = result->get(); | |
| EXPECT_EQ(literal_ref, Literal::Int(42)); | |
| } | |
| TEST(PartitionValuesTest, ValueOutOfBounds) { | |
| std::vector<Literal> values = {Literal::Int(1)}; | |
| PartitionValues partition(std::move(values)); | |
| auto result = partition.ValueAt(1); | |
| EXPECT_FALSE(result.has_value()); | |
| } | |
| TEST(PartitionValuesTest, AddValue) { | |
| PartitionValues partition; | |
| EXPECT_EQ(partition.num_fields(), 0); | |
| partition.AddValue(Literal::Int(1)); | |
| EXPECT_EQ(partition.num_fields(), 1); | |
| partition.AddValue(Literal::String("test")); | |
| EXPECT_EQ(partition.num_fields(), 2); | |
| } | |
| TEST(PartitionValuesTest, Reset) { | |
| std::vector<Literal> values1 = {Literal::Int(1)}; | |
| PartitionValues partition(std::move(values1)); | |
| EXPECT_EQ(partition.num_fields(), 1); | |
| std::vector<Literal> values2 = {Literal::Int(2), Literal::String("test")}; | |
| partition.Reset(std::move(values2)); | |
| EXPECT_EQ(partition.num_fields(), 2); | |
| } | |
| TEST(PartitionValuesTest, EqualityEqual) { | |
| std::vector<Literal> values1 = {Literal::Int(1), Literal::String("test")}; | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition1(std::move(values1)); | |
| PartitionValues partition2(std::move(values2)); | |
| EXPECT_EQ(partition1, partition2); | |
| } | |
| TEST(PartitionValuesTest, EqualityNotEqual) { | |
| std::vector<Literal> values1 = {Literal::Int(1), Literal::String("test")}; | |
| std::vector<Literal> values2 = {Literal::Int(2), Literal::String("test")}; | |
| PartitionValues partition1(std::move(values1)); | |
| PartitionValues partition2(std::move(values2)); | |
| EXPECT_NE(partition1, partition2); | |
| } | |
| TEST(PartitionValuesTest, EqualityDifferentSize) { | |
| std::vector<Literal> values1 = {Literal::Int(1)}; | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition1(std::move(values1)); | |
| PartitionValues partition2(std::move(values2)); | |
| EXPECT_NE(partition1, partition2); | |
| } | |
| // Hash and Equality Functors Tests | |
| TEST(PartitionValuesHashTest, ConsistentHash) { | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition(std::move(values)); | |
| PartitionValuesHash hasher; | |
| size_t hash1 = hasher(partition); | |
| size_t hash2 = hasher(partition); | |
| EXPECT_EQ(hash1, hash2); | |
| } | |
| TEST(PartitionValuesHashTest, DifferentPartitionsDifferentHashes) { | |
| std::vector<Literal> values1 = {Literal::Int(1), Literal::String("test")}; | |
| std::vector<Literal> values2 = {Literal::Int(2), Literal::String("test")}; | |
| PartitionValues partition1(std::move(values1)); | |
| PartitionValues partition2(std::move(values2)); | |
| PartitionValuesHash hasher; | |
| size_t hash1 = hasher(partition1); | |
| size_t hash2 = hasher(partition2); | |
| EXPECT_NE(hash1, hash2); | |
| } | |
| TEST(PartitionValuesHashTest, EqualPartitionsSameHash) { | |
| std::vector<Literal> values1 = {Literal::Int(1), Literal::String("test")}; | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition1(std::move(values1)); | |
| PartitionValues partition2(std::move(values2)); | |
| PartitionValuesHash hasher; | |
| size_t hash1 = hasher(partition1); | |
| size_t hash2 = hasher(partition2); | |
| EXPECT_EQ(hash1, hash2); | |
| } | |
| TEST(PartitionValuesEqualTest, EqualPartitions) { | |
| std::vector<Literal> values1 = {Literal::Int(1), Literal::String("test")}; | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition1(std::move(values1)); | |
| PartitionValues partition2(std::move(values2)); | |
| PartitionValuesEqual equal; | |
| EXPECT_TRUE(equal(partition1, partition2)); | |
| } | |
| TEST(PartitionValuesEqualTest, NotEqualPartitions) { | |
| std::vector<Literal> values1 = {Literal::Int(1), Literal::String("test")}; | |
| std::vector<Literal> values2 = {Literal::Int(2), Literal::String("test")}; | |
| PartitionValues partition1(std::move(values1)); | |
| PartitionValues partition2(std::move(values2)); | |
| PartitionValuesEqual equal; | |
| EXPECT_FALSE(equal(partition1, partition2)); | |
| } | |
| TEST(PartitionKeyHashTest, ConsistentHash) { | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition(std::move(values)); | |
| PartitionKey key{1, std::move(partition)}; | |
| PartitionKeyHash hasher; | |
| size_t hash1 = hasher(key); | |
| size_t hash2 = hasher(key); | |
| EXPECT_EQ(hash1, hash2); | |
| } | |
| TEST(PartitionKeyHashTest, DifferentSpecIdsDifferentHashes) { | |
| std::vector<Literal> values1 = {Literal::Int(1), Literal::String("test")}; | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition1(std::move(values1)); | |
| PartitionValues partition2(std::move(values2)); | |
| PartitionKey key1{1, std::move(partition1)}; | |
| PartitionKey key2{2, std::move(partition2)}; | |
| PartitionKeyHash hasher; | |
| size_t hash1 = hasher(key1); | |
| size_t hash2 = hasher(key2); | |
| EXPECT_NE(hash1, hash2); | |
| } | |
| TEST(PartitionKeyEqualTest, EqualKeys) { | |
| std::vector<Literal> values1 = {Literal::Int(1), Literal::String("test")}; | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition1(std::move(values1)); | |
| PartitionValues partition2(std::move(values2)); | |
| PartitionKey key1{1, std::move(partition1)}; | |
| PartitionKey key2{1, std::move(partition2)}; | |
| PartitionKeyEqual equal; | |
| EXPECT_TRUE(equal(key1, key2)); | |
| } | |
| TEST(PartitionKeyEqualTest, NotEqualKeys) { | |
| std::vector<Literal> values1 = {Literal::Int(1), Literal::String("test")}; | |
| std::vector<Literal> values2 = {Literal::Int(2), Literal::String("test")}; | |
| PartitionValues partition1(std::move(values1)); | |
| PartitionValues partition2(std::move(values2)); | |
| PartitionKey key1{1, std::move(partition1)}; | |
| PartitionKey key2{1, std::move(partition2)}; | |
| PartitionKeyEqual equal; | |
| EXPECT_FALSE(equal(key1, key2)); | |
| } | |
| // PartitionMap Tests | |
| TEST(PartitionMapTest, DefaultConstruction) { | |
| PartitionMap<std::string> map; | |
| EXPECT_EQ(map.size(), 0); | |
| EXPECT_TRUE(map.empty()); | |
| } | |
| TEST(PartitionMapTest, PutAndGet) { | |
| PartitionMap<std::string> map; | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition(std::move(values)); | |
| bool updated = map.put(1, std::move(partition), "value1"); | |
| EXPECT_FALSE(updated); | |
| EXPECT_EQ(map.size(), 1); | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition2(std::move(values2)); | |
| auto result = map.get(1, partition2); | |
| ASSERT_TRUE(result.has_value()); | |
| EXPECT_EQ(result.value().get(), "value1"); | |
| } | |
| TEST(PartitionMapTest, PutUpdate) { | |
| PartitionMap<std::string> map; | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition(std::move(values)); | |
| map.put(1, std::move(partition), "value1"); | |
| EXPECT_EQ(map.size(), 1); | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition2(std::move(values2)); | |
| bool updated = map.put(1, std::move(partition2), "value2"); | |
| EXPECT_TRUE(updated); | |
| EXPECT_EQ(map.size(), 1); | |
| std::vector<Literal> values3 = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition3(std::move(values3)); | |
| auto result = map.get(1, partition3); | |
| ASSERT_TRUE(result.has_value()); | |
| EXPECT_EQ(result.value().get(), "value2"); | |
| } | |
| TEST(PartitionMapTest, GetNonExistent) { | |
| PartitionMap<std::string> map; | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition(std::move(values)); | |
| auto result = map.get(1, partition); | |
| EXPECT_FALSE(result.has_value()); | |
| } | |
| TEST(PartitionMapTest, Contains) { | |
| PartitionMap<std::string> map; | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition(std::move(values)); | |
| map.put(1, std::move(partition), "value1"); | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition2(std::move(values2)); | |
| EXPECT_TRUE(map.contains(1, partition2)); | |
| std::vector<Literal> values3 = {Literal::Int(2), Literal::String("test")}; | |
| PartitionValues partition3(std::move(values3)); | |
| EXPECT_FALSE(map.contains(1, partition3)); | |
| } | |
| TEST(PartitionMapTest, Remove) { | |
| PartitionMap<std::string> map; | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition(std::move(values)); | |
| map.put(1, std::move(partition), "value1"); | |
| EXPECT_EQ(map.size(), 1); | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition2(std::move(values2)); | |
| bool removed = map.remove(1, partition2); | |
| EXPECT_TRUE(removed); | |
| EXPECT_EQ(map.size(), 0); | |
| } | |
| TEST(PartitionMapTest, RemoveNonExistent) { | |
| PartitionMap<std::string> map; | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition(std::move(values)); | |
| bool removed = map.remove(1, partition); | |
| EXPECT_FALSE(removed); | |
| } | |
| TEST(PartitionMapTest, Clear) { | |
| PartitionMap<std::string> map; | |
| std::vector<Literal> values1 = {Literal::Int(1), Literal::String("test1")}; | |
| std::vector<Literal> values2 = {Literal::Int(2), Literal::String("test2")}; | |
| map.put(1, PartitionValues(std::move(values1)), "value1"); | |
| map.put(1, PartitionValues(std::move(values2)), "value2"); | |
| EXPECT_EQ(map.size(), 2); | |
| map.clear(); | |
| EXPECT_EQ(map.size(), 0); | |
| EXPECT_TRUE(map.empty()); | |
| } | |
| TEST(PartitionMapTest, MultipleSpecIds) { | |
| PartitionMap<std::string> map; | |
| std::vector<Literal> values1 = {Literal::Int(1), Literal::String("test")}; | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| map.put(1, PartitionValues(std::move(values1)), "spec1_value"); | |
| map.put(2, PartitionValues(std::move(values2)), "spec2_value"); | |
| EXPECT_EQ(map.size(), 2); | |
| std::vector<Literal> values3 = {Literal::Int(1), Literal::String("test")}; | |
| std::vector<Literal> values4 = {Literal::Int(1), Literal::String("test")}; | |
| auto result1 = map.get(1, PartitionValues(std::move(values3))); | |
| auto result2 = map.get(2, PartitionValues(std::move(values4))); | |
| ASSERT_TRUE(result1.has_value()); | |
| ASSERT_TRUE(result2.has_value()); | |
| EXPECT_EQ(result1.value().get(), "spec1_value"); | |
| EXPECT_EQ(result2.value().get(), "spec2_value"); | |
| } | |
| TEST(PartitionMapTest, Iteration) { | |
| PartitionMap<int> map; | |
| std::vector<Literal> values1 = {Literal::Int(1)}; | |
| std::vector<Literal> values2 = {Literal::Int(2)}; | |
| std::vector<Literal> values3 = {Literal::Int(3)}; | |
| map.put(1, PartitionValues(std::move(values1)), 10); | |
| map.put(1, PartitionValues(std::move(values2)), 20); | |
| map.put(1, PartitionValues(std::move(values3)), 30); | |
| int sum = 0; | |
| for (const auto& [key, value] : map) { | |
| sum += value; | |
| } | |
| EXPECT_EQ(sum, 60); | |
| } | |
| TEST(PartitionMapTest, ConstIteration) { | |
| PartitionMap<int> map; | |
| std::vector<Literal> values1 = {Literal::Int(1)}; | |
| std::vector<Literal> values2 = {Literal::Int(2)}; | |
| map.put(1, PartitionValues(std::move(values1)), 10); | |
| map.put(1, PartitionValues(std::move(values2)), 20); | |
| const auto& const_map = map; | |
| int sum = 0; | |
| for (const auto& [key, value] : const_map) { | |
| sum += value; | |
| } | |
| EXPECT_EQ(sum, 30); | |
| } | |
| // PartitionSet Tests | |
| TEST(PartitionSetTest, DefaultConstruction) { | |
| PartitionSet set; | |
| EXPECT_EQ(set.size(), 0); | |
| EXPECT_TRUE(set.empty()); | |
| } | |
| TEST(PartitionSetTest, AddElement) { | |
| PartitionSet set; | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition(std::move(values)); | |
| bool added = set.add(1, std::move(partition)); | |
| EXPECT_TRUE(added); | |
| EXPECT_EQ(set.size(), 1); | |
| } | |
| TEST(PartitionSetTest, AddDuplicate) { | |
| PartitionSet set; | |
| std::vector<Literal> values1 = {Literal::Int(1), Literal::String("test")}; | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| set.add(1, PartitionValues(std::move(values1))); | |
| bool added = set.add(1, PartitionValues(std::move(values2))); | |
| EXPECT_FALSE(added); | |
| EXPECT_EQ(set.size(), 1); | |
| } | |
| TEST(PartitionSetTest, Contains) { | |
| PartitionSet set; | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition(std::move(values)); | |
| set.add(1, std::move(partition)); | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition2(std::move(values2)); | |
| EXPECT_TRUE(set.contains(1, partition2)); | |
| std::vector<Literal> values3 = {Literal::Int(2), Literal::String("test")}; | |
| PartitionValues partition3(std::move(values3)); | |
| EXPECT_FALSE(set.contains(1, partition3)); | |
| } | |
| TEST(PartitionSetTest, Remove) { | |
| PartitionSet set; | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition(std::move(values)); | |
| set.add(1, std::move(partition)); | |
| EXPECT_EQ(set.size(), 1); | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition2(std::move(values2)); | |
| bool removed = set.remove(1, partition2); | |
| EXPECT_TRUE(removed); | |
| EXPECT_EQ(set.size(), 0); | |
| } | |
| TEST(PartitionSetTest, RemoveNonExistent) { | |
| PartitionSet set; | |
| std::vector<Literal> values = {Literal::Int(1), Literal::String("test")}; | |
| PartitionValues partition(std::move(values)); | |
| bool removed = set.remove(1, partition); | |
| EXPECT_FALSE(removed); | |
| } | |
| TEST(PartitionSetTest, Clear) { | |
| PartitionSet set; | |
| std::vector<Literal> values1 = {Literal::Int(1), Literal::String("test1")}; | |
| std::vector<Literal> values2 = {Literal::Int(2), Literal::String("test2")}; | |
| set.add(1, PartitionValues(std::move(values1))); | |
| set.add(1, PartitionValues(std::move(values2))); | |
| EXPECT_EQ(set.size(), 2); | |
| set.clear(); | |
| EXPECT_EQ(set.size(), 0); | |
| EXPECT_TRUE(set.empty()); | |
| } | |
| TEST(PartitionSetTest, MultipleSpecIds) { | |
| PartitionSet set; | |
| std::vector<Literal> values1 = {Literal::Int(1), Literal::String("test")}; | |
| std::vector<Literal> values2 = {Literal::Int(1), Literal::String("test")}; | |
| set.add(1, PartitionValues(std::move(values1))); | |
| set.add(2, PartitionValues(std::move(values2))); | |
| EXPECT_EQ(set.size(), 2); | |
| std::vector<Literal> values3 = {Literal::Int(1), Literal::String("test")}; | |
| std::vector<Literal> values4 = {Literal::Int(1), Literal::String("test")}; | |
| EXPECT_TRUE(set.contains(1, PartitionValues(std::move(values3)))); | |
| EXPECT_TRUE(set.contains(2, PartitionValues(std::move(values4)))); | |
| } | |
| TEST(PartitionSetTest, Iteration) { | |
| PartitionSet set; | |
| std::vector<Literal> values1 = {Literal::Int(1)}; | |
| std::vector<Literal> values2 = {Literal::Int(2)}; | |
| std::vector<Literal> values3 = {Literal::Int(3)}; | |
| set.add(1, PartitionValues(std::move(values1))); | |
| set.add(1, PartitionValues(std::move(values2))); | |
| set.add(1, PartitionValues(std::move(values3))); | |
| int count = 0; | |
| for (const auto& [spec_id, partition] : set) { | |
| EXPECT_EQ(spec_id, 1); | |
| count++; | |
| } | |
| EXPECT_EQ(count, 3); | |
| } | |
| TEST(PartitionSetTest, ConstIteration) { | |
| PartitionSet set; | |
| std::vector<Literal> values1 = {Literal::Int(1)}; | |
| std::vector<Literal> values2 = {Literal::Int(2)}; | |
| set.add(1, PartitionValues(std::move(values1))); | |
| set.add(1, PartitionValues(std::move(values2))); | |
| const auto& const_set = set; | |
| int count = 0; | |
| for (const auto& [spec_id, partition] : const_set) { | |
| EXPECT_EQ(spec_id, 1); | |
| count++; | |
| } | |
| EXPECT_EQ(count, 2); | |
| } | |
| } // namespace iceberg |