use crate::{IntoSqlValue, values::FilterValue};
use super::expr::FilterExpr;
use super::op::FilterOp;
#[derive(Debug, Clone, PartialEq)]
pub enum JsonFilter {
HasKey {
column: &'static str,
key: String,
},
GetText {
column: &'static str,
key: String,
op: FilterOp,
value: FilterValue,
},
}
#[derive(Debug, Clone)]
pub struct JsonTextPath {
pub(super) column: &'static str,
pub(super) key: String,
}
impl JsonTextPath {
pub(super) fn new(column: &'static str, key: String) -> Self {
Self { column, key }
}
fn binary<V: IntoSqlValue>(self, op: FilterOp, value: V) -> FilterExpr {
FilterExpr::Json(JsonFilter::GetText {
column: self.column,
key: self.key,
op,
value: FilterValue::Single(value.into_sql_value()),
})
}
pub fn eq<V: IntoSqlValue>(self, value: V) -> FilterExpr {
self.binary(FilterOp::Eq, value)
}
pub fn ne<V: IntoSqlValue>(self, value: V) -> FilterExpr {
self.binary(FilterOp::Ne, value)
}
pub fn lt<V: IntoSqlValue>(self, value: V) -> FilterExpr {
self.binary(FilterOp::Lt, value)
}
pub fn lte<V: IntoSqlValue>(self, value: V) -> FilterExpr {
self.binary(FilterOp::Lte, value)
}
pub fn gt<V: IntoSqlValue>(self, value: V) -> FilterExpr {
self.binary(FilterOp::Gt, value)
}
pub fn gte<V: IntoSqlValue>(self, value: V) -> FilterExpr {
self.binary(FilterOp::Gte, value)
}
pub fn is_null(self) -> FilterExpr {
FilterExpr::Json(JsonFilter::GetText {
column: self.column,
key: self.key,
op: FilterOp::IsNull,
value: FilterValue::None,
})
}
pub fn is_not_null(self) -> FilterExpr {
FilterExpr::Json(JsonFilter::GetText {
column: self.column,
key: self.key,
op: FilterOp::IsNotNull,
value: FilterValue::None,
})
}
}