| 313 | void DeepFree(std::vector<c_type>&); |
| 314 | |
| 315 | void TestMinMaxEncode() { |
| 316 | this->GenerateData(1000); |
| 317 | |
| 318 | auto statistics1 = MakeStatistics<TestType>(this->schema_.Column(0)); |
| 319 | statistics1->Update(this->values_ptr_, this->values_.size(), 0); |
| 320 | std::string encoded_min = statistics1->EncodeMin(); |
| 321 | std::string encoded_max = statistics1->EncodeMax(); |
| 322 | |
| 323 | auto statistics2 = MakeStatistics<TestType>( |
| 324 | this->schema_.Column(0), encoded_min, encoded_max, this->values_.size(), |
| 325 | /*null_count=*/0, /*distinct_count=*/0, |
| 326 | /*has_min_max=*/true, /*has_null_count=*/true, /*has_distinct_count=*/true, |
| 327 | /*is_min_value_exact=*/true, /*is_max_value_exact=*/true); |
| 328 | |
| 329 | auto statistics3 = MakeStatistics<TestType>(this->schema_.Column(0)); |
| 330 | std::vector<uint8_t> valid_bits( |
| 331 | bit_util::BytesForBits(static_cast<uint32_t>(this->values_.size())) + 1, 255); |
| 332 | statistics3->UpdateSpaced(this->values_ptr_, valid_bits.data(), 0, |
| 333 | this->values_.size(), this->values_.size(), 0); |
| 334 | std::string encoded_min_spaced = statistics3->EncodeMin(); |
| 335 | std::string encoded_max_spaced = statistics3->EncodeMax(); |
| 336 | |
| 337 | // Use old API without is_{min/max}_value_exact |
| 338 | auto statistics4 = MakeStatistics<TestType>( |
| 339 | this->schema_.Column(0), encoded_min, encoded_max, this->values_.size(), |
| 340 | /*null_count=*/0, /*distinct_count=*/0, |
| 341 | /*has_min_max=*/true, /*has_null_count=*/true, /*has_distinct_count=*/true); |
| 342 | ASSERT_EQ(encoded_min, statistics2->EncodeMin()); |
| 343 | ASSERT_EQ(encoded_max, statistics2->EncodeMax()); |
| 344 | ASSERT_EQ(statistics1->min(), statistics2->min()); |
| 345 | ASSERT_EQ(statistics1->max(), statistics2->max()); |
| 346 | ASSERT_EQ(statistics1->is_min_value_exact(), std::make_optional(true)); |
| 347 | ASSERT_EQ(statistics1->is_max_value_exact(), std::make_optional(true)); |
| 348 | ASSERT_EQ(statistics2->is_min_value_exact(), std::make_optional(true)); |
| 349 | ASSERT_EQ(statistics2->is_max_value_exact(), std::make_optional(true)); |
| 350 | ASSERT_EQ(encoded_min_spaced, statistics2->EncodeMin()); |
| 351 | ASSERT_EQ(encoded_max_spaced, statistics2->EncodeMax()); |
| 352 | ASSERT_EQ(statistics3->min(), statistics2->min()); |
| 353 | ASSERT_EQ(statistics3->max(), statistics2->max()); |
| 354 | ASSERT_EQ(statistics3->is_min_value_exact(), std::make_optional(true)); |
| 355 | ASSERT_EQ(statistics3->is_max_value_exact(), std::make_optional(true)); |
| 356 | ASSERT_EQ(statistics4->min(), statistics2->min()); |
| 357 | ASSERT_EQ(statistics4->max(), statistics2->max()); |
| 358 | ASSERT_EQ(statistics4->is_min_value_exact(), std::nullopt); |
| 359 | ASSERT_EQ(statistics4->is_max_value_exact(), std::nullopt); |
| 360 | } |
| 361 | |
| 362 | void TestReset() { |
| 363 | this->GenerateData(1000); |
nothing calls this directly
no test coverage detected