use crate::{search::*, util::*};
#[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)]
#[serde(remote = "Self")]
pub struct CombinedFieldsQuery {
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
fields: Vec<String>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
query: Text,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
auto_generate_synonyms_phrase_query: Option<bool>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
operator: Option<Operator>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
minimum_should_match: Option<String>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
zero_terms_query: Option<ZeroTermsQuery>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
boost: Option<f32>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
_name: Option<String>,
}
impl Query {
pub fn combined_fields<F, S>(fields: F, query: S) -> CombinedFieldsQuery
where
F: IntoIterator,
F::Item: ToString,
S: Into<Text>,
{
CombinedFieldsQuery {
fields: fields.into_iter().map(|s| s.to_string()).collect(),
query: query.into(),
auto_generate_synonyms_phrase_query: None,
operator: None,
minimum_should_match: None,
zero_terms_query: None,
boost: None,
_name: None,
}
}
}
impl CombinedFieldsQuery {
add_boost_and_name!();
pub fn auto_generate_synonyms_phrase_query(
mut self,
auto_generate_synonyms_phrase_query: bool,
) -> Self {
self.auto_generate_synonyms_phrase_query = Some(auto_generate_synonyms_phrase_query);
self
}
pub fn operator(mut self, operator: Operator) -> Self {
self.operator = Some(operator);
self
}
pub fn minimum_should_match<T>(mut self, minimum_should_match: T) -> Self
where
T: ToString,
{
self.minimum_should_match = Some(minimum_should_match.to_string());
self
}
pub fn zero_terms_query(mut self, zero_terms_query: ZeroTermsQuery) -> Self {
self.zero_terms_query = Some(zero_terms_query);
self
}
}
impl ShouldSkip for CombinedFieldsQuery {
fn should_skip(&self) -> bool {
self.fields.should_skip() || self.query.should_skip()
}
}
serialize_with_root!("combined_fields": CombinedFieldsQuery);
deserialize_with_root!("combined_fields": CombinedFieldsQuery);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serialization() {
assert_serialize_query(
Query::combined_fields(["test"], "search text"),
json!({
"combined_fields": {
"query": "search text",
"fields": ["test"],
}
}),
);
assert_serialize_query(
Query::combined_fields(["test"], "search text")
.auto_generate_synonyms_phrase_query(true)
.operator(Operator::And)
.minimum_should_match("22")
.zero_terms_query(ZeroTermsQuery::None)
.boost(2)
.name("test"),
json!({
"combined_fields": {
"query": "search text",
"fields": ["test"],
"auto_generate_synonyms_phrase_query": true,
"operator": "AND",
"minimum_should_match": "22",
"zero_terms_query": "none",
"boost": 2.0,
"_name": "test",
}
}),
);
}
}