a3s_memory/repository/
store.rs1use super::{
2 MemoryAccessEvent, MemoryChangeResult, MemoryChangeSet, MemoryNamespace,
3 MemoryNamespaceChangeToken, MemoryNamespaceSnapshot, MemoryNode, MemoryQuery,
4 MemoryQueryResult, MemoryRepositoryError, MemorySnapshotRequest, MemoryUsageSummary,
5 MAX_QUERY_LIMIT,
6};
7
8#[async_trait::async_trait]
10pub trait MemoryRepository: Send + Sync {
11 async fn apply(
13 &self,
14 change_set: MemoryChangeSet,
15 ) -> Result<MemoryChangeResult, MemoryRepositoryError>;
16
17 async fn get(
19 &self,
20 namespace: &MemoryNamespace,
21 node_id: &str,
22 ) -> Result<Option<MemoryNode>, MemoryRepositoryError>;
23
24 async fn query(&self, query: MemoryQuery) -> Result<MemoryQueryResult, MemoryRepositoryError>;
26
27 async fn snapshot_namespace(
32 &self,
33 request: MemorySnapshotRequest,
34 ) -> Result<MemoryNamespaceSnapshot, MemoryRepositoryError> {
35 request.validate()?;
36 let query_limit = request.max_nodes.saturating_add(1).min(MAX_QUERY_LIMIT);
37 let result = self
38 .query(
39 MemoryQuery::new(request.namespace.clone())
40 .with_statuses(request.statuses.iter().copied())
41 .with_limit(query_limit),
42 )
43 .await?;
44 if request.max_nodes >= MAX_QUERY_LIMIT && result.hits.len() == MAX_QUERY_LIMIT {
45 return Err(MemoryRepositoryError::LimitExceeded {
46 resource: "namespace snapshot query horizon".into(),
47 limit: MAX_QUERY_LIMIT - 1,
48 actual: MAX_QUERY_LIMIT,
49 });
50 }
51 super::snapshot::snapshot_from_nodes(
52 request,
53 result.hits.into_iter().map(|hit| hit.node).collect(),
54 )
55 }
56
57 async fn namespace_change_token(
65 &self,
66 namespace: &MemoryNamespace,
67 ) -> Result<Option<MemoryNamespaceChangeToken>, MemoryRepositoryError> {
68 namespace.validate()?;
69 Ok(None)
70 }
71
72 async fn record_admission(&self, event: MemoryAccessEvent)
74 -> Result<(), MemoryRepositoryError>;
75
76 async fn record_use(&self, event: MemoryAccessEvent) -> Result<(), MemoryRepositoryError>;
78
79 async fn usage_summary(
81 &self,
82 namespace: &MemoryNamespace,
83 node_id: &str,
84 ) -> Result<MemoryUsageSummary, MemoryRepositoryError>;
85}