in crates/iceberg/src/expr/visitors/page_index_evaluator.rs [243:385]
fn apply_predicate_to_column_index<F>(
predicate: F,
field_type: &PrimitiveType,
column_index: &Index,
row_counts: &[usize],
) -> Result<Option<Vec<bool>>>
where
F: Fn(Option<Datum>, Option<Datum>, PageNullCount) -> Result<bool>,
{
let result: Result<Vec<bool>> = match column_index {
Index::NONE => {
return Ok(None);
}
Index::BOOLEAN(idx) => idx
.indexes
.iter()
.zip(row_counts.iter())
.map(|(item, &row_count)| {
predicate(
item.min.map(|val| {
Datum::new(field_type.clone(), PrimitiveLiteral::Boolean(val))
}),
item.max.map(|val| {
Datum::new(field_type.clone(), PrimitiveLiteral::Boolean(val))
}),
PageNullCount::from_row_and_null_counts(row_count, item.null_count),
)
})
.collect(),
Index::INT32(idx) => idx
.indexes
.iter()
.zip(row_counts.iter())
.map(|(item, &row_count)| {
predicate(
item.min
.map(|val| Datum::new(field_type.clone(), PrimitiveLiteral::Int(val))),
item.max
.map(|val| Datum::new(field_type.clone(), PrimitiveLiteral::Int(val))),
PageNullCount::from_row_and_null_counts(row_count, item.null_count),
)
})
.collect(),
Index::INT64(idx) => idx
.indexes
.iter()
.zip(row_counts.iter())
.map(|(item, &row_count)| {
predicate(
item.min
.map(|val| Datum::new(field_type.clone(), PrimitiveLiteral::Long(val))),
item.max
.map(|val| Datum::new(field_type.clone(), PrimitiveLiteral::Long(val))),
PageNullCount::from_row_and_null_counts(row_count, item.null_count),
)
})
.collect(),
Index::FLOAT(idx) => idx
.indexes
.iter()
.zip(row_counts.iter())
.map(|(item, &row_count)| {
predicate(
item.min.map(|val| {
Datum::new(
field_type.clone(),
PrimitiveLiteral::Float(OrderedFloat::from(val)),
)
}),
item.max.map(|val| {
Datum::new(
field_type.clone(),
PrimitiveLiteral::Float(OrderedFloat::from(val)),
)
}),
PageNullCount::from_row_and_null_counts(row_count, item.null_count),
)
})
.collect(),
Index::DOUBLE(idx) => idx
.indexes
.iter()
.zip(row_counts.iter())
.map(|(item, &row_count)| {
predicate(
item.min.map(|val| {
Datum::new(
field_type.clone(),
PrimitiveLiteral::Double(OrderedFloat::from(val)),
)
}),
item.max.map(|val| {
Datum::new(
field_type.clone(),
PrimitiveLiteral::Double(OrderedFloat::from(val)),
)
}),
PageNullCount::from_row_and_null_counts(row_count, item.null_count),
)
})
.collect(),
Index::BYTE_ARRAY(idx) => idx
.indexes
.iter()
.zip(row_counts.iter())
.map(|(item, &row_count)| {
predicate(
item.min.clone().map(|val| {
Datum::new(
field_type.clone(),
PrimitiveLiteral::String(
String::from_utf8(val.data().to_vec()).unwrap(),
),
)
}),
item.max.clone().map(|val| {
Datum::new(
field_type.clone(),
PrimitiveLiteral::String(
String::from_utf8(val.data().to_vec()).unwrap(),
),
)
}),
PageNullCount::from_row_and_null_counts(row_count, item.null_count),
)
})
.collect(),
Index::FIXED_LEN_BYTE_ARRAY(_) => {
return Err(Error::new(
ErrorKind::FeatureUnsupported,
"unsupported 'FIXED_LEN_BYTE_ARRAY' index type in column_index",
))
}
Index::INT96(_) => {
return Err(Error::new(
ErrorKind::FeatureUnsupported,
"unsupported 'INT96' index type in column_index",
))
}
};
Ok(Some(result?))
}