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}