| 438 | |
| 439 | template<typename T> |
| 440 | void integerPackingMultiPage(const std::vector<T>& src) { |
| 441 | auto alg = IntegerBitpacking<T>(); |
| 442 | auto pageSize = 4096; |
| 443 | const auto& [min, max] = std::minmax_element(src.begin(), src.end()); |
| 444 | auto metadata = |
| 445 | CompressionMetadata(StorageValue(*min), StorageValue(*max), alg.getCompressionType()); |
| 446 | auto numValuesPerPage = metadata.numValues(pageSize, LogicalType(LogicalTypeID::INT64)); |
| 447 | int64_t numValuesRemaining = src.size(); |
| 448 | const uint8_t* srcCursor = (uint8_t*)src.data(); |
| 449 | auto pages = src.size() / numValuesPerPage + 1; |
| 450 | std::vector<std::vector<uint8_t>> dest(pages, std::vector<uint8_t>(pageSize)); |
| 451 | size_t pageNum = 0; |
| 452 | while (numValuesRemaining > 0) { |
| 453 | ASSERT_LT(pageNum, pages); |
| 454 | alg.compressNextPage(srcCursor, numValuesRemaining, dest[pageNum++].data(), pageSize, |
| 455 | metadata); |
| 456 | numValuesRemaining -= numValuesPerPage; |
| 457 | } |
| 458 | ASSERT_EQ(srcCursor, (uint8_t*)(src.data() + src.size())); |
| 459 | for (auto i = 0u; i < src.size(); i++) { |
| 460 | auto page = i / numValuesPerPage; |
| 461 | auto indexInPage = i % numValuesPerPage; |
| 462 | T value; |
| 463 | alg.decompressFromPage(dest[page].data(), indexInPage, (uint8_t*)&value, 0, 1 /*numValues*/, |
| 464 | metadata); |
| 465 | EXPECT_EQ(src[i] - value, 0); |
| 466 | EXPECT_EQ(src[i], value); |
| 467 | } |
| 468 | std::vector<T> decompressed(src.size()); |
| 469 | for (auto i = 0u; i < src.size(); i += numValuesPerPage) { |
| 470 | auto page = i / numValuesPerPage; |
| 471 | alg.decompressFromPage(dest[page].data(), 0, (uint8_t*)decompressed.data(), i, |
| 472 | std::min(numValuesPerPage, (uint64_t)src.size() - i), metadata); |
| 473 | } |
| 474 | ASSERT_EQ(decompressed, src); |
| 475 | } |
| 476 | |
| 477 | TEST(CompressionTests, IntegerPackingMultiPage64) { |
| 478 | int64_t numValues = 10000; |
no test coverage detected