From a6f742e3ad9036a68ae0b6b09f89a077901d960e Mon Sep 17 00:00:00 2001 From: freestrings Date: Tue, 10 Mar 2020 23:22:35 +0900 Subject: [PATCH] =?UTF-8?q?=EB=8B=A4=EC=A4=91=ED=8C=A8=EC=8A=A4=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=20=EC=95=88=EB=90=98=EB=8A=94=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/select/mod.rs | 21 ++++++++++++++++++++- tests/filter.rs | 16 ++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) 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();