elastic_query_builder/
lib.rs

1extern crate core;
2
3use crate::aggregation::AggregationTrait;
4use crate::query::QueryTrait;
5use serde::ser::SerializeStruct;
6use serde::{Serialize, Serializer};
7use serde_json::{json, Value};
8
9pub mod aggregation;
10pub mod mapping;
11pub mod query;
12pub(crate) mod util;
13
14extern crate serde_json;
15
16#[derive(Default, Clone)]
17pub struct QueryBuilder {
18    query: Value,
19    aggs: Value,
20    size: i64,
21    from: i64,
22    scroll: String,
23    sort: Value,
24    source: Vec<String>,
25    script: Value,
26}
27
28/// # example
29///
30/// ```
31/// use elastic_query_builder::query::bool_query::BoolQuery;
32/// use elastic_query_builder::query::match_query::MatchQuery;
33/// use elastic_query_builder::QueryBuilder;
34/// use serde_json::{Value};
35/// let mut query = QueryBuilder::new();
36/// let mut bool = BoolQuery::new();
37/// bool.add_must(MatchQuery::new("field","value"));
38/// bool.add_must(MatchQuery::new("field2","value2"));
39/// query.set_query(bool);
40/// let value:Value = query.build();
41/// ```
42impl QueryBuilder {
43    pub fn new() -> QueryBuilder {
44        let mut val = QueryBuilder::default();
45        val.size = 10;
46        val.from = 0;
47        return val;
48    }
49    pub fn set_query<T>(&mut self, query: T) -> &QueryBuilder
50    where
51        T: QueryTrait,
52    {
53        self.query = query.build();
54        return self;
55    }
56    pub fn set_query_from_value(&mut self, query: Value) -> &QueryBuilder {
57        self.query = query;
58        return self;
59    }
60    pub fn set_aggregation<T>(&mut self, query: Vec<T>) -> &QueryBuilder
61    where
62        T: AggregationTrait,
63    {
64        let mut values = Value::default();
65
66        for q in query {
67            merge(&mut values, &q.build());
68        }
69        self.aggs = json!(values);
70        return self;
71    }
72
73    pub fn append_aggregation<T>(&mut self, query: T) -> &QueryBuilder
74    where
75        T: AggregationTrait,
76    {
77        let values = self.aggs.clone();
78
79        let mut values = serde_json::from_value::<Value>(values).unwrap();
80        merge(&mut values, &query.build());
81
82        self.aggs = json!(values);
83        return self;
84    }
85
86    pub fn set_size(&mut self, size: i64) -> &QueryBuilder {
87        self.size = size;
88        return self;
89    }
90    pub fn set_from(&mut self, from: i64) -> &QueryBuilder {
91        self.from = from;
92        return self;
93    }
94    pub fn set_scroll(&mut self, value: &str) -> &QueryBuilder {
95        self.scroll = value.to_string();
96        return self;
97    }
98    pub fn set_sort(&mut self, value: Value) -> &QueryBuilder {
99        self.sort = value;
100        return self;
101    }
102    pub fn set_source(&mut self, value: Vec<String>) -> &QueryBuilder {
103        self.source = value;
104        return self;
105    }
106    pub fn set_script(&mut self, value: Value) -> &QueryBuilder {
107        self.script = value;
108        return self;
109    }
110
111    pub fn get_size(&self) -> i64 {
112        self.size.clone()
113    }
114    pub fn get_scroll(&self) -> &str {
115        self.scroll.as_str()
116    }
117
118    pub fn get_from(&self) -> i64 {
119        self.from.clone()
120    }
121    pub fn get_sort(&self) -> &Value {
122        &self.sort
123    }
124    pub fn get_script(&self) -> &Value {
125        &self.script
126    }
127
128    pub fn build(&self) -> Value {
129        json!(self)
130    }
131}
132
133impl Serialize for QueryBuilder {
134    fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
135    where
136        S: Serializer,
137    {
138        let mut state = serializer.serialize_struct("QueryBuilder", 0)?;
139        if !self.source.is_empty() {
140            let _ = state.serialize_field("_source", &self.source);
141        }
142        if self.query.is_null() || self.query.to_string().is_empty() {
143            let _ = state.serialize_field("query", &json!({"match_all":{}}));
144        } else {
145            let _ = state.serialize_field("query", &self.query);
146        }
147        if !(self.aggs.is_null() || self.query.to_string().is_empty()) {
148            let _ = state.serialize_field("aggs", &self.aggs);
149        }
150        if !(self.script.is_null() || self.script.to_string().is_empty()) {
151            let _ = state.serialize_field("script", &self.script);
152        }
153        if !(self.sort.is_null() || self.sort.to_string().is_empty()) {
154            let _ = state.serialize_field("sort", &self.sort);
155        }
156        state.end()
157    }
158}
159
160pub(crate) fn merge(a: &mut Value, b: &Value) {
161    match (a, b) {
162        (&mut Value::Object(ref mut a), &Value::Object(ref b)) => {
163            for (k, v) in b {
164                merge(a.entry(k.clone()).or_insert(Value::Null), v);
165            }
166        }
167        (a, b) => {
168            *a = b.clone();
169        }
170    }
171}