Skip to main content

aurora_db/reactive/
updates.rs

1use crate::types::Document;
2use serde::{Deserialize, Serialize};
3
4/// Type of update that occurred in a reactive query
5#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
6pub enum UpdateType {
7    /// Document added to query results
8    Added,
9    /// Document removed from query results
10    Removed,
11    /// Document modified while still matching query
12    Modified,
13}
14
15/// Update notification for a reactive query
16#[derive(Debug, Clone, Serialize, Deserialize)]
17pub enum QueryUpdate {
18    /// A new document was added to the query results
19    Added(Document),
20
21    /// A document was removed from the query results
22    Removed(Document),
23
24    /// A document in the results was modified
25    Modified { old: Document, new: Document },
26}
27
28impl QueryUpdate {
29    /// Get the update type
30    pub fn update_type(&self) -> UpdateType {
31        match self {
32            QueryUpdate::Added(_) => UpdateType::Added,
33            QueryUpdate::Removed(_) => UpdateType::Removed,
34            QueryUpdate::Modified { .. } => UpdateType::Modified,
35        }
36    }
37
38    /// Get the document (current state for Added/Modified, old state for Removed)
39    pub fn document(&self) -> &Document {
40        match self {
41            QueryUpdate::Added(doc) => doc,
42            QueryUpdate::Removed(doc) => doc,
43            QueryUpdate::Modified { new, .. } => new,
44        }
45    }
46
47    /// Get the document ID
48    pub fn id(&self) -> &str {
49        &self.document().id
50    }
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56    use crate::types::Value;
57    use std::collections::HashMap;
58
59    #[test]
60    fn test_query_update_types() {
61        let mut data = HashMap::new();
62        data.insert("name".to_string(), Value::String("Test".into()));
63
64        let doc = Document {
65            id: "1".to_string(),
66            data: data.clone(),
67        };
68
69        let added = QueryUpdate::Added(doc.clone());
70        assert!(matches!(added.update_type(), UpdateType::Added));
71        assert_eq!(added.id(), "1");
72
73        let removed = QueryUpdate::Removed(doc.clone());
74        assert!(matches!(removed.update_type(), UpdateType::Removed));
75
76        let modified = QueryUpdate::Modified {
77            old: doc.clone(),
78            new: doc.clone(),
79        };
80        assert!(matches!(modified.update_type(), UpdateType::Modified));
81    }
82}