fn read_field()

in parquet/src/record/reader.rs [418:507]


    fn read_field(&mut self) -> Result<Field> {
        let field = match *self {
            Reader::PrimitiveReader(_, ref mut column) => {
                let value = column.current_value()?;
                column.read_next()?;
                value
            }
            Reader::OptionReader(def_level, ref mut reader) => {
                if reader.current_def_level() > def_level {
                    reader.read_field()?
                } else {
                    reader.advance_columns();
                    Field::Null
                }
            }
            Reader::GroupReader(_, def_level, ref mut readers) => {
                let mut fields = Vec::new();
                for reader in readers {
                    if reader.repetition() != Repetition::OPTIONAL
                        || reader.current_def_level() > def_level
                    {
                        fields.push((
                            String::from(reader.field_name()),
                            reader.read_field()?,
                        ));
                    } else {
                        reader.advance_columns();
                        fields.push((String::from(reader.field_name()), Field::Null));
                    }
                }
                let row = make_row(fields);
                Field::Group(row)
            }
            Reader::RepeatedReader(_, def_level, rep_level, ref mut reader) => {
                let mut elements = Vec::new();
                loop {
                    if reader.current_def_level() > def_level {
                        elements.push(reader.read_field()?);
                    } else {
                        reader.advance_columns();
                        // If the current definition level is equal to the definition
                        // level of this repeated type, then the
                        // result is an empty list and the repetition level
                        // will always be <= rl.
                        break;
                    }

                    // This covers case when we are out of repetition levels and should
                    // close the group, or there are no values left to
                    // buffer.
                    if !reader.has_next() || reader.current_rep_level() <= rep_level {
                        break;
                    }
                }
                Field::ListInternal(make_list(elements))
            }
            Reader::KeyValueReader(
                _,
                def_level,
                rep_level,
                ref mut keys,
                ref mut values,
            ) => {
                let mut pairs = Vec::new();
                loop {
                    if keys.current_def_level() > def_level {
                        pairs.push((keys.read_field()?, values.read_field()?));
                    } else {
                        keys.advance_columns();
                        values.advance_columns();
                        // If the current definition level is equal to the definition
                        // level of this repeated type, then the
                        // result is an empty list and the repetition level
                        // will always be <= rl.
                        break;
                    }

                    // This covers case when we are out of repetition levels and should
                    // close the group, or there are no values left to
                    // buffer.
                    if !keys.has_next() || keys.current_rep_level() <= rep_level {
                        break;
                    }
                }

                Field::MapInternal(make_map(pairs))
            }
        };
        Ok(field)
    }