harmos_domain/model/storage/query/transform/
aggregate.rs1use crate::model::storage::codec::{Nested, Repeated, Text, product};
24
25use super::FieldPath;
26use super::project::Projection;
27use crate::MemorySize;
28
29product!(Aggregate { groups: Repeated<Projection> => 1, measures: Repeated<Measure> => 2 });
34product!(Measure { field: Nested<FieldPath> => 1, statistic: Nested<crate::Aggregate> => 2, name: Text => 3 });
35
36#[derive(Clone, Debug)]
41pub struct Aggregate {
42 pub groups: Vec<Projection>,
43 pub measures: Vec<Measure>,
44}
45#[derive(Clone, Debug)]
46pub struct Measure {
47 pub field: FieldPath,
48 pub statistic: crate::Aggregate,
49 pub name: String,
50}
51
52impl MemorySize for Aggregate {
59 fn memory_size(&self) -> usize {
60 std::mem::size_of::<Self>()
61 + self.groups.memory_size().saturating_sub(std::mem::size_of_val(&self.groups))
62 + self.measures.memory_size().saturating_sub(std::mem::size_of_val(&self.measures))
63 }
64}
65impl MemorySize for Measure {
66 fn memory_size(&self) -> usize {
67 std::mem::size_of::<Self>() + self.field.memory_size().saturating_sub(std::mem::size_of_val(&self.field)) + self.name.capacity()
68 }
69}
70
71