diff --git a/src/select/mod.rs b/src/select/mod.rs index 142b973..13266e7 100644 --- a/src/select/mod.rs +++ b/src/select/mod.rs @@ -286,7 +286,26 @@ impl<'a> ExprTerm<'a> { if ret.is_empty() { ExprTerm::Bool(cmp_fn.default()) } else if let Some(rel) = rel { - ExprTerm::Json(Some(rel.to_vec()), None, ret) + if let ExprTerm::Json(_, _, _) = &other { + ExprTerm::Json(Some(rel.to_vec()), None, ret) + } else { + let mut tmp = Vec::new(); + for rel_value in rel { + match rel_value { + Value::Object(map) => { + for map_value in map.values() { + for result_value in &ret { + if map_value.eq(*result_value) { + tmp.push(*rel_value); + } + } + } + } + _ => {} + } + } + ExprTerm::Json(Some(tmp), None, ret) + } } else { ExprTerm::Json(None, None, ret) } diff --git a/tests/filter.rs b/tests/filter.rs index 249350f..c353231 100644 --- a/tests/filter.rs +++ b/tests/filter.rs @@ -126,6 +126,22 @@ fn filter_parent_exist_child() { ); } +#[test] +fn filter_parent_paths() { + setup(); + + select_and_then_compare( + "$[?(@.key.subKey == 'subKey2')]", + json!([ + {"key": {"seq": 1, "subKey": "subKey1"}}, + {"key": {"seq": 2, "subKey": "subKey2"}}, + {"key": 42}, + {"some": "value"} + ]), + json!([{"key": {"seq": 2, "subKey": "subKey2"}}]), + ); +} + #[test] fn bugs33_exist_in_all() { setup();