1mod term;
21use serde::{Deserialize, Serialize};
22pub use term::*;
23pub(crate) mod accessor;
24mod predicate;
25pub(crate) mod visitors;
26use std::fmt::{Display, Formatter};
27
28pub use predicate::*;
29
30use crate::spec::SchemaRef;
31
32#[allow(missing_docs)]
37#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
38#[non_exhaustive]
39#[repr(u16)]
40pub enum PredicateOperator {
41 IsNull = 101,
43 NotNull = 102,
44 IsNan = 103,
45 NotNan = 104,
46
47 LessThan = 201,
49 LessThanOrEq = 202,
50 GreaterThan = 203,
51 GreaterThanOrEq = 204,
52 Eq = 205,
53 NotEq = 206,
54 StartsWith = 207,
55 NotStartsWith = 208,
56
57 In = 301,
59 NotIn = 302,
60}
61
62impl Display for PredicateOperator {
63 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
64 match self {
65 PredicateOperator::IsNull => write!(f, "IS NULL"),
66 PredicateOperator::NotNull => write!(f, "IS NOT NULL"),
67 PredicateOperator::IsNan => write!(f, "IS NAN"),
68 PredicateOperator::NotNan => write!(f, "IS NOT NAN"),
69 PredicateOperator::LessThan => write!(f, "<"),
70 PredicateOperator::LessThanOrEq => write!(f, "<="),
71 PredicateOperator::GreaterThan => write!(f, ">"),
72 PredicateOperator::GreaterThanOrEq => write!(f, ">="),
73 PredicateOperator::Eq => write!(f, "="),
74 PredicateOperator::NotEq => write!(f, "!="),
75 PredicateOperator::In => write!(f, "IN"),
76 PredicateOperator::NotIn => write!(f, "NOT IN"),
77 PredicateOperator::StartsWith => write!(f, "STARTS WITH"),
78 PredicateOperator::NotStartsWith => write!(f, "NOT STARTS WITH"),
79 }
80 }
81}
82
83impl PredicateOperator {
84 pub fn is_unary(self) -> bool {
93 (self as u16) < (PredicateOperator::LessThan as u16)
94 }
95
96 pub fn is_binary(self) -> bool {
105 ((self as u16) > (PredicateOperator::NotNan as u16))
106 && ((self as u16) < (PredicateOperator::In as u16))
107 }
108
109 pub fn is_set(self) -> bool {
118 (self as u16) > (PredicateOperator::NotStartsWith as u16)
119 }
120
121 pub fn negate(self) -> PredicateOperator {
148 match self {
149 PredicateOperator::IsNull => PredicateOperator::NotNull,
150 PredicateOperator::NotNull => PredicateOperator::IsNull,
151 PredicateOperator::IsNan => PredicateOperator::NotNan,
152 PredicateOperator::NotNan => PredicateOperator::IsNan,
153 PredicateOperator::LessThan => PredicateOperator::GreaterThanOrEq,
154 PredicateOperator::LessThanOrEq => PredicateOperator::GreaterThan,
155 PredicateOperator::GreaterThan => PredicateOperator::LessThanOrEq,
156 PredicateOperator::GreaterThanOrEq => PredicateOperator::LessThan,
157 PredicateOperator::Eq => PredicateOperator::NotEq,
158 PredicateOperator::NotEq => PredicateOperator::Eq,
159 PredicateOperator::In => PredicateOperator::NotIn,
160 PredicateOperator::NotIn => PredicateOperator::In,
161 PredicateOperator::StartsWith => PredicateOperator::NotStartsWith,
162 PredicateOperator::NotStartsWith => PredicateOperator::StartsWith,
163 }
164 }
165}
166
167pub trait Bind {
169 type Bound;
171 fn bind(&self, schema: SchemaRef, case_sensitive: bool) -> crate::Result<Self::Bound>;
173}
174
175#[cfg(test)]
176mod tests {
177 use crate::expr::PredicateOperator;
178
179 #[test]
180 fn test_unary() {
181 assert!(PredicateOperator::IsNull.is_unary());
182 assert!(PredicateOperator::NotNull.is_unary());
183 assert!(PredicateOperator::IsNan.is_unary());
184 assert!(PredicateOperator::NotNan.is_unary());
185 }
186
187 #[test]
188 fn test_binary() {
189 assert!(PredicateOperator::LessThan.is_binary());
190 assert!(PredicateOperator::LessThanOrEq.is_binary());
191 assert!(PredicateOperator::GreaterThan.is_binary());
192 assert!(PredicateOperator::GreaterThanOrEq.is_binary());
193 assert!(PredicateOperator::Eq.is_binary());
194 assert!(PredicateOperator::NotEq.is_binary());
195 assert!(PredicateOperator::StartsWith.is_binary());
196 assert!(PredicateOperator::NotStartsWith.is_binary());
197 }
198
199 #[test]
200 fn test_set() {
201 assert!(PredicateOperator::In.is_set());
202 assert!(PredicateOperator::NotIn.is_set());
203 }
204}