use serde::{Deserialize, Serialize};
use sqlparser::ast as sql;
use std::fmt;
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
pub enum Operator {
Plus,
Minus,
Multiply,
Divide,
Modulus,
Eq, Neq, Lt, Lte, Gt, Gte, And, Or, Like, In, NotIn, Is, IsNot, Ilike, Starts, }
impl Operator {
pub(crate) fn needs_separator(&self) -> bool {
match self {
Operator::And
| Operator::Or
| Operator::Plus
| Operator::Minus
| Operator::Multiply
| Operator::Divide
| Operator::Modulus => false,
Operator::Eq
| Operator::Neq
| Operator::Lt
| Operator::Lte
| Operator::Gt
| Operator::Gte
| Operator::Like
| Operator::In
| Operator::NotIn
| Operator::Is
| Operator::IsNot
| Operator::Ilike
| Operator::Starts => true,
}
}
}
impl Into<sql::BinaryOperator> for &Operator {
fn into(self) -> sql::BinaryOperator {
match self {
Operator::Eq => sql::BinaryOperator::Eq,
Operator::Neq => sql::BinaryOperator::NotEq,
Operator::Lt => sql::BinaryOperator::Lt,
Operator::Lte => sql::BinaryOperator::LtEq,
Operator::Gt => sql::BinaryOperator::Gt,
Operator::Gte => sql::BinaryOperator::GtEq,
Operator::And => sql::BinaryOperator::And,
Operator::Or => sql::BinaryOperator::Or,
Operator::Like => sql::BinaryOperator::PGLikeMatch,
Operator::Ilike => sql::BinaryOperator::PGILikeMatch,
Operator::Plus => sql::BinaryOperator::Plus,
Operator::Minus => sql::BinaryOperator::Minus,
Operator::Multiply => sql::BinaryOperator::Multiply,
Operator::Divide => sql::BinaryOperator::Divide,
Operator::Modulus => sql::BinaryOperator::Modulo,
_ => panic!("unsupported conversion"),
}
}
}
impl fmt::Display for Operator {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Operator::Plus => write!(f, "+"),
Operator::Minus => write!(f, "-"),
Operator::Multiply => write!(f, "*"),
Operator::Divide => write!(f, "/"),
Operator::Modulus => write!(f, "%"),
Operator::Eq => write!(f, "eq"),
Operator::Neq => write!(f, "neq"),
Operator::Lt => write!(f, "lt"),
Operator::Lte => write!(f, "lte"),
Operator::Gt => write!(f, "gt"),
Operator::Gte => write!(f, "gte"),
Operator::And => write!(f, "&"),
Operator::Or => write!(f, "|"),
Operator::Like => write!(f, "like"),
Operator::In => write!(f, "in"),
Operator::NotIn => write!(f, "not_in"),
Operator::Is => write!(f, "is"),
Operator::IsNot => write!(f, "is_not"),
Operator::Ilike => write!(f, "ilike"),
Operator::Starts => write!(f, "starts"),
}
}
}