diff --git a/src/select/mod.rs b/src/select/mod.rs index 770bcaa..122337d 100644 --- a/src/select/mod.rs +++ b/src/select/mod.rs @@ -995,28 +995,44 @@ impl<'a, 'b> NodeVisitor for Selector<'a, 'b> { .push(Some(ExprTerm::Number(Number::from_f64(*v).unwrap()))); } ParseToken::Filter(ref ft) => { - if let Some(Some(ref right)) = self.terms.pop() { - if let Some(Some(left)) = self.terms.pop() { - let mut ret = None; - match ft { - FilterToken::Equal => left.eq(right, &mut ret), - FilterToken::NotEqual => left.ne(right, &mut ret), - FilterToken::Greater => left.gt(right, &mut ret), - FilterToken::GreaterOrEqual => left.ge(right, &mut ret), - FilterToken::Little => left.lt(right, &mut ret), - FilterToken::LittleOrEqual => left.le(right, &mut ret), - FilterToken::And => left.and(right, &mut ret), - FilterToken::Or => left.or(right, &mut ret), - }; + let ref right = match self.terms.pop() { + Some(Some(right)) => right, + Some(None) => ExprTerm::Json( + None, + match &self.current { + Some(current) => current.to_vec(), + _ => unreachable!(), + }, + ), + _ => panic!("empty term right"), + }; - if let Some(e) = ret { - self.terms.push(Some(e)); - } - } else { - unreachable!() - } - } else { - unreachable!() + let left = match self.terms.pop() { + Some(Some(left)) => left, + Some(None) => ExprTerm::Json( + None, + match &self.current { + Some(current) => current.to_vec(), + _ => unreachable!(), + }, + ), + _ => panic!("empty term left"), + }; + + let mut ret = None; + match ft { + FilterToken::Equal => left.eq(right, &mut ret), + FilterToken::NotEqual => left.ne(right, &mut ret), + FilterToken::Greater => left.gt(right, &mut ret), + FilterToken::GreaterOrEqual => left.ge(right, &mut ret), + FilterToken::Little => left.lt(right, &mut ret), + FilterToken::LittleOrEqual => left.le(right, &mut ret), + FilterToken::And => left.and(right, &mut ret), + FilterToken::Or => left.or(right, &mut ret), + }; + + if let Some(e) = ret { + self.terms.push(Some(e)); } } ParseToken::Range(from, to, step) => { diff --git a/tests/filter.rs b/tests/filter.rs index 839b365..dcb0eb8 100644 --- a/tests/filter.rs +++ b/tests/filter.rs @@ -343,6 +343,22 @@ fn op_complex() { ); } +#[test] +fn op_compare() { + setup(); + + for path in [ + r#"$[?("1" == 1)]"#, + r#"$[?(1 == "1")]"#, + r#"$[?(true == 1)]"#, + r#"$[?(@ == 1)]"#, + ] + .iter() + { + select_and_then_compare(path, json!({}), json!([Value::Null])); + } +} + #[test] fn example() { setup();