use crate::{
db::{
data::{ScalarSlotValueRef, StructuralRowContract},
schema::LeafCodec,
},
error::InternalError,
value::Value,
};
use std::cell::OnceCell;
#[derive(Debug)]
pub(in crate::db::data::persisted_row) enum CachedSlotValue<'a> {
Scalar {
validated: OnceCell<ScalarSlotValueRef<'a>>,
materialized: OnceCell<Value>,
},
Deferred {
materialized: OnceCell<Value>,
},
}
pub(super) fn build_initial_slot_cache<'a>(
contract: &StructuralRowContract,
) -> Result<Vec<CachedSlotValue<'a>>, InternalError> {
(0..contract.field_count())
.map(|slot| {
Ok(match contract.field_leaf_codec(slot)? {
LeafCodec::Scalar(_) => CachedSlotValue::Scalar {
validated: OnceCell::new(),
materialized: OnceCell::new(),
},
LeafCodec::Structural => CachedSlotValue::Deferred {
materialized: OnceCell::new(),
},
})
})
.collect()
}