1use crate::idx::ft::MatchRef;
2use revision::revisioned;
3use serde::{Deserialize, Serialize};
4use std::fmt;
5use std::fmt::Write;
6
7#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Hash)]
9#[revisioned(revision = 1)]
10pub enum Operator {
11 Neg, Not, Or, And, Tco, Nco, Add, Sub, Mul, Div, Pow, Inc, Dec, Ext, Equal, Exact, NotEqual, AllEqual, AnyEqual, Like, NotLike, AllLike, AnyLike, Matches(Option<MatchRef>), LessThan, LessThanOrEqual, MoreThan, MoreThanOrEqual, Contain, NotContain, ContainAll, ContainAny, ContainNone, Inside, NotInside, AllInside, AnyInside, NoneInside, Outside,
58 Intersects,
59 Knn(u32), }
62
63impl Default for Operator {
64 fn default() -> Self {
65 Self::Equal
66 }
67}
68
69impl Operator {
70 #[inline]
71 pub fn precedence(&self) -> u8 {
72 match self {
73 Self::Or => 1,
74 Self::And => 2,
75 Self::Tco => 3,
76 Self::Nco => 4,
77 Self::Sub => 6,
78 Self::Add => 7,
79 Self::Mul => 8,
80 Self::Div => 9,
81 _ => 5,
82 }
83 }
84}
85
86impl fmt::Display for Operator {
87 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
88 match self {
89 Self::Neg => f.write_str("-"),
90 Self::Not => f.write_str("!"),
91 Self::Or => f.write_str("OR"),
92 Self::And => f.write_str("AND"),
93 Self::Tco => f.write_str("?:"),
94 Self::Nco => f.write_str("??"),
95 Self::Add => f.write_str("+"),
96 Self::Sub => f.write_char('-'),
97 Self::Mul => f.write_char('*'),
98 Self::Div => f.write_char('/'),
99 Self::Pow => f.write_str("**"),
100 Self::Inc => f.write_str("+="),
101 Self::Dec => f.write_str("-="),
102 Self::Ext => f.write_str("+?="),
103 Self::Equal => f.write_char('='),
104 Self::Exact => f.write_str("=="),
105 Self::NotEqual => f.write_str("!="),
106 Self::AllEqual => f.write_str("*="),
107 Self::AnyEqual => f.write_str("?="),
108 Self::Like => f.write_char('~'),
109 Self::NotLike => f.write_str("!~"),
110 Self::AllLike => f.write_str("*~"),
111 Self::AnyLike => f.write_str("?~"),
112 Self::LessThan => f.write_char('<'),
113 Self::LessThanOrEqual => f.write_str("<="),
114 Self::MoreThan => f.write_char('>'),
115 Self::MoreThanOrEqual => f.write_str(">="),
116 Self::Contain => f.write_str("CONTAINS"),
117 Self::NotContain => f.write_str("CONTAINSNOT"),
118 Self::ContainAll => f.write_str("CONTAINSALL"),
119 Self::ContainAny => f.write_str("CONTAINSANY"),
120 Self::ContainNone => f.write_str("CONTAINSNONE"),
121 Self::Inside => f.write_str("INSIDE"),
122 Self::NotInside => f.write_str("NOTINSIDE"),
123 Self::AllInside => f.write_str("ALLINSIDE"),
124 Self::AnyInside => f.write_str("ANYINSIDE"),
125 Self::NoneInside => f.write_str("NONEINSIDE"),
126 Self::Outside => f.write_str("OUTSIDE"),
127 Self::Intersects => f.write_str("INTERSECTS"),
128 Self::Matches(reference) => {
129 if let Some(r) = reference {
130 write!(f, "@{}@", r)
131 } else {
132 f.write_str("@@")
133 }
134 }
135 Self::Knn(k) => write!(f, "<{}>", k),
136 }
137 }
138}