elastic_query_builder/query/
bool_query.rs

1use serde::ser::SerializeStruct;
2use serde::{Serialize, Serializer};
3use serde_json::{json, Value};
4
5use crate::query::QueryTrait;
6
7#[derive(Default, Debug, Clone)]
8pub struct BoolQuery {
9    must: Vec<Value>,
10    must_not: Vec<Value>,
11    should: Vec<Value>,
12    filter: Vec<Value>,
13}
14
15impl BoolQuery {
16    pub fn new() -> BoolQuery {
17        BoolQuery::default()
18    }
19    pub fn add_must<T>(&mut self, value: T)
20    where
21        T: QueryTrait,
22    {
23        self.must.push(value.build());
24    }
25    pub fn add_must_not<T>(&mut self, value: T)
26    where
27        T: QueryTrait,
28    {
29        self.must_not.push(value.build());
30    }
31    pub fn add_should<T>(&mut self, value: T)
32    where
33        T: QueryTrait,
34    {
35        self.should.push(value.build());
36    }
37    pub fn add_filter<T>(&mut self, value: T)
38    where
39        T: QueryTrait,
40    {
41        self.filter.push(value.build());
42    }
43    pub fn is_empty(&self) -> bool {
44        self.must.is_empty()
45            && self.must_not.is_empty()
46            && self.should.is_empty()
47            && self.filter.is_empty()
48    }
49}
50
51impl Serialize for BoolQuery {
52    fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
53    where
54        S: Serializer,
55    {
56        let mut state = serializer.serialize_struct("BoolQuery", 0)?;
57        if !self.must.is_empty() {
58            let _ = state.serialize_field("must", &self.must);
59        }
60        if !self.must_not.is_empty() {
61            let _ = state.serialize_field("must_not", &self.must_not);
62        }
63        if !self.should.is_empty() {
64            let _ = state.serialize_field("should", &self.should);
65        }
66        if !self.filter.is_empty() {
67            let _ = state.serialize_field("filter", &self.filter);
68        }
69        state.end()
70    }
71}
72
73impl QueryTrait for BoolQuery {
74    fn build(&self) -> Value {
75        let name = self.query_name();
76        json!({ name: self })
77    }
78    fn query_name(&self) -> String {
79        return "bool".to_string();
80    }
81}