use std::sync::Arc;
use hyphae::SwitchMapExt;
use crate::prelude::*;
#[myko_item]
pub struct BenchItem {
pub name: String,
pub category: String,
pub value: i64,
}
#[myko_query(BenchItem)]
pub struct GetBenchItemsByCategory {
pub category: String,
}
impl QueryHandler for GetBenchItemsByCategory {
fn test_entity(ctx: QueryTestCtx<Self>) -> bool {
ctx.item.category == ctx.query.category.as_str()
}
}
#[myko_report(Vec<String>)]
pub struct SwitchMapReport {
pub category: String,
}
impl ReportHandler for SwitchMapReport {
type Output = Vec<String>;
fn compute(&self, ctx: ReportContext) -> impl MaterializeDefinite<Arc<Self::Output>> {
let category = self.category.clone();
let items = ctx
.query_map(GetBenchItemsByQuery(PartialBenchItem {
category: Some(category),
..Default::default()
}))
.items();
items.switch_map(move |items| {
if items.is_empty() {
return Cell::new(Arc::new(Vec::<String>::new())).lock();
}
let ids: Vec<BenchItemId> = items.iter().map(|item| item.id.clone()).collect();
ctx.query_map(GetBenchItemsByIds { ids })
.items()
.map(|items| {
Arc::new(
items
.iter()
.map(|item| item.name.clone())
.collect::<Vec<_>>(),
)
})
.materialize()
})
}
}