MCPcopy Create free account
hub / github.com/apache/arrow / MakePages

Function MakePages

cpp/src/parquet/test_util.h:540–603  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

538// Generates pages from randomly generated data
539template <typename Type>
540static 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);

Callers

nothing calls this directly

Calls 3

random_numbersFunction · 0.85
resizeMethod · 0.80
dataMethod · 0.45

Tested by

no test coverage detected