diff --git a/src/main/java/com/redislabs/redisgraph/Statistics.java b/src/main/java/com/redislabs/redisgraph/Statistics.java index 7c8f286..9d7453f 100644 --- a/src/main/java/com/redislabs/redisgraph/Statistics.java +++ b/src/main/java/com/redislabs/redisgraph/Statistics.java @@ -15,6 +15,7 @@ enum Label{ RELATIONSHIPS_DELETED("Relationships deleted"), PROPERTIES_SET("Properties set"), RELATIONSHIPS_CREATED("Relationships created"), + CACHED_EXECUTION("Cached execution"), QUERY_INTERNAL_EXECUTION_TIME("Query internal execution time"); private final String text; @@ -65,4 +66,6 @@ public static Label getEnum(String value) { int relationshipsCreated(); int propertiesSet(); + + boolean cachedExecution(); } diff --git a/src/main/java/com/redislabs/redisgraph/impl/resultset/StatisticsImpl.java b/src/main/java/com/redislabs/redisgraph/impl/resultset/StatisticsImpl.java index 064bb1c..727ec53 100644 --- a/src/main/java/com/redislabs/redisgraph/impl/resultset/StatisticsImpl.java +++ b/src/main/java/com/redislabs/redisgraph/impl/resultset/StatisticsImpl.java @@ -132,6 +132,15 @@ public int propertiesSet() { return getIntValue(Label.PROPERTIES_SET); } + /** + * + * @return The execution plan was cached on RedisGraph. + */ + @Override + public boolean cachedExecution() { + return getIntValue(Label.CACHED_EXECUTION) == 1; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/test/java/com/redislabs/redisgraph/RedisGraphAPITest.java b/src/test/java/com/redislabs/redisgraph/RedisGraphAPITest.java index 48c0f03..e3e97ce 100644 --- a/src/test/java/com/redislabs/redisgraph/RedisGraphAPITest.java +++ b/src/test/java/com/redislabs/redisgraph/RedisGraphAPITest.java @@ -642,7 +642,6 @@ public void testContextedAPI() { "r.place, r.since, r.doubleValue, r.boolValue, r.nullValue"); Assert.assertNotNull(resultSet); - Assert.assertEquals(0, resultSet.getStatistics().nodesCreated()); Assert.assertEquals(0, resultSet.getStatistics().nodesDeleted()); Assert.assertEquals(0, resultSet.getStatistics().labelsAdded()); @@ -651,7 +650,6 @@ public void testContextedAPI() { Assert.assertEquals(0, resultSet.getStatistics().relationshipsDeleted()); Assert.assertNotNull(resultSet.getStatistics().getStringValue(Label.QUERY_INTERNAL_EXECUTION_TIME)); - Assert.assertEquals(1, resultSet.size()); Assert.assertTrue(resultSet.hasNext()); Record record = resultSet.next(); @@ -947,11 +945,35 @@ record = resultSet.next(); @Test public void test64bitnumber(){ long value = 1 << 40; - Map params = new HashMap(); + Map params = new HashMap<>(); params.put("val", value); ResultSet resultSet = api.query("social","CREATE (n {val:$val}) RETURN n.val", params); Assert.assertEquals(1, resultSet.size()); Record r = resultSet.next(); Assert.assertEquals(Long.valueOf(value), r.getValue(0)); } + + @Test + public void testCachedExecution() { + api.query("social", "CREATE (:N {val:1}), (:N {val:2})"); + + // First time should not be loaded from execution cache + Map params = new HashMap<>(); + params.put("val", 1L); + ResultSet resultSet = api.query("social","MATCH (n:N {val:$val}) RETURN n.val", params); + Assert.assertEquals(1, resultSet.size()); + Record r = resultSet.next(); + Assert.assertEquals(params.get("val"), r.getValue(0)); + Assert.assertFalse(resultSet.getStatistics().cachedExecution()); + + // Run in loop many times to make sure the query will be loaded + // from cache at least once + for (int i = 0 ; i < 64; i++){ + resultSet = api.query("social","MATCH (n:N {val:$val}) RETURN n.val", params); + } + Assert.assertEquals(1, resultSet.size()); + r = resultSet.next(); + Assert.assertEquals(params.get("val"), r.getValue(0)); + Assert.assertTrue(resultSet.getStatistics().cachedExecution()); + } }