harmos_domain/operations/storage/
query.rs1use super::IO_POLICY;
25use crate::model::storage::StorageCursor;
26use crate::model::storage::codec::{Nested, Repeated, product};
27use crate::model::storage::query::transform::Transform;
28use crate::model::storage::query::{QueryCompletion, QueryOutput, RowSlice, Source};
29use crate::operations::{ReplaySafety, Visibility};
30use crate::{MemorySize, Result};
31
32product!(Query {
37 at: Nested<StorageCursor> => 1,
38 source: Nested<Source> => 2,
39 transforms: Repeated<Transform> => 3,
40 slice: Nested<RowSlice> => 4,
41});
42
43crate::declare!(Query {
44 id: "storage.query",
45 version: 1,
46 policy: IO_POLICY,
47 response: QueryCompletion,
48 output: QueryOutput,
49 visibility: Visibility::Shared,
50 replay: ReplaySafety::Idempotent,
51 grpc: ("harmos.storage.v1", "Storage", "Query"),
52 grant: |request: &Query| Some(crate::plugin::Grant::of("storage.query", request.source.grant_scope(),)),
53});
54
55#[derive(Clone, Debug)]
60pub struct Query {
61 pub at: StorageCursor,
62 pub source: Source,
63 pub transforms: Vec<Transform>,
64 pub slice: RowSlice,
65}
66
67impl Query {
74 pub fn validate(&self) -> Result<()> {
75 self.source.validate()?;
76 if self.transforms.len() > 64 {
77 return Err(crate::model::storage::query::transform::invalid("too many query transforms"));
78 }
79 Ok(())
80 }
81}
82
83impl MemorySize for Query {
84 fn memory_size(&self) -> usize {
85 std::mem::size_of::<Self>()
86 .saturating_add(self.at.memory_size().saturating_sub(std::mem::size_of_val(&self.at)))
87 .saturating_add(self.source.memory_size().saturating_sub(std::mem::size_of_val(&self.source)))
88 .saturating_add(self.transforms.memory_size().saturating_sub(std::mem::size_of_val(&self.transforms)))
89 .saturating_add(self.slice.memory_size().saturating_sub(std::mem::size_of_val(&self.slice)))
90 }
91}
92
93