| 67 | } |
| 68 | |
| 69 | bool ParquetBoolDecoder::SkipValues(int num_values) { |
| 70 | DCHECK_GE(num_values, 0); |
| 71 | int skip_cached = min(num_unpacked_values_ - unpacked_value_idx_, num_values); |
| 72 | unpacked_value_idx_ += skip_cached; |
| 73 | if (skip_cached == num_values) return true; |
| 74 | int num_remaining = num_values - skip_cached; |
| 75 | if (encoding_ == parquet::Encoding::PLAIN) { |
| 76 | int num_to_skip = BitUtil::RoundDownToPowerOf2(num_remaining, 32); |
| 77 | if (num_to_skip > 0) { |
| 78 | bool skipped = bool_values_.SkipBatch(1, num_to_skip); |
| 79 | DCHECK(skipped); |
| 80 | } |
| 81 | num_remaining -= num_to_skip; |
| 82 | if (num_remaining > 0) { |
| 83 | DCHECK_LE(num_remaining, UNPACKED_BUFFER_LEN); |
| 84 | num_unpacked_values_ = bool_values_.UnpackBatch(1, UNPACKED_BUFFER_LEN, |
| 85 | &unpacked_values_[0]); |
| 86 | if (UNLIKELY(num_unpacked_values_ < num_remaining)) return false; |
| 87 | unpacked_value_idx_ = num_remaining; |
| 88 | } |
| 89 | return true; |
| 90 | } else { |
| 91 | // rle_decoder_.SkipValues() might fill its internal buffer 'literal_buffer_'. |
| 92 | // This can result in sub-optimal decoding later, because 'literal_buffer_' might |
| 93 | // be used again and again, especially when reading a very long literal run. |
| 94 | DCHECK_EQ(encoding_, parquet::Encoding::RLE); |
| 95 | return rle_decoder_.SkipValues(num_remaining) == num_remaining; |
| 96 | } |
| 97 | } |
| 98 | |
| 99 | } // namespace impala |