mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 10:06:32 +08:00 
			
		
		
		
	feat(globalsearch): Implement tag-based filters in global search (#5151)
This commit is contained in:
		| @ -371,7 +371,7 @@ pub struct OpenSearchQueryBuilder { | |||||||
|     pub query: String, |     pub query: String, | ||||||
|     pub offset: Option<i64>, |     pub offset: Option<i64>, | ||||||
|     pub count: Option<i64>, |     pub count: Option<i64>, | ||||||
|     pub filters: Vec<(String, String)>, |     pub filters: Vec<(String, Vec<String>)>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl OpenSearchQueryBuilder { | impl OpenSearchQueryBuilder { | ||||||
| @ -391,7 +391,7 @@ impl OpenSearchQueryBuilder { | |||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn add_filter_clause(&mut self, lhs: String, rhs: String) -> QueryResult<()> { |     pub fn add_filter_clause(&mut self, lhs: String, rhs: Vec<String>) -> QueryResult<()> { | ||||||
|         self.filters.push((lhs, rhs)); |         self.filters.push((lhs, rhs)); | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
| @ -403,7 +403,7 @@ impl OpenSearchQueryBuilder { | |||||||
|         let mut filters = self |         let mut filters = self | ||||||
|             .filters |             .filters | ||||||
|             .iter() |             .iter() | ||||||
|             .map(|(k, v)| json!({"match_phrase" : {k : v}})) |             .map(|(k, v)| json!({"terms" : {k : v}})) | ||||||
|             .collect::<Vec<Value>>(); |             .collect::<Vec<Value>>(); | ||||||
|  |  | ||||||
|         query.append(&mut filters); |         query.append(&mut filters); | ||||||
|  | |||||||
| @ -20,9 +20,43 @@ pub async fn msearch_results( | |||||||
|         OpenSearchQueryBuilder::new(OpenSearchQuery::Msearch(indexes.clone()), req.query); |         OpenSearchQueryBuilder::new(OpenSearchQuery::Msearch(indexes.clone()), req.query); | ||||||
|  |  | ||||||
|     query_builder |     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()?; |         .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 |     let response_text: OpenMsearchOutput = client | ||||||
|         .execute(query_builder) |         .execute(query_builder) | ||||||
|         .await |         .await | ||||||
| @ -82,9 +116,42 @@ pub async fn search_results( | |||||||
|         OpenSearchQueryBuilder::new(OpenSearchQuery::Search(req.index), search_req.query); |         OpenSearchQueryBuilder::new(OpenSearchQuery::Search(req.index), search_req.query); | ||||||
|  |  | ||||||
|     query_builder |     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()?; |         .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 |     query_builder | ||||||
|         .set_offset_n_count(search_req.offset, search_req.count) |         .set_offset_n_count(search_req.offset, search_req.count) | ||||||
|         .switch()?; |         .switch()?; | ||||||
|  | |||||||
| @ -3,6 +3,9 @@ use serde_json::Value; | |||||||
| #[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)] | #[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)] | ||||||
| pub struct SearchFilters { | pub struct SearchFilters { | ||||||
|     pub payment_method: Option<Vec<String>>, |     pub payment_method: Option<Vec<String>>, | ||||||
|  |     pub currency: Option<Vec<String>>, | ||||||
|  |     pub status: Option<Vec<String>>, | ||||||
|  |     pub customer_email: Option<Vec<String>>, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] | #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Sandeep Kumar
					Sandeep Kumar