Browse Source

Adding STRICT_MODE OPTION to jsonpath filters

pull/941/head
Mythic 2 years ago
parent
commit
6202f6b92b
  1. 27
      json-path/src/main/java/com/jayway/jsonpath/Option.java
  2. 4
      json-path/src/main/java/com/jayway/jsonpath/internal/filter/RelationalExpressionNode.java
  3. 4
      json-path/src/test/java/com/jayway/jsonpath/BaseTest.java
  4. 24
      json-path/src/test/java/com/jayway/jsonpath/old/FilterTest.java

27
json-path/src/main/java/com/jayway/jsonpath/Option.java

@ -83,6 +83,31 @@ public enum Option {
* If REQUIRE_PROPERTIES option is present PathNotFoundException is thrown.
* If REQUIRE_PROPERTIES option is not present ["b-val"] is returned.
*/
REQUIRE_PROPERTIES
REQUIRE_PROPERTIES,
/**
* Configures JsonPath to require all properties defined in filters.
*
*
* Given:
*
* <pre>
* [
* {
* "a" : "a-val",
* "b" : "b-val"
* },
* {
* "a" : "a-val",
* }
* ]
* </pre>
*
* evaluating the filter "[?(@['does_not_exist'] NIN ['1', '2'])]"
*
* If STRICT_MODE option is present, filter will evaluate to false.
* If STRICT_MODE option is not present, filter will evaluate to true.
*/
STRICT_MODE
}

4
json-path/src/main/java/com/jayway/jsonpath/internal/filter/RelationalExpressionNode.java

@ -1,5 +1,6 @@
package com.jayway.jsonpath.internal.filter;
import com.jayway.jsonpath.Option;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -39,6 +40,9 @@ public class RelationalExpressionNode extends ExpressionNode {
if(right.isPathNode()){
r = right.asPathNode().evaluate(ctx);
}
if (ctx.configuration().containsOption(Option.STRICT_MODE) && (l.isUndefinedNode() || r.isUndefinedNode())) {
return false;
}
Evaluator evaluator = EvaluatorFactory.createEvaluator(relationalOperator);
if(evaluator != null){
return evaluator.evaluate(l, r, ctx);

4
json-path/src/test/java/com/jayway/jsonpath/BaseTest.java

@ -153,8 +153,8 @@ public class BaseTest {
" \"expensive\": 10\n" +
"}";
public Predicate.PredicateContext createPredicateContext(final Object check) {
public Predicate.PredicateContext createPredicateContext(final Object check, Option... options) {
return new PredicateContextImpl(check, check, Configuration.defaultConfiguration(), new HashMap<Path, Object>());
return new PredicateContextImpl(check, check, Configuration.defaultConfiguration().setOptions(options), new HashMap<Path, Object>());
}
}

24
json-path/src/test/java/com/jayway/jsonpath/old/FilterTest.java

@ -1,10 +1,6 @@
package com.jayway.jsonpath.old;
import com.jayway.jsonpath.BaseTest;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.Filter;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.Predicate;
import com.jayway.jsonpath.*;
import com.jayway.jsonpath.spi.json.JsonProvider;
import org.assertj.core.api.Assertions;
import org.junit.Test;
@ -160,14 +156,16 @@ public class FilterTest extends BaseTest {
check.put("item", 3);
check.put("null_item", null);
assertTrue(filter(where("item").nin(4, 5)).apply(createPredicateContext(check)));
assertTrue(filter(where("item").nin(asList(4, 5))).apply(createPredicateContext(check)));
assertTrue(filter(where("item").nin(asList('A'))).apply(createPredicateContext(check)));
assertTrue(filter(where("null_item").nin(1, 2, 3)).apply(createPredicateContext(check)));
assertTrue(filter(where("item").nin(asList((Object) null))).apply(createPredicateContext(check)));
assertFalse(filter(where("item").nin(3)).apply(createPredicateContext(check)));
assertFalse(filter(where("item").nin(asList(3))).apply(createPredicateContext(check)));
// assertTrue(filter(where("item").nin(4, 5)).apply(createPredicateContext(check)));
// assertTrue(filter(where("item").nin(asList(4, 5))).apply(createPredicateContext(check)));
// assertTrue(filter(where("item").nin(asList('A'))).apply(createPredicateContext(check)));
// assertTrue(filter(where("null_item").nin(1, 2, 3)).apply(createPredicateContext(check)));
// assertTrue(filter(where("item").nin(asList((Object) null))).apply(createPredicateContext(check)));
//
// assertFalse(filter(where("item").nin(3)).apply(createPredicateContext(check)));
// assertFalse(filter(where("item").nin(asList(3))).apply(createPredicateContext(check)));
assertFalse(filter(where("not_existent_item").nin(3)).apply(createPredicateContext(check, Option.STRICT_MODE)));
assertFalse(filter(where("not_existent_item").nin(asList(3))).apply(createPredicateContext(check, Option.STRICT_MODE)));
}
@Test

Loading…
Cancel
Save