vantage_sql/primitives/
logical.rs1use vantage_expressions::{Expression, Expressive, ExpressiveEnum};
7
8pub fn or_<T>(lhs: impl Expressive<T>, rhs: impl Expressive<T>) -> Expression<T> {
17 Expression::new(
18 "({}) OR ({})",
19 vec![
20 ExpressiveEnum::Nested(lhs.expr()),
21 ExpressiveEnum::Nested(rhs.expr()),
22 ],
23 )
24}
25
26pub fn and_<T>(lhs: impl Expressive<T>, rhs: impl Expressive<T>) -> Expression<T> {
42 Expression::new(
43 "({}) AND ({})",
44 vec![
45 ExpressiveEnum::Nested(lhs.expr()),
46 ExpressiveEnum::Nested(rhs.expr()),
47 ],
48 )
49}
50
51#[cfg(test)]
52mod tests {
53 use super::*;
54
55 #[test]
56 fn test_or_preview() {
57 let expr: Expression<i32> = or_(
58 Expression::new("a = {}", vec![ExpressiveEnum::Scalar(1)]),
59 Expression::new("b = {}", vec![ExpressiveEnum::Scalar(2)]),
60 );
61 assert_eq!(expr.preview(), "(a = 1) OR (b = 2)");
62 }
63
64 #[test]
65 fn test_and_preview() {
66 let expr: Expression<i32> = and_(
67 Expression::new("a = {}", vec![ExpressiveEnum::Scalar(1)]),
68 Expression::new("b = {}", vec![ExpressiveEnum::Scalar(2)]),
69 );
70 assert_eq!(expr.preview(), "(a = 1) AND (b = 2)");
71 }
72
73 #[test]
74 fn test_nested_or_and() {
75 let expr: Expression<i32> = or_(
76 and_(
77 Expression::new("a = {}", vec![ExpressiveEnum::Scalar(1)]),
78 Expression::new("b = {}", vec![ExpressiveEnum::Scalar(2)]),
79 ),
80 Expression::new("c = {}", vec![ExpressiveEnum::Scalar(3)]),
81 );
82 assert_eq!(expr.preview(), "((a = 1) AND (b = 2)) OR (c = 3)");
83 }
84}