in crates/core/src/table/partition.rs [121:164]
fn parse_segments(&self, partition_path: &str) -> Result<HashMap<String, Scalar<ArrayRef>>> {
let partition_path = if self.is_url_encoded {
percent_encoding::percent_decode(partition_path.as_bytes())
.decode_utf8()?
.into_owned()
} else {
partition_path.to_string()
};
let parts: Vec<&str> = partition_path.split('/').collect();
if parts.len() != self.schema.fields().len() {
return Err(InvalidPartitionPath(format!(
"Partition path should have {} part(s) but got {}",
self.schema.fields().len(),
parts.len()
)));
}
self.schema
.fields()
.iter()
.zip(parts)
.map(|(field, part)| {
let value = if self.is_hive_style {
let (name, value) = part.split_once('=').ok_or(InvalidPartitionPath(
format!("Partition path should be hive-style but got {}", part),
))?;
if name != field.name() {
return Err(InvalidPartitionPath(format!(
"Partition path should contain {} but got {}",
field.name(),
name
)));
}
value
} else {
part
};
let scalar = SchemableFilter::cast_value(&[value], field.data_type())?;
Ok((field.name().to_string(), scalar))
})
.collect()
}