Implements the EXIST filter operator

This commit is contained in:
Loïc Lecrenier
2022-05-25 11:55:16 +02:00
parent a8641b42a7
commit 72452f0cb2
4 changed files with 55 additions and 8 deletions

View File

@ -8,7 +8,7 @@
use nom::branch::alt;
use nom::bytes::complete::tag;
use nom::combinator::cut;
use nom::sequence::tuple;
use nom::sequence::{terminated, tuple};
use Condition::*;
use crate::{parse_value, FilterCondition, IResult, Span, Token};
@ -19,6 +19,8 @@ pub enum Condition<'a> {
GreaterThanOrEqual(Token<'a>),
Equal(Token<'a>),
NotEqual(Token<'a>),
Exist,
NotExist,
LowerThan(Token<'a>),
LowerThanOrEqual(Token<'a>),
Between { from: Token<'a>, to: Token<'a> },
@ -33,6 +35,8 @@ impl<'a> Condition<'a> {
GreaterThanOrEqual(n) => (LowerThan(n), None),
Equal(s) => (NotEqual(s), None),
NotEqual(s) => (Equal(s), None),
Exist => (NotExist, None),
NotExist => (Exist, None),
LowerThan(n) => (GreaterThanOrEqual(n), None),
LowerThanOrEqual(n) => (GreaterThan(n), None),
Between { from, to } => (LowerThan(from), Some(GreaterThan(to))),
@ -58,6 +62,13 @@ pub fn parse_condition(input: Span) -> IResult<FilterCondition> {
Ok((input, condition))
}
/// exist = value EXIST
pub fn parse_exist(input: Span) -> IResult<FilterCondition> {
let (input, key) = terminated(parse_value, tag("EXIST"))(input)?;
Ok((input, FilterCondition::Condition { fid: key.into(), op: Exist }))
}
/// to = value value TO value
pub fn parse_to(input: Span) -> IResult<FilterCondition> {
let (input, (key, from, _, to)) =