elastic_query_builder/query/
bool_query.rs1use 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}