MCPcopy Create free account
hub / github.com/apache/arrow-rs / read

Method read

parquet/src/arrow/array_reader/byte_array_dictionary.rs:317–375  ·  view source on GitHub ↗
(&mut self, out: &mut Self::Buffer, num_values: usize)

Source from the content-addressed store, hash-verified

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 }

Callers 1

set_dictMethod · 0.45

Calls 13

defaultFunction · 0.85
spill_valuesMethod · 0.80
as_keysMethod · 0.80
as_refMethod · 0.45
is_emptyMethod · 0.45
lenMethod · 0.45
resizeMethod · 0.45
get_batchMethod · 0.45
truncateMethod · 0.45
to_dataMethod · 0.45
buffersMethod · 0.45

Tested by

no test coverage detected