lsor_core/
from.rs

1use crate::{
2    column::ColumnName,
3    derive::Derive,
4    driver::{Driver, PushPrql},
5    filter::Filtered,
6    sort::Sorted,
7    table::TableName,
8    take::Taken,
9};
10
11pub fn from(table: TableName) -> From {
12    From { table }
13}
14
15pub struct From {
16    pub table: TableName,
17}
18
19impl From {
20    pub fn filter<Filter>(self, filter: Filter) -> Filtered<Self, Filter> {
21        Filtered {
22            query: self,
23            filter,
24        }
25    }
26
27    pub fn sort<Sort>(self, sort: Sort) -> Sorted<Self, Sort> {
28        Sorted { query: self, sort }
29    }
30
31    pub fn take(self, n: usize) -> Taken<Self> {
32        Taken { query: self, n }
33    }
34
35    pub fn derive<Expr>(self, name: &'static str, expr: Expr) -> Derive<Self, Expr> {
36        Derive {
37            query: self,
38            derivations: vec![(ColumnName { name }, expr)],
39        }
40    }
41}
42
43impl PushPrql for From {
44    fn push_to_driver(&self, driver: &mut Driver) {
45        driver.push("from ");
46        self.table.push_to_driver(driver);
47    }
48}
49
50#[cfg(test)]
51mod test {
52    use crate::table::table;
53
54    use super::*;
55
56    #[test]
57    fn test_from() {
58        let mut driver = Driver::new();
59        {
60            from(table("users")).push_to_driver(&mut driver);
61        }
62        assert_eq!(driver.sql(), "SELECT * FROM users");
63    }
64}