elastic_query_builder/aggregation/
cardinality_aggregation.rs

1use 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        // assert_eq!(json["test"]["terms"]["field"], "test");
83        // assert_eq!(json["test"]["terms"]["size"], 1);
84    }
85}