#1060 - findSingleAttributeList doesn't store result in L2 query cache

This commit is contained in:
rob bygrave
2017-07-06 21:35:20 +12:00
parent 7a697c12af
commit 95aed6af54
7 changed files with 74 additions and 30 deletions
@@ -96,7 +96,7 @@ public final class OrmQueryRequest<T> extends BeanRequest implements BeanQueryRe
public String getDBLikeClause() {
return ebeanServer.getDatabasePlatform().getLikeClause();
}
/**
* Return the database platform escaped like string.
*/
@@ -461,7 +461,8 @@ public final class OrmQueryRequest<T> extends BeanRequest implements BeanQueryRe
* Try to get the query result from the query cache.
*/
@Override
public BeanCollection<T> getFromQueryCache() {
@SuppressWarnings("unchecked")
public Object getFromQueryCache() {
if (!query.isUseQueryCache()) {
return null;
@@ -469,16 +470,18 @@ public final class OrmQueryRequest<T> extends BeanRequest implements BeanQueryRe
cacheKey = query.queryHash();
BeanCollection<T> cached = beanDescriptor.queryCacheGet(cacheKey);
Object cached = beanDescriptor.queryCacheGet(cacheKey);
if (cached != null && isAuditReads() && readAuditQueryType()) {
// raw sql can't use L2 cache so normal queries only in here
Collection<T> actualDetails = cached.getActualDetails();
List<Object> ids = new ArrayList<>(actualDetails.size());
for (T bean : actualDetails) {
ids.add(beanDescriptor.getIdForJson(bean));
if (cached instanceof BeanCollection) {
// raw sql can't use L2 cache so normal queries only in here
Collection<T> actualDetails = ((BeanCollection<T>)cached).getActualDetails();
List<Object> ids = new ArrayList<>(actualDetails.size());
for (T bean : actualDetails) {
ids.add(beanDescriptor.getIdForJson(bean));
}
beanDescriptor.readAuditMany(queryPlanKey.getPartialKey(), "l2-query-cache", ids);
}
beanDescriptor.readAuditMany(queryPlanKey.getPartialKey(), "l2-query-cache", ids);
}
return cached;
@@ -502,7 +505,7 @@ public final class OrmQueryRequest<T> extends BeanRequest implements BeanQueryRe
}
}
public void putToQueryCache(BeanCollection<T> queryResult) {
public void putToQueryCache(Object queryResult) {
beanDescriptor.queryCachePut(cacheKey, queryResult);
}
@@ -117,13 +117,13 @@ public interface SpiOrmQueryRequest<T> extends DocQueryRequest<T> {
/**
* Try to get the query result from the query cache.
*/
BeanCollection<T> getFromQueryCache();
Object getFromQueryCache();
/**
* Return the Database platform like clause.
*/
String getDBLikeClause();
/**
* Escapes a string to use it as exact match in Like clause.
*/
@@ -1163,15 +1163,15 @@ public class BeanDescriptor<T> implements MetaBeanInfo, BeanType<T> {
/**
* Get a query result from the query cache.
*/
public BeanCollection<T> queryCacheGet(Object id) {
public Object queryCacheGet(Object id) {
return cacheHelp.queryCacheGet(id);
}
/**
* Put a query result into the query cache.
*/
public void queryCachePut(Object id, BeanCollection<T> query) {
cacheHelp.queryCachePut(id, query);
public void queryCachePut(Object id, Object queryResult) {
cacheHelp.queryCachePut(id, queryResult);
}
/**
@@ -183,33 +183,32 @@ final class BeanDescriptorCacheHelp<T> {
/**
* Get a query result from the query cache.
*/
@SuppressWarnings("unchecked")
BeanCollection<T> queryCacheGet(Object id) {
Object queryCacheGet(Object id) {
if (queryCache == null) {
throw new IllegalStateException("No query cache enabled on " + desc + ". Need explicit @Cache(enableQueryCache=true)");
}
BeanCollection<T> list = (BeanCollection<T>) queryCache.get(id);
Object queryResult = queryCache.get(id);
if (queryLog.isDebugEnabled()) {
if (list == null) {
if (queryResult == null) {
queryLog.debug(" GET {}({}) - cache miss", cacheName, id);
} else {
queryLog.debug(" GET {}({}) - hit", cacheName, id);
}
}
return list;
return queryResult;
}
/**
* Put a query result into the query cache.
*/
void queryCachePut(Object id, BeanCollection<T> query) {
void queryCachePut(Object id, Object queryResult) {
if (queryCache == null) {
throw new IllegalStateException("No query cache enabled on " + desc + ". Need explicit @Cache(enableQueryCache=true)");
}
if (queryLog.isDebugEnabled()) {
queryLog.debug(" PUT {}({})", cacheName, id);
}
queryCache.put(id, query);
queryCache.put(id, queryResult);
}
@@ -83,7 +83,12 @@ public class DefaultOrmQueryEngine implements OrmQueryEngine {
@Override
public <A> List<A> findSingleAttributeList(OrmQueryRequest<?> request) {
flushJdbcBatchOnQuery(request);
return queryEngine.findSingleAttributeList(request);
List<A> result = queryEngine.findSingleAttributeList(request);
if (!result.isEmpty() && request.getQuery().isUseQueryCache()) {
// load the query result into the query cache
request.putToQueryCache(result);
}
return result;
}
@Override