elastic_query_builder/aggregation/
cardinality_aggregation.rs1use crate::aggregation::AggregationTrait;
2use serde::ser::SerializeStruct;
3use serde::{Serialize, Serializer};
4use serde_json::{json, Value};
5
6#[derive(Default)]
7pub struct CardinalityAggregation {
8 name: String,
9 value: CardinalityValue,
10}
11
12#[derive(Default)]
13struct CardinalityValue {
14 field: String,
15}
16
17impl CardinalityAggregation {
18 pub fn new(name: &str) -> Self {
19 CardinalityAggregation {
20 name: name.to_string(),
21 ..Default::default()
22 }
23 }
24
25 pub fn set_field(mut self, field: &str) -> Self {
26 self.value.field = field.to_string();
27 self
28 }
29}
30
31impl Serialize for CardinalityValue {
32 fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
33 where
34 S: Serializer,
35 {
36 let mut state = serializer.serialize_struct("CardinalityValue", 0)?;
37 if !self.field.is_empty() {
38 state.serialize_field("field", &self.field)?;
39 }
40
41 state.end()
42 }
43}
44
45impl Serialize for CardinalityAggregation {
46 fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
47 where
48 S: Serializer,
49 {
50 let mut state = serializer.serialize_struct("CardinalityAggregation", 0)?;
51 state.serialize_field("cardinality", &self.value)?;
52
53 state.end()
54 }
55}
56
57impl AggregationTrait for CardinalityAggregation {
58 fn name(&self) -> &str {
59 self.name.as_str()
60 }
61
62 fn build(&self) -> Value {
63 let name = self.name.to_string();
64 json!({ name: self })
65 }
66
67 fn query_name(&self) -> String {
68 "sum".to_string()
69 }
70}
71
72#[cfg(test)]
73mod tests {
74 use super::*;
75 use crate::aggregation::AggregationTrait;
76
77 #[test]
78 fn test_terms_aggregation() {
79 let agg = CardinalityAggregation::new("hoge").set_field("id");
80 let json = agg.build();
81 println!("{}", json);
82 }
85}