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() {