use re_arrow_store::LatestAtQuery;
use re_log_types::{
DataRow, DeserializableComponent, EntityPath, RowId, SerializableComponent, TimePoint, Timeline,
};
use crate::LogDb;
pub fn query_latest_single<C: DeserializableComponent>(
data_store: &re_arrow_store::DataStore,
entity_path: &EntityPath,
query: &LatestAtQuery,
) -> Option<C>
where
for<'b> &'b C::ArrayType: IntoIterator,
{
crate::profile_function!();
let (_, cells) = data_store.latest_at(query, entity_path, C::name(), &[C::name()])?;
let cell = cells.get(0)?.as_ref()?;
let mut iter = cell.try_to_native::<C>().ok()?;
let component = iter.next();
if iter.next().is_some() {
re_log::warn_once!("Unexpected batch for {} at: {}", C::name(), entity_path);
}
component
}
pub fn query_timeless_single<C: DeserializableComponent>(
data_store: &re_arrow_store::DataStore,
entity_path: &EntityPath,
) -> Option<C>
where
for<'b> &'b C::ArrayType: IntoIterator,
{
let query = re_arrow_store::LatestAtQuery::latest(Timeline::default());
query_latest_single(data_store, entity_path, &query)
}
pub fn store_one_component<C: SerializableComponent>(
log_db: &mut LogDb,
entity_path: &EntityPath,
timepoint: &TimePoint,
component: C,
) {
let mut row = DataRow::from_cells1(
RowId::random(),
entity_path.clone(),
timepoint.clone(),
1,
[component].as_slice(),
);
row.compute_all_size_bytes();
match log_db.entity_db.try_add_data_row(&row) {
Ok(()) => {}
Err(err) => {
re_log::warn_once!(
"Failed to store component {}.{}: {err}",
entity_path,
C::name(),
);
}
}
}