(&mut self, out: &mut Self::Buffer, num_values: usize)
| 315 | } |
| 316 | |
| 317 | fn read(&mut self, out: &mut Self::Buffer, num_values: usize) -> Result<usize> { |
| 318 | match self.decoder.as_mut().expect("decoder set") { |
| 319 | MaybeDictionaryDecoder::Fallback(decoder) => { |
| 320 | decoder.read(out.spill_values()?, num_values, None) |
| 321 | } |
| 322 | MaybeDictionaryDecoder::Dict { |
| 323 | decoder, |
| 324 | max_remaining_values, |
| 325 | } => { |
| 326 | let len = num_values.min(*max_remaining_values); |
| 327 | |
| 328 | let dict = self |
| 329 | .dict |
| 330 | .as_ref() |
| 331 | .ok_or_else(|| general_err!("missing dictionary page for column"))?; |
| 332 | |
| 333 | assert_eq!(dict.data_type(), &self.value_type); |
| 334 | |
| 335 | if dict.is_empty() { |
| 336 | return Ok(0); // All data must be NULL |
| 337 | } |
| 338 | |
| 339 | match out.as_keys(dict) { |
| 340 | Some(keys) => { |
| 341 | // Happy path - can just copy keys |
| 342 | // Keys will be validated on conversion to arrow |
| 343 | |
| 344 | // TODO: Push vec into decoder (#5177) |
| 345 | let start = keys.len(); |
| 346 | keys.resize(start + len, K::default()); |
| 347 | let len = decoder.get_batch(&mut keys[start..])?; |
| 348 | keys.truncate(start + len); |
| 349 | *max_remaining_values -= len; |
| 350 | Ok(len) |
| 351 | } |
| 352 | None => { |
| 353 | // Sad path - need to recompute dictionary |
| 354 | // |
| 355 | // This either means we crossed into a new column chunk whilst |
| 356 | // reading this batch, or encountered non-dictionary encoded data |
| 357 | let values = out.spill_values()?; |
| 358 | let mut keys = vec![K::default(); len]; |
| 359 | let len = decoder.get_batch(&mut keys)?; |
| 360 | |
| 361 | assert_eq!(dict.data_type(), &self.value_type); |
| 362 | |
| 363 | let data = dict.to_data(); |
| 364 | let dict_buffers = data.buffers(); |
| 365 | let dict_offsets = dict_buffers[0].typed_data::<V>(); |
| 366 | let dict_values = dict_buffers[1].as_slice(); |
| 367 | |
| 368 | values.extend_from_dictionary(&keys[..len], dict_offsets, dict_values)?; |
| 369 | *max_remaining_values -= len; |
| 370 | Ok(len) |
| 371 | } |
| 372 | } |
| 373 | } |
| 374 | } |
no test coverage detected