pub mod aggregation;
extern crate serde;
extern crate serde_json;
#[derive(Debug, Serialize, Deserialize)]
pub struct SearchResponse<T: Clone> {
#[serde(default)]
pub _scroll_id: Option<String>,
#[serde(default)]
pub took: Option<usize>,
pub hits: Option<Hits<T>>,
#[serde(default)]
pub aggregations: Option<Value>,
}
impl<T: Clone> SearchResponse<T> {
pub fn total_value(&self) -> usize {
if self.hits.is_none() {
return 0;
}
if self.hits.as_ref().is_none() {
return 0;
}
let hits = self.hits.as_ref().unwrap();
if hits.total.as_ref().is_none() {
return 0;
}
let total = hits.total.as_ref().unwrap();
total.value.unwrap_or_default()
}
pub fn sources(&self) -> Vec<&T> {
if self.hits.is_none() {
return vec![];
}
let hits = self.hits.as_ref().unwrap();
if hits.hits.is_none() {
return vec![];
}
let mut data = vec![];
let hits = hits.hits.as_ref().unwrap();
for hit in hits {
if hit._source.is_some() {
data.push(hit._source.as_ref().unwrap());
}
}
data
}
pub fn hits(&self) -> Vec<Hit<T>> {
if self.hits.is_none() {
return vec![];
}
let hits = self.hits.clone().unwrap();
if hits.hits.is_none() {
return vec![];
}
let mut data = vec![];
let hits = hits.hits.unwrap();
for hit in hits {
data.push(hit.clone());
}
data
}
pub fn aggregations(&self) -> Option<AggregationResponseParser> {
if self.aggregations.is_none() {
return None;
}
Some(AggregationResponseParser::new(
self.aggregations.clone().unwrap(),
))
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct HitsTotal {
#[serde(default)]
pub value: Option<usize>,
#[serde(default)]
pub relation: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Hits<T: Clone> {
pub total: Option<HitsTotal>,
pub max_score: Option<f32>,
pub hits: Option<Vec<Hit<T>>>,
}
#[derive(Debug, Serialize, Deserialize, Default, Clone)]
pub struct Hit<T>
where
T: Clone,
{
#[serde(default)]
pub _index: Option<String>,
#[serde(default)]
pub _type: Option<String>,
#[serde(default)]
pub _id: Option<String>,
#[serde(default)]
pub _score: Option<f32>,
pub _source: Option<T>,
}
impl<T: std::default::Default + std::clone::Clone> Hit<T> {
pub fn index(&self) -> String {
if self._index.is_none() {
return "".to_string();
}
self._index.as_ref().unwrap().to_string()
}
pub fn id(&self) -> String {
self.clone()._id.unwrap_or_default().to_string()
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Doc<T> {
pub _index: String,
pub _type: String,
pub _id: String,
pub _source: Option<T>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Shards {
pub total: Option<usize>,
pub successful: Option<usize>,
pub failed: Option<usize>,
}
use crate::aggregation::AggregationResponseParser;
use serde::{de, Deserialize, Serialize};
use serde_json::Value;
pub fn parse<'a, T>(s: &'a str) -> T
where
T: de::Deserialize<'a>,
{
serde_json::from_str(s).expect("")
}
impl<T> SearchResponse<T>
where
T: std::clone::Clone,
{
pub fn to_hit(&self) -> Vec<Hit<T>> {
let hits = self.hits.clone();
if hits.is_none() {
return vec![];
}
hits.unwrap().hits.unwrap_or_default().to_vec()
}
}