From 166bcd7c45ff227f6ab62ee79ec0a6b5f50e93c8 Mon Sep 17 00:00:00 2001
From: rob bygrave
Date: Thu, 6 Jul 2017 21:51:52 +1200
Subject: [PATCH] #1061 - findCount query is not cached in L2 query cache
---
.../server/core/DefaultServer.java | 4 +++
.../server/core/OrmQueryRequest.java | 2 +-
.../server/core/SpiOrmQueryRequest.java | 2 +-
.../server/query/DefaultOrmQueryEngine.java | 6 ++++-
.../java/org/tests/cache/TestQueryCache.java | 27 +++++++++++++++++++
5 files changed, 38 insertions(+), 3 deletions(-)
diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java
index bf3692337..e86a2d4ad 100644
--- a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java
+++ b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java
@@ -1300,6 +1300,10 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
public int findCountWithCopy(Query query, Transaction t) {
SpiOrmQueryRequest request = createQueryRequest(Type.COUNT, query, t);
+ Integer result = request.getFromQueryCache();
+ if (result != null) {
+ return result;
+ }
try {
request.initTransIfRequired();
return request.findCount();
diff --git a/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java b/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java
index 093fdc2b9..6a9816297 100644
--- a/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java
+++ b/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java
@@ -546,7 +546,7 @@ public final class OrmQueryRequest extends BeanRequest implements BeanQueryRe
*
*/
public boolean isAuditReads() {
- return !query.isDisableReadAudit() && beanDescriptor.isReadAuditing();
+ return beanDescriptor.isReadAuditing() && !query.isDisableReadAudit();
}
/**
diff --git a/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java b/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java
index 978fd8bde..e00e00254 100644
--- a/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java
+++ b/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java
@@ -117,7 +117,7 @@ public interface SpiOrmQueryRequest extends DocQueryRequest {
/**
* Try to get the query result from the query cache.
*/
- Object getFromQueryCache();
+ A getFromQueryCache();
/**
* Return the Database platform like clause.
diff --git a/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java b/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java
index 5e5e3fc87..77e24aca5 100644
--- a/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java
+++ b/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java
@@ -70,7 +70,11 @@ public class DefaultOrmQueryEngine implements OrmQueryEngine {
public int findCount(OrmQueryRequest request) {
flushJdbcBatchOnQuery(request);
- return queryEngine.findCount(request);
+ int result = queryEngine.findCount(request);
+ if (request.getQuery().isUseQueryCache()) {
+ request.putToQueryCache(result);
+ }
+ return result;
}
@Override
diff --git a/src/test/java/org/tests/cache/TestQueryCache.java b/src/test/java/org/tests/cache/TestQueryCache.java
index f7a678146..d9610f67d 100644
--- a/src/test/java/org/tests/cache/TestQueryCache.java
+++ b/src/test/java/org/tests/cache/TestQueryCache.java
@@ -4,6 +4,7 @@ import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.bean.BeanCollection;
import io.ebean.cache.ServerCache;
+import org.ebeantest.LoggedSqlCollector;
import org.tests.model.basic.Customer;
import org.tests.model.basic.ResetBasicData;
import org.tests.model.cache.EColAB;
@@ -84,6 +85,32 @@ public class TestQueryCache extends BaseTestCase {
assertThat(colA_Second).isNotSameAs(colA_NotDistinct);
}
+ @Test
+ public void findCount() {
+
+ new EColAB("04", "count").save();
+ new EColAB("05", "count").save();
+
+ LoggedSqlCollector.start();
+
+ int count0 = Ebean.find(EColAB.class)
+ .setUseQueryCache(true)
+ .where()
+ .eq("columnB", "count")
+ .findCount();
+
+ int count1 = Ebean.find(EColAB.class)
+ .setUseQueryCache(true)
+ .where()
+ .eq("columnB", "count")
+ .findCount();
+
+ List sql = LoggedSqlCollector.stop();
+
+ assertThat(count0).isEqualTo(count1);
+ assertThat(sql).hasSize(1);
+ }
+
@Test
@SuppressWarnings("unchecked")
public void test() {