Bracket notation not supported inside filter expression #38

This commit is contained in:
freestrings 2020-03-09 22:56:47 +09:00
parent a6f742e3ad
commit d618e60e13
2 changed files with 49 additions and 0 deletions

View File

@ -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())));

View File

@ -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}]),
);
}