(
AuthenticatedUserHeader(actor_id): AuthenticatedUserHeader,
InteractiveHeader(interactive): InteractiveHeader,
store_pool: Extension<Arc<S>>,
temporal_client: Extension<Option<Arc<Te
| 574 | ) |
| 575 | )] |
| 576 | async fn query_entity_subgraph<S>( |
| 577 | AuthenticatedUserHeader(actor_id): AuthenticatedUserHeader, |
| 578 | InteractiveHeader(interactive): InteractiveHeader, |
| 579 | store_pool: Extension<Arc<S>>, |
| 580 | temporal_client: Extension<Option<Arc<TemporalClient>>>, |
| 581 | Extension(api_config): Extension<ApiConfig>, |
| 582 | mut query_logger: Option<Extension<QueryLogger>>, |
| 583 | Json(request): Json<serde_json::Value>, |
| 584 | ) -> Result<Json<QueryEntitySubgraphResponse<'static>>, BoxedResponse> |
| 585 | where |
| 586 | S: StorePool + Send + Sync, |
| 587 | { |
| 588 | if let Some(query_logger) = &mut query_logger { |
| 589 | query_logger.capture(actor_id, OpenApiQuery::GetEntitySubgraph(&request)); |
| 590 | } |
| 591 | |
| 592 | let store = store_pool |
| 593 | .acquire(temporal_client.0) |
| 594 | .await |
| 595 | .map_err(report_to_response)?; |
| 596 | |
| 597 | let request = QueryEntitySubgraphRequest::deserialize(&request) |
| 598 | .map_err(Report::from) |
| 599 | .attach(hash_status::StatusCode::InvalidArgument) |
| 600 | .map_err(report_to_response)?; |
| 601 | let (query, options, traversal) = request.into_parts(); |
| 602 | |
| 603 | // TODO: https://linear.app/hash/issue/H-5351/reuse-parts-between-compilation-units |
| 604 | let mut heap = Heap::uninitialized(); |
| 605 | |
| 606 | if matches!(query, EntityQuery::Query { .. }) { |
| 607 | // The heap is going to be used in the compilation of the query and therefore needs to be |
| 608 | // primed. |
| 609 | // Doing this in a separate step allows us to be allocation free when not using HashQL |
| 610 | // queries. |
| 611 | heap.prime(); |
| 612 | } |
| 613 | |
| 614 | let filter = query.compile(&heap, CompilationOptions { interactive })?; |
| 615 | |
| 616 | let params = options |
| 617 | .into_traversal_params(filter, traversal, api_config) |
| 618 | .attach(hash_status::StatusCode::InvalidArgument) |
| 619 | .map_err(report_to_response)?; |
| 620 | |
| 621 | let response = store |
| 622 | .query_entity_subgraph(actor_id, params) |
| 623 | .await |
| 624 | .map(|response| { |
| 625 | Json(QueryEntitySubgraphResponse { |
| 626 | subgraph: response.subgraph.into(), |
| 627 | cursor: response.cursor.map(EntityQueryCursor::into_owned), |
| 628 | closed_multi_entity_types: response.closed_multi_entity_types, |
| 629 | definitions: response.definitions, |
| 630 | entity_permissions: response.entity_permissions, |
| 631 | }) |
| 632 | }) |
| 633 | .map_err(report_to_response); |
nothing calls this directly
no test coverage detected