engine_input_producers/
query_plan.rs1use crate::{EngineInputV2, QueryPlanSummaryV0};
2
3pub fn summarize_query_plan_input(input: &EngineInputV2) -> QueryPlanSummaryV0 {
4 let expression_ids: Vec<String> = input
5 .sources
6 .iter()
7 .flat_map(|source| source.document.class_expressions.iter())
8 .map(|expression| expression.id.clone())
9 .collect();
10 let selector_usage_ids: Vec<String> = input
11 .styles
12 .iter()
13 .flat_map(|style| style.document.selectors.iter())
14 .filter(|selector| selector.view_kind == "canonical")
15 .filter_map(|selector| selector.canonical_name.as_ref())
16 .cloned()
17 .collect();
18
19 QueryPlanSummaryV0 {
20 schema_version: "0",
21 input_version: input.version.clone(),
22 total_query_count: expression_ids.len() * 2 + selector_usage_ids.len(),
23 expression_semantics_ids: expression_ids.clone(),
24 source_expression_resolution_ids: expression_ids,
25 selector_usage_ids,
26 }
27}
28
29#[cfg(test)]
30mod tests {
31 use super::summarize_query_plan_input;
32 use crate::test_support::sample_input;
33
34 #[test]
35 fn summarizes_expected_query_plan() {
36 let summary = summarize_query_plan_input(&sample_input());
37
38 assert_eq!(
39 summary.expression_semantics_ids,
40 vec!["expr-1".to_string(), "expr-2".to_string()]
41 );
42 assert_eq!(
43 summary.source_expression_resolution_ids,
44 vec!["expr-1".to_string(), "expr-2".to_string()]
45 );
46 assert_eq!(
47 summary.selector_usage_ids,
48 vec!["btn-active".to_string(), "card-header".to_string()]
49 );
50 assert_eq!(summary.total_query_count, 6);
51 }
52}