#[global_allocator]
pub(crate) static ALLOC: dhat::Alloc = dhat::Alloc;
#[test]
fn valid_query_plan() {
const SCHEMA: &str = "../examples/graphql/supergraph.graphql";
const OPERATION: &str = "query fetchUser {
me {
id
name
username
reviews {
...reviews
}
}
recommendedProducts {
...products
}
topProducts {
...products
}
}
fragment products on Product {
upc
weight
price
shippingEstimate
reviews {
...reviews
}
}
fragment reviews on Review {
id
author {
id
name
}
}
";
const MAX_BYTES_QUERY_PLANNER: usize = 843_974;
const MAX_ALLOCATIONS_QUERY_PLANNER: u64 = 18_168;
const MAX_BYTES_QUERY_PLAN: usize = 975_369;
const MAX_ALLOCATIONS_QUERY_PLAN: u64 = 25_787;
let schema = std::fs::read_to_string(SCHEMA).unwrap();
let _profiler = dhat::Profiler::builder().testing().build();
let supergraph =
apollo_federation::Supergraph::new(&schema).expect("supergraph should be valid");
let api_options = apollo_federation::ApiSchemaOptions::default();
let api_schema = supergraph
.to_api_schema(api_options)
.expect("api schema should be valid");
let qp_config = apollo_federation::query_plan::query_planner::QueryPlannerConfig::default();
let planner =
apollo_federation::query_plan::query_planner::QueryPlanner::new(&supergraph, qp_config)
.expect("query planner should be created");
let stats = dhat::HeapStats::get();
println!("QueryPlanner::new: {stats:?}");
dhat::assert!(stats.max_bytes < MAX_BYTES_QUERY_PLANNER);
dhat::assert!(stats.total_blocks < MAX_ALLOCATIONS_QUERY_PLANNER);
let document = apollo_compiler::ExecutableDocument::parse_and_validate(
api_schema.schema(),
OPERATION,
"operation.graphql",
)
.expect("operation should be valid");
let qp_options = apollo_federation::query_plan::query_planner::QueryPlanOptions::default();
planner
.build_query_plan(&document, None, qp_options)
.expect("valid query plan");
let stats = dhat::HeapStats::get();
println!("QueryPlanner::build_query_plan: {stats:?}");
dhat::assert!(stats.max_bytes < MAX_BYTES_QUERY_PLAN);
dhat::assert!(stats.total_blocks < MAX_ALLOCATIONS_QUERY_PLAN);
}