Empty result for filter expression returns array of null #39

This commit is contained in:
freestrings 2020-03-21 15:50:19 +09:00
parent ec92c95a69
commit 74e79e6330
3 changed files with 29 additions and 22 deletions

View File

@ -220,7 +220,7 @@ impl<'a> FilterTerms<'a> {
if tmp.is_empty() { if tmp.is_empty() {
self.0.pop(); self.0.pop();
return Some(vec![&Value::Null]); return Some(vec![]);
} else { } else {
return Some(tmp); return Some(tmp);
} }
@ -275,7 +275,7 @@ impl<'a> FilterTerms<'a> {
if tmp.is_empty() { if tmp.is_empty() {
self.0.pop(); self.0.pop();
return Some(vec![&Value::Null]); return Some(vec![]);
} else { } else {
return Some(tmp); return Some(tmp);
} }
@ -530,7 +530,7 @@ impl<'a, 'b> Selector<'a, 'b> {
} }
ExprTerm::Json(rel, _, v) => { ExprTerm::Json(rel, _, v) => {
if v.is_empty() { if v.is_empty() {
self.current = Some(vec![&Value::Null]); self.current = Some(vec![]);
} else if let Some(vec) = rel { } else if let Some(vec) = rel {
self.current = Some(vec); self.current = Some(vec);
} else { } else {
@ -538,7 +538,7 @@ impl<'a, 'b> Selector<'a, 'b> {
} }
} }
ExprTerm::Bool(false) => { ExprTerm::Bool(false) => {
self.current = Some(vec![&Value::Null]); self.current = Some(vec![]);
} }
_ => {} _ => {}
} }

View File

@ -1,8 +1,6 @@
#[macro_use] #[macro_use]
extern crate serde_json; extern crate serde_json;
use serde_json::Value;
use common::{read_json, select_and_then_compare, setup}; use common::{read_json, select_and_then_compare, setup};
mod common; mod common;
@ -58,7 +56,7 @@ fn op_object_and_or() {
select_and_then_compare( select_and_then_compare(
"$.friends[?( (@.id >= 2 || @.id == 1) && @.id == 0)]", "$.friends[?( (@.id >= 2 || @.id == 1) && @.id == 0)]",
read_json("./benchmark/data_obj.json"), read_json("./benchmark/data_obj.json"),
json!([Value::Null]), json!([]),
); );
} }
@ -202,7 +200,7 @@ fn op_lt_for_string_value() {
setup(); setup();
select_and_then_compare( select_and_then_compare(
r#"$.[?(@.a < "b")]"#, json!({ "a": "b" }), json!([Value::Null]), r#"$.[?(@.a < "b")]"#, json!({ "a": "b" }), json!([]),
); );
} }
@ -220,7 +218,7 @@ fn op_gt_for_string_value() {
setup(); setup();
select_and_then_compare( select_and_then_compare(
r#"$.[?(@.a > "b")]"#, json!({ "a": "b" }), json!([Value::Null]), r#"$.[?(@.a > "b")]"#, json!({ "a": "b" }), json!([]),
); );
} }
@ -251,7 +249,7 @@ fn op_ne_for_object_value() {
select_and_then_compare( select_and_then_compare(
r#"$.[?(@.a != @.c)]"#, r#"$.[?(@.a != @.c)]"#,
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}), json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
json!([Value::Null]), json!([]),
); );
} }
@ -262,7 +260,7 @@ fn op_lt_for_object_value() {
select_and_then_compare( select_and_then_compare(
r#"$.[?(@.a < @.c)]"#, r#"$.[?(@.a < @.c)]"#,
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}), json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
json!([Value::Null]), json!([]),
); );
} }
@ -273,7 +271,7 @@ fn op_le_for_object_value() {
select_and_then_compare( select_and_then_compare(
r#"$.[?(@.a <= @.c)]"#, r#"$.[?(@.a <= @.c)]"#,
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}), json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
json!([Value::Null]), json!([]),
); );
} }
@ -284,7 +282,7 @@ fn op_gt_for_object_value() {
select_and_then_compare( select_and_then_compare(
r#"$.[?(@.a > @.c)]"#, r#"$.[?(@.a > @.c)]"#,
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}), json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
json!([Value::Null]), json!([]),
); );
} }
@ -295,7 +293,7 @@ fn op_ge_for_object_value() {
select_and_then_compare( select_and_then_compare(
r#"$.[?(@.a >= @.c)]"#, r#"$.[?(@.a >= @.c)]"#,
json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}), json!({"a": { "1": 1 }, "b": { "2": 2 }, "c": { "1": 1 }}),
json!([Value::Null]), json!([]),
); );
} }
@ -306,7 +304,7 @@ fn op_eq_for_complex_value() {
select_and_then_compare( select_and_then_compare(
r#"$.[?(1 == @.a)]"#, r#"$.[?(1 == @.a)]"#,
json!({ "a": { "b": 1 } }), json!({ "a": { "b": 1 } }),
json!([Value::Null]), json!([]),
); );
} }
@ -317,7 +315,7 @@ fn op_ne_for_complex_value() {
select_and_then_compare( select_and_then_compare(
r#"$.[?("1" != @.a)]"#, r#"$.[?("1" != @.a)]"#,
json!({ "a": { "b": 1 } }), json!({ "a": { "b": 1 } }),
json!([Value::Null]), json!([]),
); );
} }
@ -328,7 +326,7 @@ fn op_le_for_complex_value() {
select_and_then_compare( select_and_then_compare(
r#"$.[?(@.a <= 1)]"#, r#"$.[?(@.a <= 1)]"#,
json!({ "a": { "b": 1 } }), json!({ "a": { "b": 1 } }),
json!([Value::Null]), json!([]),
); );
} }
@ -339,7 +337,7 @@ fn op_gt_for_complex_value() {
select_and_then_compare( select_and_then_compare(
r#"$.[?(@.a > "1")]"#, r#"$.[?(@.a > "1")]"#,
json!({ "a": { "b": 1 } }), json!({ "a": { "b": 1 } }),
json!([Value::Null]), json!([]),
); );
} }
@ -355,7 +353,7 @@ fn op_compare_different_types() {
] ]
.iter() .iter()
{ {
select_and_then_compare(path, json!({}), json!([Value::Null])); select_and_then_compare(path, json!({}), json!([]));
} }
} }

View File

@ -1,8 +1,6 @@
#[macro_use] #[macro_use]
extern crate serde_json; extern crate serde_json;
use serde_json::Value;
use common::{read_json, select_and_then_compare, setup}; use common::{read_json, select_and_then_compare, setup};
mod common; mod common;
@ -62,7 +60,7 @@ fn return_type_for_child_object_not_matched() {
select_and_then_compare( select_and_then_compare(
"$.school[?(@.friends[10])]", "$.school[?(@.friends[10])]",
read_json("./benchmark/data_obj.json"), read_json("./benchmark/data_obj.json"),
json!([Value::Null]), json!([]),
); );
} }
@ -96,4 +94,15 @@ fn return_type_for_array_filter_true() {
{"id": 2, "name": "Gray Berry"} {"id": 2, "name": "Gray Berry"}
]]), ]]),
); );
}
#[test]
fn return_type_empty() {
setup();
select_and_then_compare(
"$[?(@.key==43)]",
json!([{"key": 42}]),
json!([]),
);
} }