use gxhash::HashSet;
use crate::{ColIdx, Val};
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub enum Order {
#[default]
Asc,
Desc,
}
#[derive(Clone, Debug)]
pub enum Op {
Eq(Val),
In(HashSet<Val>),
Range(Val, Val),
RangeInclusive(Val, Val),
RangeFrom(Val),
RangeTo(Val),
RangeToInclusive(Val),
}
#[derive(Clone, Debug)]
pub enum Expr {
KeyCol(ColIdx, Op),
ValCol(ColIdx, Op),
And(Box<Expr>, Box<Expr>),
Or(Box<Expr>, Box<Expr>),
Not(Box<Expr>), }
impl Expr {
pub fn key_col(col_idx: ColIdx, op: Op) -> Self {
Expr::KeyCol(col_idx, op)
}
pub fn val_col(col_idx: ColIdx, op: Op) -> Self {
Expr::ValCol(col_idx, op)
}
pub fn and(self, other: Expr) -> Self {
Expr::And(Box::new(self), Box::new(other))
}
pub fn or(self, other: Expr) -> Self {
Expr::Or(Box::new(self), Box::new(other))
}
pub fn not(self) -> Self {
Expr::Not(Box::new(self))
}
pub fn key_eq(col_idx: ColIdx, val: Val) -> Self {
Self::key_col(col_idx, Op::Eq(val))
}
pub fn key_in(col_idx: ColIdx, val_li: impl Into<HashSet<Val>>) -> Self {
Self::key_col(col_idx, Op::In(val_li.into()))
}
pub fn key_range(col_idx: ColIdx, start: Val, end: Val) -> Self {
Self::key_col(col_idx, Op::Range(start, end))
}
pub fn key_range_inclusive(col_idx: ColIdx, start: Val, end: Val) -> Self {
Self::key_col(col_idx, Op::RangeInclusive(start, end))
}
pub fn key_range_from(col_idx: ColIdx, start: Val) -> Self {
Self::key_col(col_idx, Op::RangeFrom(start))
}
pub fn key_range_to(col_idx: ColIdx, end: Val) -> Self {
Self::key_col(col_idx, Op::RangeTo(end))
}
pub fn key_range_to_inclusive(col_idx: ColIdx, end: Val) -> Self {
Self::key_col(col_idx, Op::RangeToInclusive(end))
}
pub fn val_eq(col_idx: ColIdx, val: Val) -> Self {
Self::val_col(col_idx, Op::Eq(val))
}
pub fn val_in_range(col_idx: ColIdx, val_li: impl Into<HashSet<Val>>) -> Self {
Self::val_col(col_idx, Op::In(val_li.into()))
}
pub fn val_range(col_idx: ColIdx, start: Val, end: Val) -> Self {
Self::val_col(col_idx, Op::Range(start, end))
}
pub fn val_range_inclusive(col_idx: ColIdx, start: Val, end: Val) -> Self {
Self::val_col(col_idx, Op::RangeInclusive(start, end))
}
pub fn val_range_from(col_idx: ColIdx, start: Val) -> Self {
Self::val_col(col_idx, Op::RangeFrom(start))
}
pub fn val_range_to(col_idx: ColIdx, end: Val) -> Self {
Self::val_col(col_idx, Op::RangeTo(end))
}
pub fn val_range_to_inclusive(col_idx: ColIdx, end: Val) -> Self {
Self::val_col(col_idx, Op::RangeToInclusive(end))
}
}