lsor_core/
take.rs

1use crate::{
2    driver::{Driver, PushPrql},
3    filter::Filtered,
4    sort::Sorted,
5};
6
7pub struct Taken<Query> {
8    pub query: Query,
9    pub n: usize,
10}
11
12impl<Query> Taken<Query> {
13    pub fn filter<Filter>(&self, filter: Filter) -> Filtered<&Self, Filter> {
14        Filtered {
15            query: self,
16            filter,
17        }
18    }
19
20    pub fn sort<Sort>(&self, sort: Sort) -> Sorted<&Self, Sort> {
21        Sorted { query: self, sort }
22    }
23}
24
25impl<Query> PushPrql for Taken<Query>
26where
27    Query: PushPrql,
28{
29    fn push_to_driver(&self, driver: &mut Driver) {
30        self.query.push_to_driver(driver);
31        driver.push("\ntake ");
32        driver.push(self.n);
33    }
34}
35
36#[cfg(test)]
37mod test {
38    use crate::{column::col, cond::gt, eq, from::from, table::table};
39
40    use super::*;
41
42    #[test]
43    fn test_take() {
44        let mut driver = Driver::new();
45        {
46            from(table("users")).take(10).push_to_driver(&mut driver);
47        }
48        assert_eq!(driver.sql(), "SELECT * FROM users LIMIT 10");
49    }
50
51    #[test]
52    fn test_filter_take() {
53        let mut driver = Driver::new();
54        {
55            from(table("users"))
56                .filter(gt(col("age"), 18))
57                .take(10)
58                .push_to_driver(&mut driver);
59        }
60        assert_eq!(driver.sql(), "SELECT * FROM users WHERE age > $1 LIMIT 10");
61
62        let mut driver = Driver::new();
63        {
64            from(table("users"))
65                .filter(eq(table("users").dot(col("sub")), 1234567890))
66                .take(1)
67                .push_to_driver(&mut driver);
68        }
69        assert_eq!(driver.sql(), "SELECT * FROM users WHERE sub = $1 LIMIT 1");
70    }
71
72    #[test]
73    fn test_filter_sort_take() {
74        let mut driver = Driver::new();
75        {
76            from(table("users"))
77                .filter(gt(col("age"), 18))
78                .sort(col("age").asc())
79                .take(10)
80                .push_to_driver(&mut driver);
81        }
82        assert_eq!(
83            driver.sql(),
84            "SELECT * FROM users WHERE age > $1 ORDER BY age LIMIT 10"
85        );
86    }
87
88    #[test]
89    fn test_sort_take() {
90        let mut driver = Driver::new();
91        {
92            from(table("users"))
93                .sort(col("age").asc())
94                .take(10)
95                .push_to_driver(&mut driver);
96        }
97        assert_eq!(driver.sql(), "SELECT * FROM users ORDER BY age LIMIT 10");
98    }
99}