(
AuthenticatedUserHeader(actor_id): AuthenticatedUserHeader,
InteractiveHeader(interactive): InteractiveHeader,
store_pool: Extension<Arc<S>>,
temporal_client: Extension<Option<Arc<Te
| 431 | ) |
| 432 | )] |
| 433 | async fn query_entities<S>( |
| 434 | AuthenticatedUserHeader(actor_id): AuthenticatedUserHeader, |
| 435 | InteractiveHeader(interactive): InteractiveHeader, |
| 436 | store_pool: Extension<Arc<S>>, |
| 437 | temporal_client: Extension<Option<Arc<TemporalClient>>>, |
| 438 | Extension(api_config): Extension<ApiConfig>, |
| 439 | mut query_logger: Option<Extension<QueryLogger>>, |
| 440 | Json(request): Json<Box<RawJsonvalue>>, |
| 441 | ) -> Result<Json<QueryEntitiesResponse<'static>>, BoxedResponse> |
| 442 | where |
| 443 | S: StorePool + Send + Sync, |
| 444 | { |
| 445 | if let Some(query_logger) = &mut query_logger { |
| 446 | query_logger.capture(actor_id, OpenApiQuery::GetEntities(&request)); |
| 447 | } |
| 448 | |
| 449 | let store = store_pool |
| 450 | .acquire(temporal_client.0) |
| 451 | .await |
| 452 | .map_err(report_to_response)?; |
| 453 | |
| 454 | let request = QueryEntitiesRequest::deserialize(&*request) |
| 455 | .map_err(Report::from) |
| 456 | .attach(hash_status::StatusCode::InvalidArgument) |
| 457 | .map_err(report_to_response)?; |
| 458 | |
| 459 | let (query, options) = request.into_parts(); |
| 460 | |
| 461 | // TODO: https://linear.app/hash/issue/H-5351/reuse-parts-between-compilation-units |
| 462 | let mut heap = Heap::uninitialized(); |
| 463 | |
| 464 | if matches!(query, EntityQuery::Query { .. }) { |
| 465 | // The heap is going to be used in the compilation of the query and therefore needs to be |
| 466 | // primed. |
| 467 | // Doing this in a separate step allows us to be allocation free when not using HashQL |
| 468 | // queries. |
| 469 | heap.prime(); |
| 470 | } |
| 471 | |
| 472 | let filter = query.compile(&heap, CompilationOptions { interactive })?; |
| 473 | |
| 474 | let params = options |
| 475 | .into_params(filter, api_config) |
| 476 | .attach(hash_status::StatusCode::InvalidArgument) |
| 477 | .map_err(report_to_response)?; |
| 478 | |
| 479 | let response = store |
| 480 | .query_entities(actor_id, params) |
| 481 | .await |
| 482 | .map(Json) |
| 483 | .map_err(report_to_response); |
| 484 | |
| 485 | if let Some(query_logger) = &mut query_logger { |
| 486 | query_logger.send().await.map_err(report_to_response)?; |
| 487 | } |
| 488 | response |
| 489 | } |
| 490 |
nothing calls this directly
no test coverage detected