| 538 | // Generates pages from randomly generated data |
| 539 | template <typename Type> |
| 540 | static inline int MakePages(const ColumnDescriptor* d, int num_pages, int levels_per_page, |
| 541 | std::vector<int16_t>& def_levels, |
| 542 | std::vector<int16_t>& rep_levels, |
| 543 | std::vector<typename Type::c_type>& values, |
| 544 | std::vector<uint8_t>& buffer, |
| 545 | std::vector<std::shared_ptr<Page>>& pages, |
| 546 | Encoding::type encoding = Encoding::PLAIN, |
| 547 | uint32_t seed = 0) { |
| 548 | int num_levels = levels_per_page * num_pages; |
| 549 | int num_values = 0; |
| 550 | int16_t zero = 0; |
| 551 | int16_t max_def_level = d->max_definition_level(); |
| 552 | int16_t max_rep_level = d->max_repetition_level(); |
| 553 | std::vector<int> values_per_page(num_pages, levels_per_page); |
| 554 | // Create definition levels |
| 555 | if (max_def_level > 0 && num_levels != 0) { |
| 556 | def_levels.resize(num_levels); |
| 557 | random_numbers(num_levels, seed, zero, max_def_level, def_levels.data()); |
| 558 | for (int p = 0; p < num_pages; p++) { |
| 559 | int num_values_per_page = 0; |
| 560 | for (int i = 0; i < levels_per_page; i++) { |
| 561 | if (def_levels[i + p * levels_per_page] == max_def_level) { |
| 562 | num_values_per_page++; |
| 563 | num_values++; |
| 564 | } |
| 565 | } |
| 566 | values_per_page[p] = num_values_per_page; |
| 567 | } |
| 568 | } else { |
| 569 | num_values = num_levels; |
| 570 | } |
| 571 | // Create repetition levels |
| 572 | if (max_rep_level > 0 && num_levels != 0) { |
| 573 | rep_levels.resize(num_levels); |
| 574 | // Using a different seed so that def_levels and rep_levels are different. |
| 575 | random_numbers(num_levels, seed + 789, zero, max_rep_level, rep_levels.data()); |
| 576 | // The generated levels are random. Force the very first page to start with a new |
| 577 | // record. |
| 578 | rep_levels[0] = 0; |
| 579 | // For a null value, rep_levels and def_levels are both 0. |
| 580 | // If we have a repeated value right after this, it needs to start with |
| 581 | // rep_level = 0 to indicate a new record. |
| 582 | for (int i = 0; i < num_levels - 1; ++i) { |
| 583 | if (rep_levels[i] == 0 && def_levels[i] == 0) { |
| 584 | rep_levels[i + 1] = 0; |
| 585 | } |
| 586 | } |
| 587 | } |
| 588 | // Create values |
| 589 | values.resize(num_values); |
| 590 | if (encoding == Encoding::PLAIN) { |
| 591 | InitValues<typename Type::c_type>(num_values, values, buffer); |
| 592 | PaginatePlain<Type>(d, values, def_levels, max_def_level, rep_levels, max_rep_level, |
| 593 | levels_per_page, values_per_page, pages); |
| 594 | } else if (encoding == Encoding::RLE_DICTIONARY || |
| 595 | encoding == Encoding::PLAIN_DICTIONARY) { |
| 596 | // Calls InitValues and repeats the data |
| 597 | InitDictValues<typename Type::c_type>(num_values, levels_per_page, values, buffer); |
nothing calls this directly
no test coverage detected