elastic_query_builder/
lib.rs1extern 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
28impl 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}