use serde_json::{Value, json};
use crate::types::SearchParameter;
pub fn build_clause(param: &SearchParameter, value: &str) -> Option<Value> {
let name = ¶m.name;
let component_values: Vec<&str> = value.split('$').collect();
if component_values.is_empty() {
return None;
}
let must_conditions = vec![json!({ "term": { "search_params.composite.name": name } })];
Some(json!({
"nested": {
"path": "search_params.composite",
"query": {
"bool": {
"must": must_conditions
}
}
}
}))
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::{SearchParamType, SearchValue};
#[test]
fn test_composite_clause() {
let param = SearchParameter {
name: "code-value-quantity".to_string(),
param_type: SearchParamType::Composite,
modifier: None,
values: vec![SearchValue::eq("8867-4$120")],
chain: vec![],
components: vec![],
};
let clause = build_clause(¶m, "8867-4$120");
assert!(clause.is_some());
}
}