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)
}