use crate::{search::*, util::*};
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct TopHitsAggregation {
top_hits: TopHitsAggregationInner,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
struct TopHitsAggregationInner {
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
_source: Option<SourceFilter>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
from: Option<u64>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
size: Option<u64>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
sort: SortCollection,
}
impl Aggregation {
pub fn top_hits() -> TopHitsAggregation {
TopHitsAggregation {
top_hits: TopHitsAggregationInner {
_source: None,
from: None,
size: None,
sort: Default::default(),
},
}
}
}
impl TopHitsAggregation {
pub fn source<T>(mut self, source: T) -> Self
where
T: Into<SourceFilter>,
{
self.top_hits._source = Some(source.into());
self
}
pub fn from(mut self, from: u64) -> Self {
self.top_hits.from = Some(from);
self
}
pub fn size(mut self, size: u64) -> Self {
self.top_hits.size = Some(size);
self
}
pub fn sort<T>(mut self, sort: T) -> Self
where
T: IntoIterator,
T::Item: Into<Sort>,
{
self.top_hits.sort.extend(sort);
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serialization() {
assert_serialize_aggregation(Aggregation::top_hits(), json!({ "top_hits": { } }));
assert_serialize_aggregation(
Aggregation::top_hits()
.source(false)
.from(2)
.size(10)
.sort(FieldSort::new("sort_field").order(SortOrder::Desc)),
json!({
"top_hits": {
"_source": false,
"from": 2,
"size": 10,
"sort": [
{ "sort_field": { "order": "desc" } }
]
}
}),
);
}
}