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)
| 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 => { |
nothing calls this directly
no test coverage detected