| 152 | } |
| 153 | |
| 154 | fn pad_nulls( |
| 155 | &mut self, |
| 156 | read_offset: usize, |
| 157 | values_read: usize, |
| 158 | levels_read: usize, |
| 159 | valid_mask: &[u8], |
| 160 | ) { |
| 161 | assert_eq!(self.offsets.len(), read_offset + values_read + 1); |
| 162 | self.offsets |
| 163 | .resize(read_offset + levels_read + 1, I::default()); |
| 164 | |
| 165 | let offsets = &mut self.offsets; |
| 166 | |
| 167 | let mut last_pos = read_offset + levels_read + 1; |
| 168 | let mut last_start_offset = I::from_usize(self.values.len()).unwrap(); |
| 169 | |
| 170 | let values_range = read_offset..read_offset + values_read; |
| 171 | for (value_pos, level_pos) in values_range |
| 172 | .clone() |
| 173 | .rev() |
| 174 | .zip(iter_set_bits_rev(valid_mask)) |
| 175 | { |
| 176 | assert!(level_pos >= value_pos); |
| 177 | assert!(level_pos < last_pos); |
| 178 | |
| 179 | let end_offset = offsets[value_pos + 1]; |
| 180 | let start_offset = offsets[value_pos]; |
| 181 | |
| 182 | // Fill in any nulls |
| 183 | for x in &mut offsets[level_pos + 1..last_pos] { |
| 184 | *x = end_offset; |
| 185 | } |
| 186 | |
| 187 | if level_pos == value_pos { |
| 188 | return; |
| 189 | } |
| 190 | |
| 191 | offsets[level_pos] = start_offset; |
| 192 | last_pos = level_pos; |
| 193 | last_start_offset = start_offset; |
| 194 | } |
| 195 | |
| 196 | // Pad leading nulls up to `last_offset` |
| 197 | for x in &mut offsets[values_range.start + 1..last_pos] { |
| 198 | *x = last_start_offset |
| 199 | } |
| 200 | } |
| 201 | } |
| 202 | |
| 203 | #[cfg(test)] |