use serde::{Deserialize, Serialize};
use crate::search::Script;
#[cfg(feature = "graphql")]
use crate::search::ScriptInput;
#[cfg(feature = "graphql")]
#[cfg_attr(feature = "builder", derive(typed_builder::TypedBuilder))]
#[derive(async_graphql::InputObject, Serialize, Clone, Debug)]
#[cfg_attr(feature = "builder", builder(field_defaults(setter(into))))]
pub struct TermsAggregationInput {
pub field: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub script: Option<ScriptInput>,
#[graphql(default_with = "Some(1_000)")]
#[cfg_attr(feature = "builder", builder(default))]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub size: Option<u64>,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub missing: Option<f64>,
}
#[cfg_attr(test, derive(PartialEq))]
#[cfg_attr(feature = "graphql", derive(async_graphql::SimpleObject))]
#[cfg_attr(feature = "builder", derive(typed_builder::TypedBuilder))]
#[derive(Serialize, Deserialize, Clone, Debug)]
#[cfg_attr(feature = "builder", builder(field_defaults(setter(into))))]
pub struct TermsAggregation {
pub field: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub script: Option<Script>,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub size: Option<u64>,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub missing: Option<f64>,
}
#[cfg(feature = "graphql")]
impl From<TermsAggregationInput> for TermsAggregation {
#[inline]
fn from(aggregation: TermsAggregationInput) -> Self {
TermsAggregation {
field: aggregation.field,
script: aggregation.script.map(Into::into),
size: aggregation.size,
missing: aggregation.missing,
}
}
}
#[cfg(test)]
impl<T: Into<String>> From<T> for TermsAggregation {
#[inline]
fn from(field: T) -> TermsAggregation {
TermsAggregation {
field: Some(field.into()),
size: None,
script: None,
missing: None,
}
}
}