Skip to main content

laminar_core/mv/
mod.rs

1//! Cascading materialized view registry with dependency tracking and cycle detection.
2
3mod error;
4mod registry;
5
6pub use error::{MvError, MvState};
7pub use registry::{MaterializedView, MvRegistry};
8
9#[cfg(test)]
10mod tests {
11    use super::*;
12    use arrow_schema::{DataType, Field, Schema};
13    use std::sync::Arc;
14
15    #[test]
16    fn test_dependency_chain() {
17        let mut registry = MvRegistry::new();
18        registry.register_base_table("trades");
19
20        let schema = Arc::new(Schema::new(vec![Field::new("v", DataType::Int64, false)]));
21        let mv = |n: &str, s: Vec<&str>| {
22            MaterializedView::new(
23                n,
24                "",
25                s.into_iter().map(String::from).collect(),
26                schema.clone(),
27            )
28        };
29
30        registry.register(mv("a", vec!["trades"])).unwrap();
31        registry.register(mv("b", vec!["a"])).unwrap();
32        registry.register(mv("c", vec!["b"])).unwrap();
33
34        let chain = registry.dependency_chain("c");
35        assert_eq!(chain, vec!["a", "b", "c"]);
36    }
37
38    #[test]
39    fn test_show_dependencies_equivalent() {
40        let mut registry = MvRegistry::new();
41        registry.register_base_table("trades");
42
43        let schema = Arc::new(Schema::new(vec![Field::new("v", DataType::Int64, false)]));
44        let mv = |n: &str, s: Vec<&str>| {
45            MaterializedView::new(
46                n,
47                "",
48                s.into_iter().map(String::from).collect(),
49                schema.clone(),
50            )
51        };
52
53        registry.register(mv("ohlc_1s", vec!["trades"])).unwrap();
54        registry.register(mv("ohlc_1m", vec!["ohlc_1s"])).unwrap();
55        registry.register(mv("ohlc_1h", vec!["ohlc_1m"])).unwrap();
56
57        let chain = registry.dependency_chain("ohlc_1h");
58        assert_eq!(chain, vec!["ohlc_1s", "ohlc_1m", "ohlc_1h"]);
59
60        let direct: Vec<_> = registry.get_dependencies("ohlc_1h").collect();
61        assert_eq!(direct, vec!["ohlc_1m"]);
62    }
63}