rexis_rag/storage/
memory.rs1use crate::RragResult;
7use async_trait::async_trait;
8use serde::{Deserialize, Serialize};
9use std::collections::HashMap;
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
13pub enum MemoryValue {
14 String(String),
16
17 Integer(i64),
19
20 Float(f64),
22
23 Boolean(bool),
25
26 Json(serde_json::Value),
28
29 Bytes(Vec<u8>),
31
32 List(Vec<MemoryValue>),
34
35 Map(HashMap<String, MemoryValue>),
37}
38
39impl MemoryValue {
40 pub fn as_string(&self) -> Option<&str> {
42 match self {
43 MemoryValue::String(s) => Some(s),
44 _ => None,
45 }
46 }
47
48 pub fn as_integer(&self) -> Option<i64> {
50 match self {
51 MemoryValue::Integer(i) => Some(*i),
52 _ => None,
53 }
54 }
55
56 pub fn as_float(&self) -> Option<f64> {
58 match self {
59 MemoryValue::Float(f) => Some(*f),
60 _ => None,
61 }
62 }
63
64 pub fn as_boolean(&self) -> Option<bool> {
66 match self {
67 MemoryValue::Boolean(b) => Some(*b),
68 _ => None,
69 }
70 }
71
72 pub fn as_json(&self) -> Option<&serde_json::Value> {
74 match self {
75 MemoryValue::Json(j) => Some(j),
76 _ => None,
77 }
78 }
79
80 pub fn as_bytes(&self) -> Option<&[u8]> {
82 match self {
83 MemoryValue::Bytes(b) => Some(b),
84 _ => None,
85 }
86 }
87}
88
89impl From<String> for MemoryValue {
90 fn from(s: String) -> Self {
91 MemoryValue::String(s)
92 }
93}
94
95impl From<&str> for MemoryValue {
96 fn from(s: &str) -> Self {
97 MemoryValue::String(s.to_string())
98 }
99}
100
101impl From<i64> for MemoryValue {
102 fn from(i: i64) -> Self {
103 MemoryValue::Integer(i)
104 }
105}
106
107impl From<f64> for MemoryValue {
108 fn from(f: f64) -> Self {
109 MemoryValue::Float(f)
110 }
111}
112
113impl From<bool> for MemoryValue {
114 fn from(b: bool) -> Self {
115 MemoryValue::Boolean(b)
116 }
117}
118
119impl From<serde_json::Value> for MemoryValue {
120 fn from(j: serde_json::Value) -> Self {
121 MemoryValue::Json(j)
122 }
123}
124
125impl From<Vec<u8>> for MemoryValue {
126 fn from(b: Vec<u8>) -> Self {
127 MemoryValue::Bytes(b)
128 }
129}
130
131#[derive(Debug, Clone, Default)]
133pub struct MemoryQuery {
134 pub key_pattern: Option<String>,
136
137 pub namespace: Option<String>,
139
140 pub limit: Option<usize>,
142
143 pub offset: Option<usize>,
145
146 pub sort_order: Option<SortOrder>,
148}
149
150#[derive(Debug, Clone)]
151pub enum SortOrder {
152 KeyAsc,
154 KeyDesc,
156 CreatedAsc,
158 CreatedDesc,
160}
161
162impl MemoryQuery {
163 pub fn new() -> Self {
164 Self::default()
165 }
166
167 pub fn with_pattern(mut self, pattern: impl Into<String>) -> Self {
168 self.key_pattern = Some(pattern.into());
169 self
170 }
171
172 pub fn with_namespace(mut self, namespace: impl Into<String>) -> Self {
173 self.namespace = Some(namespace.into());
174 self
175 }
176
177 pub fn with_limit(mut self, limit: usize) -> Self {
178 self.limit = Some(limit);
179 self
180 }
181
182 pub fn with_offset(mut self, offset: usize) -> Self {
183 self.offset = Some(offset);
184 self
185 }
186}
187
188#[async_trait]
190pub trait Memory: Send + Sync {
191 fn backend_name(&self) -> &str;
193
194 async fn set(&self, key: &str, value: MemoryValue) -> RragResult<()>;
196
197 async fn get(&self, key: &str) -> RragResult<Option<MemoryValue>>;
199
200 async fn delete(&self, key: &str) -> RragResult<bool>;
202
203 async fn exists(&self, key: &str) -> RragResult<bool>;
205
206 async fn keys(&self, query: &MemoryQuery) -> RragResult<Vec<String>>;
208
209 async fn mget(&self, keys: &[String]) -> RragResult<Vec<Option<MemoryValue>>>;
211
212 async fn mset(&self, pairs: &[(String, MemoryValue)]) -> RragResult<()>;
214
215 async fn mdelete(&self, keys: &[String]) -> RragResult<usize>;
217
218 async fn clear(&self, namespace: Option<&str>) -> RragResult<()>;
220
221 async fn count(&self, namespace: Option<&str>) -> RragResult<usize>;
223
224 async fn health_check(&self) -> RragResult<bool>;
226
227 async fn stats(&self) -> RragResult<MemoryStats>;
229}
230
231#[derive(Debug, Clone, Serialize, Deserialize)]
233pub struct MemoryStats {
234 pub total_keys: usize,
236
237 pub memory_bytes: u64,
239
240 pub backend_type: String,
242
243 pub namespace_count: usize,
245
246 pub last_updated: chrono::DateTime<chrono::Utc>,
248
249 pub extra: HashMap<String, serde_json::Value>,
251}