Skip to main content

harmos_domain/model/storage/query/transform/
aggregate.rs

1/* ***
2 *
3 * Harmos
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * ***
8 */
9
10// Storage Arrow Query Contract
11
12/* === Modules === */
13
14/* === Re-Exports === */
15
16/* === Imports === */
17
18// Standard Library Imports
19
20// Third Party Imports
21
22// Local Imports
23use crate::model::storage::codec::{Nested, Repeated, Text, product};
24
25use super::FieldPath;
26use super::project::Projection;
27use crate::MemorySize;
28
29/* === Constants === */
30
31/* === Macros === */
32
33product!(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/* === Type Aliases === */
37
38/* === Structs === */
39
40#[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
52/* === Enums === */
53
54/* === Traits === */
55
56/* === Implementations === */
57
58impl 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/* === Public Functions === */
72
73/* === Private Functions === */
74
75/* === Tests === */