good_ormning/pg/query/
helpers.rs

1use crate::pg::schema::field::Field;
2use super::expr::{
3    Expr,
4    BinOp,
5};
6
7/// Generates a field element for instert and update statements, to set a field
8/// from a parameter of the same type.
9pub fn set_field(param_name: impl Into<String>, f: &Field) -> (Field, Expr) {
10    (f.clone(), field_param(param_name, f))
11}
12
13/// Generates a param matching a field in name in type
14pub fn field_param(param_name: impl Into<String>, f: &Field) -> Expr {
15    Expr::Param {
16        name: param_name.into(),
17        type_: f.type_.type_.clone(),
18    }
19}
20
21/// Generates an expression checking for equality of a field and a parameter and
22/// the same type.
23pub fn eq_field(param_name: impl Into<String>, f: &Field) -> Expr {
24    Expr::BinOp {
25        left: Box::new(Expr::Field(f.clone())),
26        op: BinOp::Equals,
27        right: Box::new(Expr::Param {
28            name: param_name.into(),
29            type_: f.type_.type_.clone(),
30        }),
31    }
32}
33
34/// Generates an expression selecting field values greater than a corresponding
35/// parameter
36pub fn gt_field(param_name: impl Into<String>, f: &Field) -> Expr {
37    Expr::BinOp {
38        left: Box::new(Expr::Field(f.clone())),
39        op: BinOp::GreaterThan,
40        right: Box::new(Expr::Param {
41            name: param_name.into(),
42            type_: f.type_.type_.clone(),
43        }),
44    }
45}
46
47/// Generates an expression selecting field values greater than or equal to a
48/// corresponding parameter
49pub fn gte_field(param_name: impl Into<String>, f: &Field) -> Expr {
50    Expr::BinOp {
51        left: Box::new(Expr::Field(f.clone())),
52        op: BinOp::GreaterThanEqualTo,
53        right: Box::new(Expr::Param {
54            name: param_name.into(),
55            type_: f.type_.type_.clone(),
56        }),
57    }
58}
59
60/// Generates an expression selecting field values greater than a corresponding
61/// parameter
62pub fn lt_field(param_name: impl Into<String>, f: &Field) -> Expr {
63    Expr::BinOp {
64        left: Box::new(Expr::Field(f.clone())),
65        op: BinOp::LessThan,
66        right: Box::new(Expr::Param {
67            name: param_name.into(),
68            type_: f.type_.type_.clone(),
69        }),
70    }
71}
72
73/// Generates an expression selecting field values greater than or equal to a
74/// corresponding parameter
75pub fn lte_field(param_name: impl Into<String>, f: &Field) -> Expr {
76    Expr::BinOp {
77        left: Box::new(Expr::Field(f.clone())),
78        op: BinOp::LessThanEqualTo,
79        right: Box::new(Expr::Param {
80            name: param_name.into(),
81            type_: f.type_.type_.clone(),
82        }),
83    }
84}
85
86/// Shortcut for chain AND expressions.
87pub fn expr_and(exprs: Vec<Expr>) -> Expr {
88    Expr::BinOpChain {
89        op: BinOp::And,
90        exprs: exprs,
91    }
92}
93
94/// Shortcut for chain OR expressions.
95pub fn expr_or(exprs: Vec<Expr>) -> Expr {
96    Expr::BinOpChain {
97        op: BinOp::Or,
98        exprs: exprs,
99    }
100}