From d618e60e13f6c264851ae5702fb4fb14fe39f3e3 Mon Sep 17 00:00:00 2001 From: freestrings Date: Mon, 9 Mar 2020 22:56:47 +0900 Subject: [PATCH] Bracket notation not supported inside filter expression #38 --- src/select/mod.rs | 28 ++++++++++++++++++++++++++++ tests/filter.rs | 21 +++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/select/mod.rs b/src/select/mod.rs index 13266e7..b0c1c6f 100644 --- a/src/select/mod.rs +++ b/src/select/mod.rs @@ -884,6 +884,7 @@ impl<'a, 'b> Selector<'a, 'b> { self.current = Some(vec![v]); } } + fn visit_relative(&mut self) { if let Some(ParseToken::Array) = self.tokens.last() { let array_token = self.tokens.pop(); @@ -897,6 +898,18 @@ impl<'a, 'b> Selector<'a, 'b> { } fn visit_array_eof(&mut self) { + if self.is_nested_array() { + if let Some(Some(e)) = self.terms.pop() { + if let ExprTerm::String(key) = e { + self.next_in_filter_with_str(&key); + self.tokens.pop(); + return; + } + + self.terms.push(Some(e)); + } + } + if let Some(Some(e)) = self.terms.pop() { match e { ExprTerm::Number(n) => { @@ -944,6 +957,21 @@ impl<'a, 'b> Selector<'a, 'b> { } } + fn is_nested_array(&mut self) -> bool { + let mut is_nested_array = false; + + if let Some(t) = self.tokens.pop() { + if let ParseToken::Array = t { + if let Some(ParseToken::Array) = self.tokens.last() { + is_nested_array = true; + } + } + self.tokens.push(t); + } + + is_nested_array + } + fn visit_key(&mut self, key: &str) { if let Some(ParseToken::Array) = self.tokens.last() { self.terms.push(Some(ExprTerm::String(key.to_string()))); diff --git a/tests/filter.rs b/tests/filter.rs index c353231..6484144 100644 --- a/tests/filter.rs +++ b/tests/filter.rs @@ -223,4 +223,25 @@ fn bugs33_exist_right_in_all_with_and_condition() { } ]), ); +} + +#[test] +fn bugs38_array_notation_in_filter() { + setup(); + + select_and_then_compare( + "$[?(@['key']==42)]", + json!([ + {"key": 0}, + {"key": 42}, + {"key": -1}, + {"key": 41}, + {"key": 43}, + {"key": 42.0001}, + {"key": 41.9999}, + {"key": 100}, + {"some": "value"} + ]), + json!([{"key": 42}]), + ); } \ No newline at end of file