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

Method read

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

Source from the content-addressed store, hash-verified

421 }
422
423 fn read(&mut self, out: &mut Self::Buffer, num_values: usize) -> Result<usize> {
424 match out.byte_length {
425 Some(x) => assert_eq!(x, self.byte_length),
426 None => {
427 out.byte_length = Some(self.byte_length);
428 // TODO: collapse to a let-chain once MSRV ≥ 1.88
429 // (`if out.buffer.is_empty() && let Some(cap) = out.values_capacity.take()`)
430 if out.buffer.is_empty() {
431 if let Some(values_capacity) = out.values_capacity.take() {
432 // now that the byte length per output element is known,
433 // allocate the actual needed space.
434 let byte_capacity = values_capacity.saturating_mul(self.byte_length);
435 out.buffer = Vec::with_capacity(byte_capacity);
436 }
437 }
438 }
439 }
440
441 match self.decoder.as_mut().unwrap() {
442 Decoder::Plain { offset, buf } => {
443 let to_read =
444 (num_values * self.byte_length).min(buf.len() - *offset) / self.byte_length;
445 let end_offset = *offset + to_read * self.byte_length;
446 out.buffer
447 .extend_from_slice(&buf.as_ref()[*offset..end_offset]);
448 *offset = end_offset;
449 Ok(to_read)
450 }
451 Decoder::Dict { decoder } => {
452 let dict = self.dict_page.as_ref().unwrap();
453 // All data must be NULL
454 if dict.is_empty() {
455 return Ok(0);
456 }
457
458 decoder.read(num_values, |keys| {
459 out.buffer.reserve(keys.len() * self.byte_length);
460 for key in keys {
461 let offset = *key as usize * self.byte_length;
462 let val = &dict.as_ref()[offset..offset + self.byte_length];
463 out.buffer.extend_from_slice(val);
464 }
465 Ok(())
466 })
467 }
468 Decoder::Delta { decoder } => {
469 let to_read = num_values.min(decoder.remaining());
470 out.buffer.reserve(to_read * self.byte_length);
471
472 decoder.read(to_read, |slice| {
473 if slice.len() != self.byte_length {
474 return Err(general_err!(
475 "encountered array with incorrect length, got {} expected {}",
476 slice.len(),
477 self.byte_length
478 ));
479 }
480 out.buffer.extend_from_slice(slice);

Callers

nothing calls this directly

Calls 8

read_byte_stream_splitFunction · 0.85
extend_from_sliceMethod · 0.80
remainingMethod · 0.80
is_emptyMethod · 0.45
takeMethod · 0.45
lenMethod · 0.45
as_refMethod · 0.45
reserveMethod · 0.45

Tested by

no test coverage detected