elastic_parser/aggregation/
mod.rs1use crate::Hits;
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5#[derive(Debug, Default, Clone, Serialize, Deserialize)]
6pub struct AggregationResponseParser {
7 value: Value,
8}
9
10impl AggregationResponseParser {
11 pub fn new(value: Value) -> AggregationResponseParser {
12 AggregationResponseParser { value }
13 }
14 pub fn value(&self) -> Value {
15 self.value.clone()
16 }
17 pub fn doc_count(&self) -> Option<u64> {
18 parse_u32(self.value.get("doc_count"))
19 }
20 pub fn sum_other_doc_count(&self) -> Option<u64> {
21 parse_u32(self.value.get("sum_other_doc_count"))
22 }
23 pub fn sub_aggregation<T: Into<String>>(&self, key: T) -> Option<AggregationResponseParser> {
24 let agg = self.value.get(key.into())?.clone();
25 Some(AggregationResponseParser::new(agg))
26 }
27 pub fn buckets(&self) -> Option<Vec<AggregationResponseBucket>> {
28 let values = self.value.get("buckets")?.clone();
29 let values = values.as_array()?.clone();
30 let mut response = vec![];
31 for value in values {
32 response.push(AggregationResponseBucket::new(value))
33 }
34 Some(response)
35 }
36}
37
38#[derive(Debug, Default, Clone)]
39pub struct AggregationResponseBucket {
40 value: Value,
41}
42
43impl AggregationResponseBucket {
44 pub fn new(value: Value) -> AggregationResponseBucket {
45 AggregationResponseBucket { value }
46 }
47 pub fn value(&self) -> Value {
48 self.value.clone()
49 }
50 pub fn hits(&self) -> Option<Hits<Value>> {
51 let values = self.value.get("hits")?;
52 let hits = serde_json::from_value::<Hits<Value>>(values.clone());
53 if hits.is_err() {
54 return None;
55 }
56 return Some(hits.unwrap());
57 }
58 pub fn key(&self) -> Option<String> {
59 let key_as_string = self.value.get("key_as_string");
60 if key_as_string.is_some() {
61 let key_as_string = key_as_string.unwrap();
62 if key_as_string.is_string() {
63 return Some(key_as_string.as_str().unwrap().to_string());
64 }
65 }
66 let key = self.value.get("key");
67 if key.is_some() {
68 let key = key.unwrap();
69 if key.is_string() {
70 return Some(key.as_str().unwrap().to_string());
71 }
72 if key.is_number() {
73 return Some(key.as_str().unwrap().to_string());
74 }
75 }
76 return None;
77 }
78 pub fn keys(&self) -> Option<Vec<String>> {
79 let key = self.value.get("key");
80 if !key.is_some() {
81 return None;
82 }
83 let key = key.unwrap();
84 if key.is_string() || key.is_number() {
85 return Some(vec![key.to_string()]);
86 }
87 if key.is_array() {
88 let keys = key.as_array().unwrap();
89 let mut response = vec![];
90 for key in keys {
91 if key.is_string() || key.is_number() {
92 response.push(key.to_string());
93 }
94 }
95 return Some(response);
96 }
97 return None;
98 }
99 pub fn doc_count(&self) -> Option<u64> {
100 parse_u32(self.value.get("doc_count"))
101 }
102
103 pub fn sub_aggregation<T: Into<String>>(&self, key: T) -> Option<AggregationResponseParser> {
104 let agg = self.value.get(key.into())?.clone();
105 Some(AggregationResponseParser::new(agg))
106 }
107}
108
109fn parse_u32(value: Option<&Value>) -> Option<u64> {
110 if value.is_none() {
111 return None;
112 }
113 let value = value.unwrap();
114 if value.is_u64() {
115 return Some(value.as_u64().unwrap());
116 }
117 return None;
118}
119
120