cypherlite_query/executor/operators/
limit.rs1use crate::executor::Record;
4
5pub fn execute_limit(records: Vec<Record>, count: usize) -> Vec<Record> {
7 records.into_iter().take(count).collect()
8}
9
10pub 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}