use crate::{search::*, util::*};
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
#[serde(remote = "Self")]
pub struct SimpleQueryStringQuery {
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
query: Text,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
fields: Vec<String>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
default_operator: Option<Operator>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
analyze_wildcard: Option<bool>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
analyzer: Option<String>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
auto_generate_synonyms_phrase_query: Option<bool>,
#[serde(
default,
skip_serializing_if = "ShouldSkip::should_skip",
serialize_with = "join_with_pipe"
)]
flags: Vec<SimpleQueryStringQueryFlags>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
fuzzy_max_expansions: Option<u32>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
fuzzy_prefix_length: Option<u32>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
fuzzy_transpositions: Option<bool>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
lenient: Option<bool>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
minimum_should_match: Option<String>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
quote_field_suffix: Option<String>,
#[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 simple_query_string<S>(query: S) -> SimpleQueryStringQuery
where
S: Into<Text>,
{
SimpleQueryStringQuery {
query: query.into(),
fields: vec![],
default_operator: None,
analyze_wildcard: None,
analyzer: None,
auto_generate_synonyms_phrase_query: None,
fuzzy_transpositions: None,
fuzzy_max_expansions: None,
flags: vec![],
fuzzy_prefix_length: None,
quote_field_suffix: None,
lenient: None,
minimum_should_match: None,
boost: None,
_name: None,
}
}
}
impl SimpleQueryStringQuery {
add_boost_and_name!();
pub fn fields<I>(mut self, fields: I) -> Self
where
I: IntoIterator,
I::Item: ToString,
{
self.fields = fields.into_iter().map(|x| x.to_string()).collect();
self
}
pub fn default_operator(mut self, default_operator: Operator) -> Self {
self.default_operator = Some(default_operator);
self
}
pub fn analyze_wildcard(mut self, analyze_wildcard: bool) -> Self {
self.analyze_wildcard = Some(analyze_wildcard);
self
}
pub fn analyzer<T>(mut self, analyzer: T) -> Self
where
T: ToString,
{
self.analyzer = Some(analyzer.to_string());
self
}
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 flags<I>(mut self, flags: I) -> Self
where
I: IntoIterator<Item = SimpleQueryStringQueryFlags>,
{
self.flags.extend(flags);
self
}
pub fn fuzzy_max_expansions(mut self, fuzzy_max_expansions: u32) -> Self {
self.fuzzy_max_expansions = Some(fuzzy_max_expansions);
self
}
pub fn fuzzy_prefix_length(mut self, fuzzy_prefix_length: u32) -> Self {
self.fuzzy_prefix_length = Some(fuzzy_prefix_length);
self
}
pub fn fuzzy_transpositions(mut self, fuzzy_transpositions: bool) -> Self {
self.fuzzy_transpositions = Some(fuzzy_transpositions);
self
}
pub fn lenient(mut self, lenient: bool) -> Self {
self.lenient = Some(lenient);
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 quote_field_suffix<S>(mut self, quote_field_suffix: S) -> Self
where
S: ToString,
{
self.quote_field_suffix = Some(quote_field_suffix.to_string());
self
}
}
impl ShouldSkip for SimpleQueryStringQuery {
fn should_skip(&self) -> bool {
self.query.should_skip()
}
}
serialize_with_root!("simple_query_string": SimpleQueryStringQuery);
deserialize_with_root!("simple_query_string": SimpleQueryStringQuery);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serialization() {
assert_serialize_query(
Query::simple_query_string("search text"),
json!({
"simple_query_string": {
"query": "search text",
}
}),
);
assert_serialize_query(
Query::simple_query_string("search text")
.fields(["database"])
.default_operator(Operator::And)
.analyze_wildcard(true)
.analyzer("search_time_analyzer")
.auto_generate_synonyms_phrase_query(true)
.flags([
SimpleQueryStringQueryFlags::And,
SimpleQueryStringQueryFlags::Escape,
])
.fuzzy_max_expansions(20)
.fuzzy_prefix_length(3)
.fuzzy_transpositions(false)
.lenient(true)
.minimum_should_match("22")
.quote_field_suffix("s")
.boost(2)
.name("test"),
json!({
"simple_query_string": {
"query": "search text",
"fields": ["database"],
"default_operator": "AND",
"analyze_wildcard": true,
"analyzer": "search_time_analyzer",
"auto_generate_synonyms_phrase_query": true,
"flags": "AND|ESCAPE",
"fuzzy_max_expansions": 20,
"fuzzy_prefix_length": 3,
"fuzzy_transpositions": false,
"lenient": true,
"minimum_should_match": "22",
"quote_field_suffix": "s",
"boost": 2.0,
"_name": "test",
}
}),
);
}
}