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}