From 9bc0f8b213b7ac9d14904f76d43ddcd90d3433e7 Mon Sep 17 00:00:00 2001 From: gauravgupta Date: Mon, 12 Oct 2015 17:44:44 -0400 Subject: [PATCH] Added filters to the cache key #94 --- .../jayway/jsonpath/internal/JsonReader.java | 9 +++++- .../jsonpath/internal/JsonReaderTest.java | 30 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 json-path/src/test/java/com/jayway/jsonpath/internal/JsonReaderTest.java diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/JsonReader.java b/json-path/src/main/java/com/jayway/jsonpath/internal/JsonReader.java index c6893599..9e7b9cc2 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/JsonReader.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/JsonReader.java @@ -32,11 +32,13 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.LinkedList; import java.util.List; import static com.jayway.jsonpath.JsonPath.compile; import static com.jayway.jsonpath.internal.Utils.notEmpty; import static com.jayway.jsonpath.internal.Utils.notNull; +import static java.util.Arrays.asList; public class JsonReader implements ParseContext, DocumentContext { @@ -135,7 +137,12 @@ public class JsonReader implements ParseContext, DocumentContext { public T read(String path, Predicate... filters) { notEmpty(path, "path can not be null or empty"); CacheProvider cache = configuration.CacheProvider(); - JsonPath jsonPath = cache.get(path); + + path = path.trim(); + LinkedList filterStack = new LinkedList(asList(filters)); + String cacheKey = Utils.concat(path, filterStack.toString()); + + JsonPath jsonPath = cache.get(cacheKey); if(jsonPath != null){ return read(jsonPath); }else { diff --git a/json-path/src/test/java/com/jayway/jsonpath/internal/JsonReaderTest.java b/json-path/src/test/java/com/jayway/jsonpath/internal/JsonReaderTest.java new file mode 100644 index 00000000..efecffef --- /dev/null +++ b/json-path/src/test/java/com/jayway/jsonpath/internal/JsonReaderTest.java @@ -0,0 +1,30 @@ +package com.jayway.jsonpath.internal; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.assertj.core.api.Assertions; +import org.junit.Test; + +import com.jayway.jsonpath.BaseTest; +import com.jayway.jsonpath.Criteria; +import com.jayway.jsonpath.Filter; +import com.jayway.jsonpath.JsonPath; + +public class JsonReaderTest extends BaseTest { + + @Test + public void cached_path_with_predicates() { + + Filter feq = Filter.filter(Criteria.where("category").eq("reference")); + Filter fne = Filter.filter(Criteria.where("category").ne("reference")); + + List eq = JsonPath.parse(JSON_DOCUMENT).read("$.store.book[?].category", feq); + List ne = JsonPath.parse(JSON_DOCUMENT).read("$.store.book[?].category", fne); + + Assertions.assertThat(eq).contains("reference"); + Assertions.assertThat(ne).doesNotContain("reference"); + } + +}