Skip to main content

haste_fhir_search/pg_search/
search_parameter_resolver.rs

1use haste_fhir_client::request::SearchRequest;
2use haste_fhir_operation_error::OperationOutcomeError;
3use haste_jwt::{ProjectId, TenantId};
4use sqlx::{Pool, Postgres};
5
6use super::{R4_SCHEMA_REGISTRY, search};
7use crate::{
8    SearchOptions, SearchReturn,
9    memory::R4_SEARCH_PARAMETERS_INDEX,
10    project_parameters::{IndexSearch, ProjectParameterResolver},
11};
12
13/// Resolves the base parameters plus each project's own, found in the
14/// Postgres search index.
15pub type PgSearchParameterResolver<Repo> = ProjectParameterResolver<PgIndexSearch, Repo>;
16
17/// The Postgres search index, searched with the base parameters.
18#[derive(Clone)]
19pub struct PgIndexSearch {
20    pool: Pool<Postgres>,
21}
22
23impl PgIndexSearch {
24    #[must_use]
25    pub fn new(pool: Pool<Postgres>) -> Self {
26        PgIndexSearch { pool }
27    }
28}
29
30impl IndexSearch for PgIndexSearch {
31    async fn search(
32        &self,
33        tenant: &TenantId,
34        project: &ProjectId,
35        request: &SearchRequest,
36        options: &SearchOptions,
37    ) -> Result<SearchReturn, OperationOutcomeError> {
38        search::execute_search(
39            &self.pool,
40            R4_SEARCH_PARAMETERS_INDEX.clone(),
41            &R4_SCHEMA_REGISTRY,
42            tenant,
43            project,
44            request,
45            Some(options),
46        )
47        .await
48    }
49}