1pub mod aggregation;
2
3extern crate serde;
4extern crate serde_json;
5
6#[derive(Debug, Serialize, Deserialize)]
7pub struct SearchResponse<T: Clone> {
8 #[serde(default)]
9 pub _scroll_id: Option<String>,
10 #[serde(default)]
11 pub took: Option<usize>,
12 pub hits: Option<Hits<T>>,
13 #[serde(default)]
14 pub aggregations: Option<Value>,
15}
16
17impl<T: Clone> SearchResponse<T> {
18 pub fn total_value(&self) -> usize {
19 if self.hits.is_none() {
20 return 0;
21 }
22 if self.hits.as_ref().is_none() {
23 return 0;
24 }
25
26 let hits = self.hits.as_ref().unwrap();
27 if hits.total.as_ref().is_none() {
28 return 0;
29 }
30 let total = hits.total.as_ref().unwrap();
31 total.value.unwrap_or_default()
32 }
33 pub fn sources(&self) -> Vec<&T> {
34 if self.hits.is_none() {
35 return vec![];
36 }
37 let hits = self.hits.as_ref().unwrap();
38 if hits.hits.is_none() {
39 return vec![];
40 }
41 let mut data = vec![];
42 let hits = hits.hits.as_ref().unwrap();
43 for hit in hits {
44 if hit._source.is_some() {
45 data.push(hit._source.as_ref().unwrap());
46 }
47 }
48 data
49 }
50 pub fn hits(&self) -> Vec<Hit<T>> {
51 if self.hits.is_none() {
52 return vec![];
53 }
54 let hits = self.hits.clone().unwrap();
55 if hits.hits.is_none() {
56 return vec![];
57 }
58 let mut data = vec![];
59 let hits = hits.hits.unwrap();
60 for hit in hits {
61 data.push(hit.clone());
62 }
63 data
64 }
65 pub fn aggregations(&self) -> Option<AggregationResponseParser> {
66 if self.aggregations.is_none() {
67 return None;
68 }
69 Some(AggregationResponseParser::new(
70 self.aggregations.clone().unwrap(),
71 ))
72 }
73}
74
75#[derive(Debug, Serialize, Deserialize, Clone)]
76pub struct HitsTotal {
77 #[serde(default)]
78 pub value: Option<usize>,
79 #[serde(default)]
80 pub relation: Option<String>,
81}
82
83#[derive(Debug, Serialize, Deserialize, Clone)]
84pub struct Hits<T: Clone> {
85 pub total: Option<HitsTotal>,
86 pub max_score: Option<f32>,
87 pub hits: Option<Vec<Hit<T>>>,
88}
89
90#[derive(Debug, Serialize, Deserialize, Default, Clone)]
108pub struct Hit<T>
109where
110 T: Clone,
111{
112 #[serde(default)]
113 pub _index: Option<String>,
114 #[serde(default)]
115 pub _type: Option<String>,
116 #[serde(default)]
117 pub _id: Option<String>,
118 #[serde(default)]
119 pub _score: Option<f32>,
120 pub _source: Option<T>,
121}
122
123impl<T: std::default::Default + std::clone::Clone> Hit<T> {
124 pub fn index(&self) -> String {
125 if self._index.is_none() {
126 return "".to_string();
127 }
128 self._index.as_ref().unwrap().to_string()
129 }
130
131 pub fn id(&self) -> String {
135 self.clone()._id.unwrap_or_default().to_string()
136 }
137 }
141
142#[derive(Debug, Serialize, Deserialize, Clone)]
143pub struct Doc<T> {
144 pub _index: String,
145 pub _type: String,
146 pub _id: String,
147 pub _source: Option<T>,
152}
153
154#[derive(Debug, Serialize, Deserialize, Clone)]
155pub struct Shards {
156 pub total: Option<usize>,
157 pub successful: Option<usize>,
158 pub failed: Option<usize>,
159}
160
161use crate::aggregation::AggregationResponseParser;
162use serde::{de, Deserialize, Serialize};
163use serde_json::Value;
164
165pub fn parse<'a, T>(s: &'a str) -> T
166where
167 T: de::Deserialize<'a>,
168{
169 serde_json::from_str(s).expect("")
170}
171
172impl<T> SearchResponse<T>
173where
174 T: std::clone::Clone,
175{
176 pub fn to_hit(&self) -> Vec<Hit<T>> {
177 let hits = self.hits.clone();
178 if hits.is_none() {
179 return vec![];
180 }
181 hits.unwrap().hits.unwrap_or_default().to_vec()
182 }
183}