mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-29 00:49:42 +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