diff --git a/crates/analytics/src/opensearch.rs b/crates/analytics/src/opensearch.rs index b8c582df1b..05f89b655c 100644 --- a/crates/analytics/src/opensearch.rs +++ b/crates/analytics/src/opensearch.rs @@ -371,7 +371,7 @@ pub struct OpenSearchQueryBuilder { pub query: String, pub offset: Option, pub count: Option, - pub filters: Vec<(String, String)>, + pub filters: Vec<(String, Vec)>, } impl OpenSearchQueryBuilder { @@ -391,7 +391,7 @@ impl OpenSearchQueryBuilder { Ok(()) } - pub fn add_filter_clause(&mut self, lhs: String, rhs: String) -> QueryResult<()> { + pub fn add_filter_clause(&mut self, lhs: String, rhs: Vec) -> QueryResult<()> { self.filters.push((lhs, rhs)); Ok(()) } @@ -403,7 +403,7 @@ impl OpenSearchQueryBuilder { let mut filters = self .filters .iter() - .map(|(k, v)| json!({"match_phrase" : {k : v}})) + .map(|(k, v)| json!({"terms" : {k : v}})) .collect::>(); query.append(&mut filters); diff --git a/crates/analytics/src/search.rs b/crates/analytics/src/search.rs index 373ca3acbb..1237db061b 100644 --- a/crates/analytics/src/search.rs +++ b/crates/analytics/src/search.rs @@ -20,9 +20,43 @@ pub async fn msearch_results( OpenSearchQueryBuilder::new(OpenSearchQuery::Msearch(indexes.clone()), req.query); query_builder - .add_filter_clause("merchant_id".to_string(), merchant_id.to_string()) + .add_filter_clause( + "merchant_id.keyword".to_string(), + vec![merchant_id.to_string()], + ) .switch()?; + if let Some(filters) = req.filters { + if let Some(currency) = filters.currency { + if !currency.is_empty() { + query_builder + .add_filter_clause("currency.keyword".to_string(), currency.clone()) + .switch()?; + } + }; + if let Some(status) = filters.status { + if !status.is_empty() { + query_builder + .add_filter_clause("status.keyword".to_string(), status.clone()) + .switch()?; + } + }; + if let Some(payment_method) = filters.payment_method { + if !payment_method.is_empty() { + query_builder + .add_filter_clause("payment_method.keyword".to_string(), payment_method.clone()) + .switch()?; + } + }; + if let Some(customer_email) = filters.customer_email { + if !customer_email.is_empty() { + query_builder + .add_filter_clause("customer_email.keyword".to_string(), customer_email.clone()) + .switch()?; + } + }; + }; + let response_text: OpenMsearchOutput = client .execute(query_builder) .await @@ -82,9 +116,42 @@ pub async fn search_results( OpenSearchQueryBuilder::new(OpenSearchQuery::Search(req.index), search_req.query); query_builder - .add_filter_clause("merchant_id".to_string(), merchant_id.to_string()) + .add_filter_clause( + "merchant_id.keyword".to_string(), + vec![merchant_id.to_string()], + ) .switch()?; + if let Some(filters) = search_req.filters { + if let Some(currency) = filters.currency { + if !currency.is_empty() { + query_builder + .add_filter_clause("currency.keyword".to_string(), currency.clone()) + .switch()?; + } + }; + if let Some(status) = filters.status { + if !status.is_empty() { + query_builder + .add_filter_clause("status.keyword".to_string(), status.clone()) + .switch()?; + } + }; + if let Some(payment_method) = filters.payment_method { + if !payment_method.is_empty() { + query_builder + .add_filter_clause("payment_method.keyword".to_string(), payment_method.clone()) + .switch()?; + } + }; + if let Some(customer_email) = filters.customer_email { + if !customer_email.is_empty() { + query_builder + .add_filter_clause("customer_email.keyword".to_string(), customer_email.clone()) + .switch()?; + } + }; + }; query_builder .set_offset_n_count(search_req.offset, search_req.count) .switch()?; diff --git a/crates/api_models/src/analytics/search.rs b/crates/api_models/src/analytics/search.rs index a01349d987..b2af4f6759 100644 --- a/crates/api_models/src/analytics/search.rs +++ b/crates/api_models/src/analytics/search.rs @@ -3,6 +3,9 @@ use serde_json::Value; #[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)] pub struct SearchFilters { pub payment_method: Option>, + pub currency: Option>, + pub status: Option>, + pub customer_email: Option>, } #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]