From 84e5a6145e288cad9283eee60810080e8483fb27 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Fri, 30 May 2014 01:35:19 +1200 Subject: [PATCH] Fix for #137 - transaction.setBatchFlushOnQuery(false) not working for some queries --- .../server/query/DefaultOrmQueryEngine.java | 181 +++++++++--------- 1 file changed, 88 insertions(+), 93 deletions(-) diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/DefaultOrmQueryEngine.java b/src/main/java/com/avaje/ebeaninternal/server/query/DefaultOrmQueryEngine.java index e46f92ebb..68fd69e6c 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/DefaultOrmQueryEngine.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/DefaultOrmQueryEngine.java @@ -19,112 +19,107 @@ import com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager; */ public class DefaultOrmQueryEngine implements OrmQueryEngine { - /** - * Find using predicates - */ - private final CQueryEngine queryEngine; - - /** - * Create the Finder. - */ - public DefaultOrmQueryEngine(BeanDescriptorManager descMgr, CQueryEngine queryEngine) { - - this.queryEngine = queryEngine; + /** + * Find using predicates + */ + private final CQueryEngine queryEngine; + + /** + * Create the Finder. + */ + public DefaultOrmQueryEngine(BeanDescriptorManager descMgr, CQueryEngine queryEngine) { + + this.queryEngine = queryEngine; + } + + /** + * Flushes the jdbc batch by default unless explicitly turned off on the transaction. + */ + private void flushJdbcBatchOnQuery(OrmQueryRequest request) { + + SpiTransaction t = request.getTransaction(); + if (t.isBatchFlushOnQuery()) { + // before we perform a query, we need to flush any + // previous persist requests that are queued/batched. + // The query may read data affected by those requests. + t.flushBatch(); } + } + + public int findRowCount(OrmQueryRequest request) { + + flushJdbcBatchOnQuery(request); + return queryEngine.findRowCount(request); + } + + public BeanIdList findIds(OrmQueryRequest request) { + + flushJdbcBatchOnQuery(request); + return queryEngine.findIds(request); + } + + public QueryIterator findIterate(OrmQueryRequest request) { + + // LIMITATION: You can not use QueryIterator to load bean cache + + flushJdbcBatchOnQuery(request); + return queryEngine.findIterate(request); + } + + public BeanCollection findMany(OrmQueryRequest request) { + + flushJdbcBatchOnQuery(request); + + BeanFinder finder = request.getBeanFinder(); + + BeanCollection result; + if (finder != null) { + // this bean type has its own specific finder + result = finder.findMany(request); + } else { + result = queryEngine.findMany(request); + } + + SpiQuery query = request.getQuery(); - public int findRowCount(OrmQueryRequest request){ - - return queryEngine.findRowCount(request); + if (query.isLoadBeanCache()) { + // load the individual beans into the bean cache + BeanDescriptor descriptor = request.getBeanDescriptor(); + Collection c = result.getActualDetails(); + for (T bean : c) { + descriptor.cacheBeanPutData((EntityBean) bean); + } } - public BeanIdList findIds(OrmQueryRequest request){ - - return queryEngine.findIds(request); + if (!result.isEmpty() && query.isUseQueryCache()) { + // load the query result into the query cache + request.putToQueryCache(result); } + return result; + } - public QueryIterator findIterate(OrmQueryRequest request) { + /** + * Find a single bean using its unique id. + */ + public T findId(OrmQueryRequest request) { - // LIMITATION: You can not use QueryIterator to load bean cache - - SpiTransaction t = request.getTransaction(); - - // before we perform a query, we need to flush any - // previous persist requests that are queued/batched. - // The query may read data affected by those requests. - t.flushBatch(); - - return queryEngine.findIterate(request); - } - - public BeanCollection findMany(OrmQueryRequest request) { + flushJdbcBatchOnQuery(request); - SpiQuery query = request.getQuery(); - - BeanCollection result = null; - - SpiTransaction t = request.getTransaction(); - - // before we perform a query, we need to flush any - // previous persist requests that are queued/batched. - // The query may read data affected by those requests. - t.flushBatch(); + BeanFinder finder = request.getBeanFinder(); - BeanFinder finder = request.getBeanFinder(); - if (finder != null) { - // this bean type has its own specific finder - result = finder.findMany(request); - } else { - result = queryEngine.findMany(request); - } - - if (query.isLoadBeanCache()){ - // load the individual beans into the bean cache - BeanDescriptor descriptor = request.getBeanDescriptor(); - Collection c = result.getActualDetails(); - for (T bean : c) { - descriptor.cacheBeanPutData((EntityBean)bean); - } - } - - if (!result.isEmpty() && query.isUseQueryCache()){ - // load the query result into the query cache - request.putToQueryCache(result); - } - - return result; + T result; + if (finder != null) { + result = finder.find(request); + } else { + result = queryEngine.find(request); } - - /** - * Find a single bean using its unique id. - */ - public T findId(OrmQueryRequest request) { - - T result = null; - - SpiTransaction t = request.getTransaction(); - - if (t.isBatchFlushOnQuery()){ - // before we perform a query, we need to flush any - // previous persist requests that are queued/batched. - // The query may read data affected by those requests. - t.flushBatch(); - } - - BeanFinder finder = request.getBeanFinder(); - if (finder != null) { - result = finder.find(request); - } else { - result = queryEngine.find(request); - } - - if (result != null && request.isUseBeanCache()){ - request.getBeanDescriptor().cacheBeanPutData((EntityBean)result); - } - - return result; + if (result != null && request.isUseBeanCache()) { + request.getBeanDescriptor().cacheBeanPutData((EntityBean) result); } + return result; + } }