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

Method consume_batch

parquet/src/arrow/array_reader/struct_array.rs:103–188  ·  view source on GitHub ↗

Consume struct records. Definition levels of struct array is calculated as following: ```ignore def_levels[i] = min(child1_def_levels[i], child2_def_levels[i], ..., childn_def_levels[i]); ``` Repetition levels of struct array is calculated as following: ```ignore rep_levels[i] = child1_rep_levels[i]; ``` The null bitmap of struct array is calculated from def_levels: ```ignore null_bitmap[i] = (

(&mut self)

Source from the content-addressed store, hash-verified

101 /// ```
102 ///
103 fn consume_batch(&mut self) -> Result<ArrayRef> {
104 if self.children.is_empty() {
105 return Ok(Arc::new(StructArray::from(Vec::new())));
106 }
107
108 let children_array = self
109 .children
110 .iter_mut()
111 .map(|reader| reader.consume_batch())
112 .collect::<Result<Vec<_>>>()?;
113
114 // check that array child data has same size
115 let children_array_len = children_array
116 .first()
117 .map(|arr| arr.len())
118 .ok_or_else(|| general_err!("Struct array reader should have at least one child!"))?;
119
120 let all_children_len_eq = children_array
121 .iter()
122 .all(|arr| arr.len() == children_array_len);
123 if !all_children_len_eq {
124 return Err(general_err!("Not all children array length are the same!"));
125 }
126
127 let DataType::Struct(fields) = &self.data_type else {
128 return Err(general_err!(
129 "Internal: StructArrayReader must have struct data type, got {:?}",
130 self.data_type
131 ));
132 };
133 let fields = fields.clone(); // cloning Fields is cheap (Arc internally)
134
135 let mut nulls = None;
136 if self.nullable {
137 // calculate struct def level data
138
139 // children should have consistent view of parent, only need to inspect first child
140 let def_levels = self.children[0]
141 .get_def_levels()
142 .expect("child with nullable parents must have definition level");
143
144 // calculate bitmap for current array
145 let mut bitmap_builder = BooleanBufferBuilder::new(children_array_len);
146
147 match self.children[0].get_rep_levels() {
148 Some(rep_levels) => {
149 // Sanity check
150 assert_eq!(rep_levels.len(), def_levels.len());
151
152 for (rep_level, def_level) in rep_levels.iter().zip(def_levels) {
153 if rep_level > &self.struct_rep_level {
154 // Already handled by inner list - SKIP
155 continue;
156 }
157 bitmap_builder.append(*def_level >= self.struct_def_level)
158 }
159 }
160 None => {

Callers

nothing calls this directly

Calls 11

firstMethod · 0.80
allMethod · 0.80
zipMethod · 0.80
extend_trusted_lenMethod · 0.80
is_emptyMethod · 0.45
lenMethod · 0.45
iterMethod · 0.45
cloneMethod · 0.45
get_def_levelsMethod · 0.45
get_rep_levelsMethod · 0.45
appendMethod · 0.45

Tested by

no test coverage detected