radixdb_sql/
precedence.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
19#[repr(u8)]
20#[derive(Default)]
21pub enum Precedence {
22 #[default]
24 Lowest = 1,
25 Or = 2,
27 And = 3,
29 Not = 4,
31 Equals = 5,
33 LessGreater = 6,
35 BitwiseOr = 7,
37 BitwiseXor = 8,
39 BitwiseAnd = 9,
41 BitwiseShift = 10,
43 Sum = 11,
45 Product = 12,
47 Prefix = 13,
49 Call = 14,
51 Index = 15,
53 Dot = 16,
55}
56
57impl Precedence {
58 pub fn for_operator(op: &str) -> Precedence {
60 match op.to_uppercase().as_str() {
61 "OR" => Precedence::Or,
63 "XOR" => Precedence::Or, "AND" => Precedence::And,
65 "NOT" => Precedence::Not,
66
67 "=" | "<>" | "!=" | "IS" | "LIKE" | "ILIKE" | "GLOB" | "REGEXP" | "RLIKE" | "IN"
69 | "BETWEEN" => Precedence::Equals,
70 "<" | ">" | "<=" | ">=" | "<=>" | "&&" | "@>" | "<@" => Precedence::LessGreater,
71
72 "|" => Precedence::BitwiseOr,
74 "^" => Precedence::BitwiseXor,
75 "&" => Precedence::BitwiseAnd,
76 "<<" | ">>" => Precedence::BitwiseShift,
77
78 "+" | "-" | "||" => Precedence::Sum,
80 "*" | "/" | "%" => Precedence::Product,
81
82 "." => Precedence::Dot,
84 "(" => Precedence::Call,
85 "[" => Precedence::Index,
86
87 "->" | "->>" => Precedence::Index,
89
90 _ => Precedence::Lowest,
91 }
92 }
93}
94
95#[cfg(test)]
96mod tests {
97 use super::*;
98
99 #[test]
100 fn test_precedence_ordering() {
101 assert!(Precedence::Product > Precedence::Sum);
102 assert!(Precedence::Sum > Precedence::LessGreater);
103 assert!(Precedence::LessGreater > Precedence::Equals);
104 assert!(Precedence::And > Precedence::Or);
105 assert!(Precedence::Dot > Precedence::Call);
106 }
107
108 #[test]
109 fn test_operator_precedence() {
110 assert_eq!(Precedence::for_operator("+"), Precedence::Sum);
111 assert_eq!(Precedence::for_operator("*"), Precedence::Product);
112 assert_eq!(Precedence::for_operator("AND"), Precedence::And);
113 assert_eq!(Precedence::for_operator("OR"), Precedence::Or);
114 assert_eq!(Precedence::for_operator("="), Precedence::Equals);
115 assert_eq!(Precedence::for_operator("."), Precedence::Dot);
116 }
117}