Builds tree of readers for the current schema recursively.
(
&self,
field: TypePtr,
path: &mut Vec<String>,
mut curr_def_level: i16,
mut curr_rep_level: i16,
paths: &HashMap<ColumnPath, usize>,
row_group
| 104 | |
| 105 | /// Builds tree of readers for the current schema recursively. |
| 106 | fn reader_tree( |
| 107 | &self, |
| 108 | field: TypePtr, |
| 109 | path: &mut Vec<String>, |
| 110 | mut curr_def_level: i16, |
| 111 | mut curr_rep_level: i16, |
| 112 | paths: &HashMap<ColumnPath, usize>, |
| 113 | row_group_reader: &dyn RowGroupReader, |
| 114 | ) -> Result<Reader> { |
| 115 | assert!(field.get_basic_info().has_repetition()); |
| 116 | // Update current definition and repetition levels for this type |
| 117 | let repetition = field.get_basic_info().repetition(); |
| 118 | match repetition { |
| 119 | Repetition::OPTIONAL => { |
| 120 | curr_def_level += 1; |
| 121 | } |
| 122 | Repetition::REPEATED => { |
| 123 | curr_def_level += 1; |
| 124 | curr_rep_level += 1; |
| 125 | } |
| 126 | _ => {} |
| 127 | } |
| 128 | |
| 129 | path.push(String::from(field.name())); |
| 130 | let reader = if field.is_primitive() { |
| 131 | let col_path = ColumnPath::new(path.to_vec()); |
| 132 | let orig_index = *paths |
| 133 | .get(&col_path) |
| 134 | .ok_or(general_err!("Path {:?} not found", col_path))?; |
| 135 | let col_descr = row_group_reader |
| 136 | .metadata() |
| 137 | .column(orig_index) |
| 138 | .column_descr_ptr(); |
| 139 | let col_reader = row_group_reader.get_column_reader(orig_index)?; |
| 140 | let column = TripletIter::new(col_descr, col_reader, self.batch_size); |
| 141 | let reader = Reader::PrimitiveReader(field.clone(), Box::new(column)); |
| 142 | if repetition == Repetition::REPEATED { |
| 143 | Reader::RepeatedReader( |
| 144 | field, |
| 145 | curr_def_level - 1, |
| 146 | curr_rep_level - 1, |
| 147 | Box::new(reader), |
| 148 | ) |
| 149 | } else { |
| 150 | reader |
| 151 | } |
| 152 | } else { |
| 153 | match field.get_basic_info().converted_type() { |
| 154 | // List types |
| 155 | ConvertedType::LIST => { |
| 156 | assert_eq!(field.get_fields().len(), 1, "Invalid list type {field:?}"); |
| 157 | |
| 158 | let repeated_field = field.get_fields()[0].clone(); |
| 159 | assert_eq!( |
| 160 | repeated_field.get_basic_info().repetition(), |
| 161 | Repetition::REPEATED, |
| 162 | "Invalid list type {field:?}" |
| 163 | ); |
no test coverage detected