Skip to main content

cypherlite_query/executor/operators/
limit.rs

1// LimitOp and SkipOp
2
3use crate::executor::Record;
4
5/// Limit output to at most `count` records.
6pub fn execute_limit(records: Vec<Record>, count: usize) -> Vec<Record> {
7    records.into_iter().take(count).collect()
8}
9
10/// Skip the first `count` records.
11pub fn execute_skip(records: Vec<Record>, count: usize) -> Vec<Record> {
12    records.into_iter().skip(count).collect()
13}
14
15#[cfg(test)]
16mod tests {
17    use super::*;
18    use crate::executor::Value;
19
20    fn make_records(n: usize) -> Vec<Record> {
21        (0..n)
22            .map(|i| {
23                let mut r = Record::new();
24                r.insert("i".to_string(), Value::Int64(i as i64));
25                r
26            })
27            .collect()
28    }
29
30    #[test]
31    fn test_limit_basic() {
32        let records = make_records(5);
33        let result = execute_limit(records, 3);
34        assert_eq!(result.len(), 3);
35        assert_eq!(result[0].get("i"), Some(&Value::Int64(0)));
36        assert_eq!(result[2].get("i"), Some(&Value::Int64(2)));
37    }
38
39    #[test]
40    fn test_limit_exceeds_count() {
41        let records = make_records(3);
42        let result = execute_limit(records, 10);
43        assert_eq!(result.len(), 3);
44    }
45
46    #[test]
47    fn test_limit_zero() {
48        let records = make_records(5);
49        let result = execute_limit(records, 0);
50        assert!(result.is_empty());
51    }
52
53    #[test]
54    fn test_skip_basic() {
55        let records = make_records(5);
56        let result = execute_skip(records, 2);
57        assert_eq!(result.len(), 3);
58        assert_eq!(result[0].get("i"), Some(&Value::Int64(2)));
59    }
60
61    #[test]
62    fn test_skip_all() {
63        let records = make_records(3);
64        let result = execute_skip(records, 10);
65        assert!(result.is_empty());
66    }
67
68    #[test]
69    fn test_skip_zero() {
70        let records = make_records(3);
71        let result = execute_skip(records, 0);
72        assert_eq!(result.len(), 3);
73    }
74}